我有一个文件d1,由表格user_id tag_id组成。 还有另一个文档d2由tag_id tag_name组成 我需要生成具有类似标记行为的用户群。 我想在python中尝试使用k-means算法。 我对此完全陌生,无法弄清楚如何从此开始。 任何人都可以提供任何指示吗?
我是否需要首先使用带有标签词汇的d1为每个用户创建不同的文档? 然后在这些文件上应用k-means算法? d1中有100万用户。我不确定我是在朝着正确的方向思考,创造了100万个文件?
答案 0 :(得分:4)
由于您拥有的数据是二进制和稀疏的(特别是,并非所有用户都标记了所有文档,对吧)?所以我完全不相信k-means是这样做的正确方法。
无论如何,如果您想尝试k-means,请查看 k-medians (不允许“半标记”)和凸/球形等变体k-means(假设距离函数如余弦距离更好,这在这里似乎更合适)。
答案 1 :(得分:2)
正如@Jacob Eggers所提到的,你必须对数据进行非规范化以形成一个确实稀疏的矩阵。 在python中使用SciPy包来表示k意思。见
示例和执行。 另请查看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。