在python中使用k-means进行聚类

时间:2012-03-07 03:43:25

标签: python tags cluster-analysis data-mining k-means

我有一个文件d1,由表格user_id tag_id组成。 还有另一个文档d2由tag_id tag_name组成 我需要生成具有类似标记行为的用户群。 我想在python中尝试使用k-means算法。 我对此完全陌生,无法弄清楚如何从此开始。 任何人都可以提供任何指示吗?

我是否需要首先使用带有标签词汇的d1为每个用户创建不同的文档? 然后在这些文件上应用k-means算法? d1中有100万用户。我不确定我是在朝着正确的方向思考,创造了100万个文件?

4 个答案:

答案 0 :(得分:4)

由于您拥有的数据是二进制和稀疏的(特别是,并非所有用户都标记了所有文档,对吧)?所以我完全不相信k-means是这样做的正确方法。

无论如何,如果您想尝试k-means,请查看 k-medians (不允许“半标记”)和凸/球形等变体k-means(假设距离函数如余弦距离更好,这在这里似乎更合适)。

答案 1 :(得分:2)

正如@Jacob Eggers所提到的,你必须对数据进行非规范化以形成一个确实稀疏的矩阵。 在python中使用SciPy包来表示k意思。见

Scipy Kmeans

示例和执行。 另请查看Kmeans in python (Stackoverflow)以获取有关python kmeans群集的更多信息。

答案 2 :(得分:0)

首先,您需要对数据进行非规范化,以便您有一个这样的文件:

userid tag1 tag2 tag3 tag4 ....
0001   1    0    1    0    ....
0002   0    1    1    0    ....
0003   0    0    1    1    ....

然后你需要循环k-means算法。这是来自ml-class的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

答案 3 :(得分:0)

对于稀疏k均值,请参阅下面的示例 scikit-learn clustering
关于有多少个ID,平均每个用户多少个, 你在寻找多少个集群?即使粗略的数字, 例如100k ids,每位用户10个,100个集群, 可能导致某人在该范围内完成聚类 (或者在信封背后“不可能”)。

MinHash 可能比k-means更适合你的问题; 参见第3章,查找类似项目, of Ullman, Mining Massive Datasets;
SO questions/tagged/similarity+algorithm+python