2017-08-20 54 views
3

我對sklearn(和python一般)非常陌生,但需要在涉及的某個項目上工作,其中包含超過10k個樣本。對於k = 4的少於100個樣本的測試數據集,使用以下代碼,聚類按預期進行。然而,當我開始使用多於100個樣品,則6/8質心似乎在原點(0,0)即它未能產生羣集重複。任何可能出錯的建議?當超過100個樣本時,Python K-means不適合數據

截圖: 86 Samples150 samples

代碼:

data = pd.read_csv('parsed.txt', sep="\t", header=None) 
    data.columns = ["x", "y"] 

    kmeans = KMeans(algorithm='auto', copy_x=True, init='k-means++', max_iter=1000, 
     n_clusters=k, n_init=10, n_jobs=1, precompute_distances='auto', 
     random_state=None, tol=0.0001, verbose=0) 
    kmeans.fit(data) 

    labels = kmeans.predict(data) 
    centroids = kmeans.cluster_centers_ 

    fig = plot.figure(figsize=(5, 5)) 
    colmap = {(x+1): [(np.sin(0.3*x + 0)*127+128)/255,(np.sin(0.3*x + 2)*127+128)/255,(np.sin(0.3*x + 4)*127+128)/255] for x in range(k)} # making rainbow colormap 
    colors = map(lambda x: colmap[x+1], labels) #color for each label 

    plot.scatter(data['x'], data['y'], color=colors, alpha=0.5, edgecolor='k') 
    for idx, centroid in enumerate(centroids): 
     plot.scatter(*centroid, color=colmap[idx+1]) 
    plot.xlim(0, 4000) 
    plot.ylim(0, 10000) 
    plot.show() 

@ 150個樣品,我打印的標籤(幾乎所有2S)和質心座標(最在起點)如下所示:

[2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
1 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 
2] 
[[ 7.51619277e+09 7.51619277e+09] 
[ 1.00000000e+27 1.00000000e+27] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00] 
[ 0.00000000e+00 0.00000000e+00]] 

更多細節(17年8月20日)

以下是示出集羣從k中的GIF = 1至10分別86和150個樣本。從這裏可以看出,86集合運行良好,但並不適用於僅在原點出現的150集合。請注意,在k = 4幀處設置的顏色變化是由我定義顏色映射的方式引起的,因此不是問題的一部分。

86 Samples150 Samples

回答

5

你嘗試先檢查是否有實際上是在你的數據這麼多集羣爲你試圖找到?簡單地增加樣本數量並不一定意味着羣集數量也會增加。如果不。您輸入給算法的簇的數量大於實際的數量。數據集中的聚類,則有可能該算法不能正確收斂,或者這些聚類可能簡單地相互重疊(完全)。

要找到最佳的沒有。我們使用稱爲彎頭方法的技術。該方法有不同的變化,但主要的想法是,K(編號羣)的不同值找到成本函數是最適合你的應用程序中所有點的距離平方的(如SUM羣集到它的質心的K值是表示1到8,或者任何其它的錯誤/成本/方差函數。根據您所選擇的功能,你會看到一定的階段後,在價值觀的差異可以忽略不計。這個想法是,我們選擇了「K」在該所選擇的成本函數的值急劇變化的該值。

Elbow method

對於值K = 4的方差被突然改變,因此K = 4是所選擇的是合適的值。

圖片來源:Wikipedia

上有羣集驗證幾種其它方法爲好。 R中有幾個包專門用於此目的。

要了解更多從下面的鏈接:

+0

謝謝,穆罕默德。我從來沒有使用肘法,所以我會了解這一點。但是對於我的問題,我確保始終使用相同數量的集羣k = 4。包含更多樣本時使用的數據集與以前具有非常相似的特徵。我也試過k = 3然後是2,但同樣的情況仍然發生。這就是我困惑的原因。 –

+0

如果您添加的樣本具有與之前相同的特徵,那麼它們更可能被添加到使用較小編號獲得的相同羣集中。的樣本。即不會形成新的羣集。你可以在150和86個樣本中發佈k = 2和k = 3的結果嗎? –

+0

我只是用.gif更新了這個帖子,對於86和150組,k = 1-> 10。是的,我預計在這兩種情況下大約有4-5個非常重要的集羣。 –