2012-11-20 24 views
0

我無法使用vq.whitenscipy.cluster正常化我的數據。我正在傳遞一個數組,其中缺少每個要素的平均值填充的特徵值。正在獲取AttributeError:sqrt in vq.whiten

它卡住就行是:

data = scipy.cluster.vq.whiten(self.imputed) 

這是我使用替換丟失數據的代碼。

imputed = np.array([self.masked[:,i].filled(self.masked[:,i].mean()) 
        for i in range(np.shape(self.masked)[1])]) 
self.imputed = np.transpose(imputed) 

我敢肯定還有一個更好的方法來完成這部分,除了它似乎打破了我的代碼。這似乎是一種難以實現的方式,通常意味着Python有更好的方式。

我試着把我發送給whiten的數組多少分了下來,但是不管我在Traceback中得到了什麼。所以我在什麼來嘗試下虧本

Traceback (most recent call last): 
    File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 87, in <module> 
    dataset.cluster() 
    File "C:\Users\jamie.bull\workspace\Metadata\src\draft_workflow.py", line 59, in cluster 
    data = scipy.cluster.vq.whiten(self.imputed) 
    File "C:\Enthought\Python27\lib\site-packages\scipy\cluster\vq.py", line 131, in whiten 
    std_dev = std(obs, axis=0) 
    File "C:\Enthought\Python27\lib\site-packages\numpy\core\fromnumeric.py", line 2467, in std 
    return std(axis, dtype, out, ddof) 
AttributeError: sqrt 

聚類正常工作與同一數據集,沒有任何丟失的數據。

編輯: 我嘗試打印出每個項目的類型imputed兩個完整的數據集,並使用一個與缺失數據:

for item in imputed: 
    print type(item) 

這兩者之間的區別在於,當所述沒有被調用的平均替換和轉置的版本每行有一個numpy.ndarray,而被平均替換的版本每列有一個。

+0

您可以顯示更多追溯的:

在OP出錯行可以替換爲? – tiago

+0

編輯顯示完整的追溯。我很確定問題在於我如何創建'推定'。我出來了一個1D numpy數組,而我想要的是一個2D numpy數組。 –

+0

是的,你正在設置的是一維數組,並且正在打破'vq.whiten'。我建議擺脫列表理解('[a for b in c]'),並且只是做一個循環來替換你丟失的數據。 – tiago

回答

3

我現在已經解決了這個問題,所以我會把答案放在未來的靈魂中。問題在於當原始數據被存儲爲numpy.float64時,我的意思是用float來代替缺失值。

解決方案是運行列表理解,並通過將dtype設置爲np.float64。看起來whiten不喜歡接收混合的數據類型。

另外,爲了解決在列表理解之後不得不轉換的醜問題,我重新發現了np.column_stack()。工作函數現在是:

def mean_impute(self): 
    imputed = np.column_stack(self.masked[:,i].filled(self.masked[:,i].mean()) 
       for i in range(np.shape(self.masked)[1])) 
    self.imputed = np.array(imputed, dtype=np.float64) 

編輯補充

很久以前的事了,但我想我會在這裏更新。我現在將使用熊貓進行數據處理,並使用pandasfill_na()來處理這種情況。

imputed = self.masked.fillna(self.masked.mean())