2013-07-03 35 views
4

我試圖使用k均值聚類在SciPy的,正是一個在座:清單ndarray

http://docs.scipy.org/doc/scipy/reference/generated/scipy.cluster.vq.kmeans.html#scipy.cluster.vq.kmeans

我所試圖做的是要轉換列表的列表,如以下:

data without_x[ 
[0, 0, 0, 0, 0, 0, 0, 20.0, 1.0, 48.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1224.0, 125.5, 3156.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
[0, 0, 0, 0, 0, 0, 22.5, 56.0, 41.5, 85.5, 0, 0, 0, 0, 0, 0, 0, 0, 1495.0, 3496.5, 2715.0, 5566.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
] 

爲了與Kmeans方法一起使用它。當我嘗試將列表列表轉換爲ndarray時,我得到一個空數組,從而排除了整個分析。 ndarray的長度是可變的,它取決於收集的樣本數量。但我可以很容易地與 len(data_without_x)

以下是返回空列表的代碼片段。

import numpy as np 
import "other functions" 

data, data_without_x = data_preparation.generate_sampled_pdf() 
nodes_stats, k, list_of_list= result_som.get_number_k() 

data_array = np.array(data_without_x) 
whitened = whiten(data_array) 
centroids, distortion = kmeans(whitened, int(k), iter=100000) 

,這就是我得到的輸出只是一個簡單的日誌文件保存:

___________________________ 
this is the data array[[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
..., 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.] 
[ 0. 0. 0. ..., 0. 0. 0.]] 
___________________________ 
This is the whitened array[[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
..., 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan] 
[ nan nan nan ..., nan nan nan]] 
___________________________ 

沒有任何人有一個會發生什麼線索,當我嘗試列表列表轉換成numpy的.array?

感謝您的幫助

+0

嘗試'print(np.abs(data_array).sum())'看看數組是否真的是空的。字符串表示不顯示全部。 –

+0

輸出到上面的行不是零是2099918.5 ...這意味着它不是空的......那我爲什麼會得到這樣的結果? – MixturaDementiae

+0

它返回TRUE – MixturaDementiae

回答

3

這正是如何將一個列表的列表轉換爲一個Python ndarray。你確定你的data_without_x填寫正確嗎?在我的機器:

data = [[1,2,3,4],[4,5,6,7,8]] 
data_arr = np.array(data) 

data_arr 
array([[1,2,3,4], 
     [5,6,7,8]]) 

這是行爲,我認爲你期待

看你輸入你有很多零的......記住,打印出不顯示所有的。你可能只是看到你輸入的所有「零」。檢查特定的非零元素,以確保

0

vq.whitenvq.kmeans期望形狀(M, N),其中每一行是一個觀察的陣列。所以,轉你的data_array:numpy的的

import numpy as np 
import scipy.cluster.vq as vq 
np.random.seed(2013)  

data_without_x = [ 
    [0, 0, 0, 0, 0, 0, 0, 20.0, 1.0, 48.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 
     1224.0, 125.5, 3156.0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0], 
    [0, 0, 0, 0, 0, 0, 22.5, 56.0, 41.5, 85.5, 0, 0, 0, 0, 0, 0, 0, 0, 1495.0, 
     3496.5, 2715.0, 5566.5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0] 
] 


data_array = np.array(data_without_x).T 
whitened = vq.whiten(data_array) 

centroids, distortion = vq.kmeans(whitened, 5) 
print(centroids) 

產生

[[ 1.22649791e+00 2.69573144e+00] 
[ 3.91943108e-03 5.57406434e-03] 
[ 5.73668382e+00 4.83161524e+00] 
[ 0.00000000e+00 1.29763133e+00]] 
+0

爲什麼我必須製作data_array的T?在我的配置中,每一行都是一個觀察,如果我做了它的T,那麼每一列都將是一個觀察,而不應該是這樣嗎? – MixturaDementiae

+0

如您所說,如果「每一行都是觀察」,那麼您只有兩個觀察值。那麼聚集兩行幾乎沒有意義。看起來更有可能的是,你有36個或更多的平面點的觀察,並試圖找到'K'簇。如果這種解釋是正確的,那麼你必須傳遞給'vk.kmeans'一個形狀數組(36,2),而不是(2,36)。 – unutbu

+0

好吧,所以基本上我可能會錯誤地表達自己。關鍵是,當我寫「如」時,這意味着我試圖聚集在一起的觀察結果是這種形式,但這並不意味着只有這兩個觀察結果。觀察數量是可變的,並且取決於其他參數,在特定情況下有100K行要聚類。 36是分析的維數。所以如果例如我有75次觀察,我需要通過[75,36]矩陣而不是[36,75]。這是你想說的嗎? – MixturaDementiae