我可以使用自动编码器进行聚类吗?

Can I use autoencoder for clustering?

在下面的代码中,他们使用自动编码器作为监督聚类或分类,因为他们有数据标签。 http://amunategui.github.io/anomaly-detection-h2o/ 但是,如果我没有标签,我可以使用自动编码器对数据进行聚类吗? 此致

深度学习自动编码器始终是无监督学习。您 link 阅读的文章的 "supervised" 部分是评估它的表现。

以下示例(取自我的书《使用 H2O 进行实用机器学习》的第 7 章,我在同一数据集上尝试所有 H2O 无监督算法 - 请原谅插件)采用 563 个特征,并尝试将它们编码为两个隐藏节点。

m <- h2o.deeplearning(
  2:564, training_frame = tfidf,
  hidden = c(2), auto-encoder = T, activation = "Tanh"
  )
f <- h2o.deepfeatures(m, tfidf, layer = 1)

那里的第二个命令提取隐藏节点权重。 f 是一个数据框,有两个数字列,tfidf 源数据中的每一行对应一行。我只选择了两个隐藏节点,以便绘制集群:

每个 运行 的结果都会发生变化。您可以(也许)使用堆叠自动编码器或使用更多隐藏节点(但您无法绘制它们)获得更好的结果。在这里我感觉结果受限于数据。

顺便说一句,我用这段代码做了上面的情节:

d <- as.matrix(f[1:30,]) #Just first 30, to avoid over-cluttering
labels <- as.vector(tfidf[1:30, 1])
plot(d, pch = 17) #Triangle
text(d, labels, pos = 3) #pos=3 means above

(P.S。原始数据来自Brandon Rose's excellent article on using NLTK。)

在某些方面,编码数据和聚类数据共享一些重叠的理论。因此,您可以使用自动编码器对数据进行聚类(编码)。

一个简单的可视化示例是,如果您有一组训练数据,您怀疑它有两个主要 classes。例如共和党人和民主党人的选民历史数据。如果您采用自动编码器并将其编码为二维,然后将其绘制在散点图上,则此聚类会变得更加清晰。下面是我的一个模型的示例结果。您可以看到两个 classes 之间明显的分裂以及一些预期的重叠。

可以找到代码here

此方法不仅需要两个二进制 classes,您还可以根据需要训练任意多个不同的 classes。两个极化 classes 更容易可视化。

此方法不限于两个输出维度,那只是为了绘图方便。事实上,您可能会发现很难将某些大维度 space 有意义地映射到如此小的 space.

在编码(集群)层维度较大的情况下,"visualize" 特征集群不那么清晰。这是它变得有点困难的地方,因为您必须使用某种形式的监督学习将编码(集群)特征映射到您的训练标签。

确定 class 特征所属的几种方法是将数据泵入 knn 聚类算法。或者,我更喜欢做的是获取编码向量并将它们传递给标准的反向误差传播神经网络。请注意,根据您的数据,您可能会发现直接将数据泵入反向传播神经网络就足够了。