在 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 聚类对毕业照进行图像分割

在 Python 中使用 h2o4gpu K-Means 对文本文档进行聚类

在 K-means 聚类中组织聚类

k-means聚类分析 python 代码实现(不使用现成聚类库)