2013-07-22 43 views
3

我對python和scikit-learn都很陌生,所以請耐心等待。scikit-learn如何知道集羣中的文檔?

我把這個源代碼,k表示從k means clustering.

我再修改,以通過LOAD_FILE功能在我的本地組運行聚類算法。

儘管算法終止,但它不會產生任何輸出,如哪些文檔聚集在一起。

我發現km對象有一個「km.label」數組,它列出了每個文檔的質心id。

它也有「km.cluster_centers_」

重心向量,但它是什麼文件?我必須將它映射到「數據集」,它是一個「Bunch」對象。

如果我打印dataset.data [0],我得到我認爲是洗牌的第一個文件的數據。但我只想知道這個名字。

我對像dataset.data [0]這個文檔聚集在km.label [0]處的問題感到困惑嗎?

我的基本問題是找到哪些文件聚集在一起。 如何找到?

+0

請務必驗證結果是否合理。 K-means通常會返回可能是數學optimas的結果,但對於實際的問題根本無用! –

回答

11

忘掉Bunch對象。這只是一個加載與scikit-learn捆綁在一起的玩具數據集的實現細節。

在現實生活中,用你真實的數據,你只需要直接撥打:

km = KMeans(n_clusters).fit(my_document_features) 

然後從收集集羣分配:

km.labels_ 

my_document_features是一個二維的數據結構:要麼是numpy的陣列或一個形狀爲(n_documents, n_features)的scipy.sparse矩陣。

km.labels_是形狀爲(n_documents,)的一維numpy陣列。因此,labels_中的第一個元素是my_document_features特徵矩陣第一行中描述的文檔的集羣索引。

通常你會建立my_document_featuresTfidfVectorizer對象:

my_document_features = TfidfVectorizer().fit_transform(my_text_documents) 

my_text_documents將一個或者一個列表的Python Unicode對象,如果你直接讀取文件(例如,從一個CSV文件數據庫或行或任何你想要的),或者:

vec = TfidfVectorizer(input='filename') 
my_document_features = vec.fit_transform(my_text_files) 

其中my_text_files是在你的硬盤上的文檔文件的路徑的Python列表(假設他們使用的是UTF-8編碼encodi NG)。

my_text_filesmy_text_documents列表的長度應該是n_documents因此與km.labels_的映射是直接的。由於scikit-learn不僅僅用於對文檔進行聚類或分類,我們使用名稱「sample」而不是「document」。這樣,您將看到我們使用n_samples而不是n_documents來記錄庫中所有估算器的參數和屬性的預期形狀。

+0

感謝ogrisel。在示例代碼中,dataset.data是您的「my_text_files」。那麼我如何找到哪個文件在0索引?如果它不存儲它,我怎樣才能使用load_files()函數獲取文件名? –

+1

否:'dataset.data'是包含文本文件內容的內存中的python unicode字符串列表。如果使用'load_files()'工具,則'filenames'存儲在'dataset.filenames'列表中。 – ogrisel

2

dataset.filenames是關鍵:)

這是我做到了。

load_files聲明:

def load_files(container_path, description=None, categories=None, 
      load_content=True, shuffle=True, charset=None, 
      charse_error='strict', random_state=0) 

這樣做

dataset_files = load_files("path_to_directory_containing_category_folders"); 

然後當我得到的結果:

我把它們放在這是一本字典

clusters = defaultdict(list) 

k = 0; 
for i in km.labels_ : 
    clusters[i].append(dataset_files.filenames[k]) 
    k += 1 
集羣

和然後我打印它:)

for clust in clusters : 
    print "\n************************\n" 
    for filename in clusters[clust] : 
    print filename 
+0

這幫助我弄清楚如何顯示屬於每個羣集的非文件數據集的觀察結果。謝謝! –

相關問題