在R中使用autoencoder后如何获取簇的标签

在R中使用autoencoder后如何获取簇的标签,r,deep-learning,cluster-analysis,h2o,autoencoder,R,Deep Learning,Cluster Analysis,H2o,Autoencoder,我是机器学习的初学者。我正在使用R(h2o包)中的自动编码器进行集群。目前,我已经完成了以下代码: `mydata = h2o.importFile(path = mfile) NN_model = h2o.deeplearning( x = 2:9, training_frame = mydata, hidden = c(2), epochs = 100, activation = "Tanh", autoencoder = TRUE ) train_supervi

我是机器学习的初学者。我正在使用R(h2o包)中的自动编码器进行集群。目前,我已经完成了以下代码:

`mydata = h2o.importFile(path = mfile)

NN_model = h2o.deeplearning(
  x = 2:9,
  training_frame = mydata,
  hidden = c(2),
  epochs = 100,
  activation = "Tanh",
  autoencoder = TRUE
)

train_supervised_features = h2o.deepfeatures(NN_model, mydata, layer=1)`
对于我的数据,没有太多的列(正如您在代码中看到的,现在只有8个变量),但是有很多行

然后,我在上面获得的“train_监督的_特征”中绘制这两个节点。我得到了这样的情节 很明显,我的数据有8个集群(对吗?)


我的问题是,如何从自动编码器结果中提取标签?我想将标签添加到原始数据中,并使用这些标签以颜色打印,如下所示:

由于autoencoder对“集群”没有任何概念,因此必须首先在2D数据集上调用h2o.kmeans(),以获得集群分配。然后,您可以使用该k-means模型,使用h2o.predict(模型,2Ddata)对数据集进行评分,您将为每一行获得一个聚类标签。

基本上,AE可以是一个很好的DNN,用于重新构建输入,但是,您可以使用潜在层进行聚类

重要步骤包括:

1-对于初始化集群分配,您可以对数据应用简单的k-均值并标记它们

2-培训您的AE以学习功能

3-尝试提取潜在层之前的层的输出,其中包括数据的训练空间

4-使用k-均值聚类数据

我希望有帮助

以下是我在Keras中提供的一个示例:

library(keras)
library(caret)
library(tidyverse)

c(c(xtrain, ytrain), c(xtest, ytest)) %<-% dataset_mnist()
xtrain = xtrain/255
xtest = xtest/255 

input_size = dim(xtrain)[2]*dim(xtrain)[3]
latent_size = 10
print(input_size) 

x_train = array_reshape(xtrain, dim=c(dim(xtrain)[1], input_size))
x_test = array_reshape(xtest, dim=c(dim(xtest)[1], input_size))

x <- rbind( x_test, x_train )/255.0

# Encoder
encoder_input = layer_input(shape = input_size)
encoder_output = encoder_input %>% 
  layer_dense(units=256, activation = "relu") %>% 
  layer_activation_leaky_relu() %>% 
  layer_dense(units=latent_size) %>% 
  layer_activation_leaky_relu()

encoderoder = keras_model(encoder_input, encoder_output)
summary(encoderoder) 

# Decoder
decoder_input = layer_input(shape = latent_size)
decoder_output = decoder_input %>% 
  layer_dense(units=256, activation = "relu") %>% 
  layer_activation_leaky_relu() %>% 
  layer_dense(units = input_size, activation = "relu") %>% 
  layer_activation_leaky_relu()

decoderoder = keras_model(decoder_input, decoder_output)
summary(decoderoder) 

# Autoencoder
autoencoderoder_input = layer_input(shape = input_size)
autoencoderoder_output = autoencoderoder_input %>% 
  encoderoder() %>% 
  decoderoder()

autoencoderoder = keras_model(autoencoderoder_input, autoencoderoder_output)
summary(autoencoderoder)

autoencoderoder %>% compile(optimizer="rmsprop", loss="binary_crossentropy")
autoencoderoder %>% fit(x_train,x_train, epochs=20, batch_size=256) 

encoderoded_imgs = encoderoder %>% predict(x_test)
decoderoded_imgs = decoderoder %>% predict(encoderoded_imgs)

# Images plot
pred_images = array_reshape(decoderoded_imgs, dim=c(dim(decoderoded_imgs)[1], 28, 28)) 

n = 10
op = par(mfrow=c(12,2), mar=c(1,0,0,0))
for (i in 1:n) 
{
  plot(as.raster(pred_images[i,,]))
  plot(as.raster(xtest[i,,]))
}


# Saving trained Net
autoencoderoder_weights <- autoencoderoder %>%
  keras::get_weights()
keras::save_model_weights_hdf5(object = autoencoderoder,filepath = '..../autoencoderoder_weights.hdf5',overwrite = TRUE)

encoderoder_model <- keras_model(inputs = encoder_input, outputs = encoderoder$output)
encoderoder_model %>% keras::load_model_weights_hdf5(filepath = "..../autoencoderoder_weights.hdf5",skip_mismatch = TRUE,by_name = TRUE)

encoderoder_model %>% compile(
  loss='mean_squared_error',
  optimizer='adam',
  metrics = c('accuracy')
)
embeded_points <- 
  encoderoder_model %>% 
  keras::predict_on_batch(x = x_train)

summary(encoderoder_model)

# Getting layer
layer_name<-"dense_1"
intermediate_layer_model <- keras_model(inputs = encoderoder_model$input, outputs = get_layer(encoderoder_model, layer_name)$output)
intermediate_output <- predict(intermediate_layer_model, x)

# Clustering latent space
km <- stats::kmeans( intermediate_output, centers = 10L, nstart = 20L )
labPrediction <- km$cluster 

plot(labPrediction)
# The End
库(keras)
图书馆(插入符号)
图书馆(tidyverse)
c(c(xtrain,ytrain),c(xtest,ytest))%
层_激活_泄漏_relu()%>%
层密度(单位=潜在尺寸)%>%
层\u激活\u泄漏\u relu()
编码器=keras_型号(编码器_输入,编码器_输出)
摘要(编码棒)
#译码器
解码器输入=层输入(形状=潜在大小)
解码器\输出=解码器\输入%>%
层密度(单位=256,activation=“relu”)%>%
层_激活_泄漏_relu()%>%
层密度(单位=输入大小,激活=“relu”)%>%
层\u激活\u泄漏\u relu()
decoderoder=keras_模型(解码器输入,解码器输出)
摘要(译码器)
#自动编码器
自动编码器输入=图层输入(形状=输入大小)
自动编码器输出=自动编码器输入%>%
编码器()%>%
译码器()
自动编码器=keras_型号(自动编码器_输入,自动编码器_输出)
摘要(自动编码器)
自动编码器%>%编译(optimizer=“rmsprop”,loss=“binary\u crossentropy”)
自动编码器%>%适合(x列,x列,历元=20,批量大小=256)
Encoderode_imgs=编码器%>%预测(x_测试)
解码的\u imgs=解码者%>%预测(编码的\u imgs)
#图像绘图
预处理图像=阵列整形(解码图像,尺寸=c(尺寸(解码图像)[1],28,28))
n=10
op=par(mfrow=c(12,2),mar=c(1,0,0,0))
for(1:n中的i)
{
绘图(如光栅(pred_图像[i,,]))
绘图(如光栅(xtest[i,,]))
}
#拯救训练有素的网络
自动编码器控制器重量%
keras::获取权重()
keras::save_model_weights_hdf5(object=autoencoderoder,filepath='../autoencoderoder_weights.hdf5',overwrite=TRUE)
编码器模型%keras::加载模型权重hdf5(filepath=“../autoencoderoder\u weights.hdf5”,跳过不匹配=TRUE,按名称=TRUE)
编码器\u型号%>%编译(
损失=‘均方误差’,
优化器='adam',
指标=c(‘准确度’)
)
嵌入分数%
keras::批量预测(x=x列)
摘要(编码器和Roder_型号)
#获取层

谢谢你,阿诺!但我想知道autoencoder做什么?如上图所示,如果这是我从autoencoder hidden layer(2个节点)中得到的结果,那么这是否意味着我的数据实际上有一些明显的聚类(如上图所示,它显示了6-8个聚类)?是的,聚类似乎有助于获得良好的降维效果。然而,集群分配只存在于你的头脑中。没有从自动编码器AFAIK自动获取群集ID的方法,您还必须运行群集算法。因此,在应用AE并获取2D特征(如第一个绘图)后,我是否可以将群集技术(如k-means)应用于2D特征以获取其群集/标签,并将这些标签直接用于原始数据?谢谢