在 python 中使用 k-means 进行聚类
Posted
技术标签:
【中文标题】在 python 中使用 k-means 进行聚类【英文标题】:Clustering using k-means in python 【发布时间】:2012-03-24 15:03:47 【问题描述】:我有一个由 user_id tag_id 形式的行组成的文档 d1。 还有另一个文档 d2 由 tag_id tag_name 组成 我需要生成具有相似标记行为的用户集群。 我想用python中的k-means算法试试这个。 我对此完全陌生,无法弄清楚如何开始。 谁能指点一下?
我是否需要首先使用 d1 和他的标签词汇为每个用户创建不同的文档? 然后在这些文档上应用 k-means 算法? d1 中有大约 100 万用户。我不确定我的想法是否正确,创建了 100 万个文件?
【问题讨论】:
【参考方案1】:由于您拥有的数据是二进制且稀疏的(特别是,并非所有用户都标记了所有文档,对吧)?所以我根本不相信 k-means 是正确的方法。
无论如何,如果您想尝试 k-means,请查看变体,例如 k-medians(不允许“半标记”)和凸/球形k-means(据说它与余弦距离等距离函数更有效,在这里看起来更合适)。
【讨论】:
【参考方案2】:正如@Jacob Eggers 所提到的,您必须对数据进行非规范化以形成确实是稀疏矩阵的矩阵。 在 python 中使用 SciPy 包作为 k 手段。见
Scipy Kmeans
示例和执行。 另请查看Kmeans in python (***),了解有关 python kmeans 聚类的更多信息。
【讨论】:
【参考方案3】:首先,您需要对数据进行非规范化,以便拥有一个像这样的文件:
userid tag1 tag2 tag3 tag4 ....
0001 1 0 1 0 ....
0002 0 1 1 0 ....
0003 0 0 1 1 ....
然后你需要循环遍历 k-means 算法。这是来自 ml 类的 matlab 代码:
% Initialize centroids
centroids = kMeansInitCentroids(X, K);
for iter = 1:iterations
% Cluster assignment step: Assign each data point to the
% closest centroid. idx(i) corresponds to cˆ(i), the index
% of the centroid assigned to example i
idx = findClosestCentroids(X, centroids);
% Move centroid step: Compute means based on centroid
% assignments
centroids = computeMeans(X, idx, K);
end
【讨论】:
【参考方案4】:对于稀疏 k-means,请参阅下面的示例 scikit-learn clustering. 关于那里有多少个 id,每个用户平均有多少个, 您要查找多少个集群?即使是粗略的数字, 例如100k ids,平均每个用户 10 个,100 个集群, 可能会导致某人在该范围内完成聚类 (或者说“不可能”)。
MinHash 可能比 k-means 更适合您的问题; 请参阅第 3 章,查找相似项目, Ullman, Mining Massive Datasets; 还有SO questions/tagged/similarity+algorithm+python。
【讨论】:
以上是关于在 python 中使用 k-means 进行聚类的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 k-means (Flann with python) 对文档进行聚类?
毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割
毕业了,在Python中使用 OpenCV 和K-Means 聚类对毕业照进行图像分割