2013-07-12 19 views
0

您好,我正在嘗試使用K means和vq在scipy中實現:這裏更詳細的信息 - >http://docs.scipy.org/doc/scipy/reference/cluster.vq.html。問題是我有一個[x,36]的列表,其中每行是一個觀察值,每列是觀察的一個字段,所以基本上每個觀察值都由36個值組成。Scipy:Kmeans和vq如何使用它們?

我想將它們聚集在一起,並瞭解哪一行進入哪個集羣。根據文件,它應該是這樣的:

data_array_n = np.array(data_array) 
whitened = whiten(data_array_n) 
print "Starting K means" 
centroids, distortion = kmeans(whitened, k, iter=1000) 

print centroids 

idx, distortion = vq(whitened , centroids) 

但當我檢查idx我得到完全無用的值。 data_array是36個元素中的x列表的列表。 謝謝你的幫助

+0

請詳細描述「完全無用的值」。它們與文檔承諾的內容相匹配嗎? –

+0

對不起,你是對的。 例如,如果我通過一個K = 3,我希望有三個36維的數組與座標的質心。無論我通過多少K,我得到的是一個單一質心。 此外,idx應相應於文檔,一個介於0和K之間的整數,基本上將相應的行分配給適當的集羣。我得到什麼,而不是像這些值: [139733472771528 139733472771528 46314096 46314096 -2251799813685248 -2251799813685248 -2251799813685248 -2251799813685248 -2251799813685248 .... – MixturaDementiae

+0

取出美白功能似乎能正常工作......會變成這樣有意義嗎? ?? – MixturaDementiae

回答

1

一切都依賴於美白功能的構建方式...

def whiten(obs) 
    std_dev = std(obs, axis=0) 
    return obs/std_dev 

,它沒有任何意義,因爲它是在默認情況下計算的第一列,並在由於當時沒有數據,我的情況一直是0。 修復了我自己的白化功能,它返回整個數據集的std上的numpy數組,而不僅僅是在第一個軸上!

def whiten(obs) 
    std_dev = std(obs) 
    return obs/std_dev 

用相同的迭代從1000+到0.003的量化誤差得到更好的結果!

相關問題