python-3.x - 如何使用层次聚类预测新观察的聚类标签?
问题描述
我想研究具有 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)
是否可以计算新观测值和所有预先计算的集群之间的距离?
实际上,使用pdist
from scipy 将计算距离n x n
在我的情况下,我想计算一个观察值o
与n
样本的距离o x n
谢谢你的亮点
解决方案
答案很简单:你不能。分层聚类并非旨在预测新观察的聚类标签。发生这种情况的原因是因为它只是根据数据点的距离链接数据点,而不是为每个集群定义“区域”。
我相信现阶段有两种解决方案:
- 对于新数据点,在您的数据集中找到最近的观测值(使用与训练期间相同的距离函数)并分配相同的聚类标签。这需要更多的编码,显然,它有点像黑客。但请记住,结果可能没有多大意义,因为您将使用与训练过程不同的方法来推断集群标签。
- 使用另一种聚类算法!当您的用例与模型不匹配时,您似乎正在使用层次聚类。
KMeans
可能是一个不错的选择,因为它可以明确地将新数据点分配给最近的集群。
推荐阅读
- java - 请求属性在spring微服务中无法访问
- postgresql - 无法连接到 RDS Postgres
- javascript - node_modules 中的 serve.js 文件
- microsoft-graph-api - Microsoft Graph 最小字段
- google-cloud-platform - Google PubSub - 添加有关计划的消息
- python - 如何在 numpy 中正确连接二维 ndarray 中的字符串元素?
- python - 如何将文件读入包含行号的元组列表中?
- ruby-on-rails - Rails - 如何根据最新的儿童添加列出父母?
- javascript - 机器人不能在 IRC 上工作,用 Node.js 编写
- r - fable::forecast 中的索引类