2012-03-07 35 views
3

我有一个由user_id tag_id形式的行组成的文档d1。 还有另一个文档d2,由tag_id tag_name 组成我需要生成具有类似标记行为的用户群。 我想用python中的k-means算法来试试这个。 我对此完全陌生,无法弄清楚如何开始。 任何人都可以给任何指针?在python中使用k-means进行聚类

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

回答

0

首先,你需要进行非规范化的数据,让你有一个文件是这样的:

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

然后你通过需要循环K-means算法。下面是从毫升级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 
2

正如@Jacob埃格斯提到的,你必须非规范化的数据,以形成为稀疏一个确实的矩阵。 在python中使用SciPy包中的k表示。见

Scipy Kmeans

的例子和执行。 另请参阅Kmeans in python (Stackoverflow)了解python kmeans集群的更多信息。

4

由于您拥有的数据是二进制和稀疏的(特别是,并非所有用户都标记了所有文档,对)?所以我完全不相信k-means是做这件事的正确方法。无论如何,如果你想给k-means一个尝试,看一下变体,如k-medians(这将不允许“半标签”)和凸/球形k-means(据推测,距离函数比如余弦距离的效果更好,这在这里似乎更合适)。

0

对于稀疏的k-means,请参阅 scikit-learn clustering下的示例。
大约有多少个ID,每个用户平均有多少个, 您要查找多少个集群?即使是粗糙的数字,例如 100k个ID,每个用户10个,每个用户100个,集群 可能会导致某人在该范围内完成集群 (或返回“不可能”)。

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