微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

如何使用分层聚类预测新观测的聚类标签?

如何解决如何使用分层聚类预测新观测的聚类标签?

我想研究具有16230个特征的47532个个体。因此,我创建了一个具有16230行和47532列的矩阵

>>> import scipy.cluster.hierarchy as hcluster
>>> from scipy.spatial import distance
>>> import sklearn.cluster import AgglomerativeClustering
>>> matrix.shape
(16230,47532)
# remove all duplicate vectors in order to not waste computation time
>>> uniq_vectors,row_index = np.unique(matrix,return_index=True,axis=0)
>>> uniq_vectors.shape
(22957,16230)
# compute distance between each observations
>>> distance_matrix = distance.pdist(uniq_vectors,metric='jaccard')
>>> distance_matrix_2d = distance.squareform(distance_matrix,force='tomatrix')
>>> distance_matrix_2d.shape
(22957,22957)
# Perform linkage
>>> linkage = hcluster.linkage(distance_matrix,method='complete')

所以现在我可以使用scikit-learn进行聚类

>>> model = AgglomerativeClustering(n_clusters=40,affinity='precomputed',linkage='complete')
>>> cluster_label = model.fit_predict(distance_matrix_2d)

如何使用此模型预测未来的观测?

实际上AgglomerativeClustering不拥有predict方法,重新计算16230 x (47532 + 1)的距离太长了

是否可以计算新观测值与所有预先计算的聚类之间的距离?

实际上是从scipy中使用pdist来计算距离n x n在我的情况下,我想根据一个观测值on样本{{1 }}

感谢您的关注

解决方法

答案很简单:您不能。分层聚类不是为了预测新观测值的聚类标签而设计的。发生这种情况的原因是,它只是根据数据点的距离进行链接,而没有为每个群集定义“区域”。

我相信现阶段有两种解决方案:

  • 对于新的数据点,请在数据集中找到最近的观测值(使用与训练期间相同的距离功能),并分配相同的聚类标签。这需要更多的编码,显然,这有点麻烦。但是请记住,结果可能没有多大意义,因为您将使用与训练过程不同的方法来推断聚类标签。
  • 使用另一种聚类算法!当您的用例与模型不匹配时,您似乎正在使用层次集群。 KMeans是一个不错的选择,因为它可以明确地将新的数据点分配给最近的群集。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。