我想研究一个有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-学习执行集群。
>>> model = AgglomerativeClustering(n_clusters=40, affinity='precomputed', linkage='complete')
>>> cluster_label = model.fit_predict(distance_matrix_2d)如何利用这个模型来预测未来的观测?
实际上,AgglomerativeClustering没有一个predict方法,它太长了,无法再次计算16230 x (47532 + 1)的距离。
能计算出新观测和所有预先计算的簇之间的距离吗?
实际上,在我的例子中,使用pdist的n x n将计算距离,我想要计算从一个观察到的距离( o vs n samples o x n )。
谢谢你的高调
发布于 2020-11-01 18:10:52
答案很简单:你不能。分层聚类并不是为了预测新观测的聚类标签。之所以会发生这种情况,是因为它只是根据数据点的距离链接数据点,而不是为每个集群定义“区域”。
在这一阶段,我相信有两种解决办法:
KMeans可能是一个很好的选择,因为它可以显式地为最近的集群分配新的数据点。https://stackoverflow.com/questions/64589016
复制相似问题