2012-03-07 98 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