2012-02-21 114 views
2

我不斷收到這些錯誤:KDE與13點的尺寸使用numpy的矩陣(核密度估計)和matplotlib

Traceback (most recent call last): File "D:/Dropbox/Public/Data Processor/src/dP.py", line 69, in <module> 
    gkde = stats.gaussian_kde(kdeData) File "D:\Python27\lib\site-packages\scipy\stats\kde.py", line 86, in 
__init__ 
    self._compute_covariance() File "D:\Python27\lib\site-packages\scipy\stats\kde.py", line 339, in 
_compute_covariance 
    self.inv_cov = linalg.inv(self.covariance) File "D:\Python27\lib\site-packages\scipy\linalg\basic.py", line 327, in inv 
    raise LinAlgError("singular matrix") numpy.linalg.linalg.LinAlgError: singular matrix 

我不知道如何適用於我的數據。這是一個巨大的文字牆,但如果它有助於至少看到代碼在這裏應用的上下文是http://pastebin.com/Myx5TpYy。每個矩陣都有12個數據點,說實話,我不確定我是否需要所有的數據點,但我想知道發生了什麼問題會幫助我解決問題。 這裏是我一直試圖去上班

from decimal import * 
import csv 
import numpy as np 
from scipy import stats 
import matplotlib.pylab as plt 

matrix = [] 
col1 = [] 
col2 = [] 
col3 = [] 
col4 = [] 
col5 = [] 
col6 = [] 
col7 = [] 
col8 = [] 
col9 = [] 
col10 = [] 
col11 = [] 
col12 = [] 


for line in open("data.txt", "r"): 
    col_1, col_2, col_3, col_4, col_5, col_6, col_7, col_8, col_9, col_10, col_11, col_12 = line.split() 

    col_1_val = col_1[:] 
    col_2_val = col_2[:] 
    col_3_val = col_3[:] 
    col_4_val = col_4[:] 
    col_5_val = col_5[:] 
    col_6_val = col_6[:] 
    col_7_val = col_7[:] 
    col_8_val = col_8[:] 
    col_9_val = col_9[:] 
    col_10_val = col_10[:] 
    col_11_val = col_11[:] 
    col_12_val = col_12[:] 

    matrix.append([Decimal(col_1_val), Decimal(col_2_val), Decimal(col_3_val), Decimal(col_4_val), Decimal(col_5_val), Decimal(col_6_val), Decimal(col_7_val), Decimal(col_8_val), Decimal(col_8_val), Decimal(col_9_val), Decimal(col_10_val), Decimal(col_11_val), Decimal(col_12_val)]) 

kdeData = np.array(matrix).T 
print kdeData 
gkde = stats.gaussian_kde(kdeData) 
ind = np.linspace(-13,13,512) 
kdepdf = gkde.evaluate(matrix) 
plt.figure() 
plt.hist(xn, bins=20, normed=1) 
plt.plot(ind, stats.norm.pdf(ind), color="r", label='DGP normal') 
plt.plot(in, kdepdf, label='kde', color="g") plt.title('Kernel Density Estimation') 
plt.legend() 
plt.show() 
+1

能否請您提供'data.txt'文件的內容? – 2012-02-21 06:09:11

回答

2

似乎在輸入矩陣中有兩個完全爲零的列。這會在由gaussian_kde計算的內部協方差矩陣中產生一個很大的零帶,使其成爲單數並導致例程失敗。

如果我重寫你的例子是這樣的:

import numpy as np 
from scipy import stats 
import matplotlib.pylab as plt 

valid=[0,1,2,3,4,5,6,7,10,11] 
matrix=np.loadtxt('data.txt',skiprows=1,usecols=valid) 
kdeData = np.array(matrix).T 
print kdeData 
gkde = stats.gaussian_kde(kdeData) 
ind = np.linspace(-13,13,512) 
kdepdf = gkde.evaluate(kdeData) 
plt.figure() 
plt.plot(ind, stats.norm.pdf(ind), color="r", label='DGP normal') 
plt.plot(ind, kdepdf, label='kde', color="g") 
plt.title('Kernel Density Estimation') 
plt.legend() 
plt.show() 

它的工作原理: enter image description here

2

一碼,你正在做的很遠很遠了太多的工作得到了矩陣。從線matrix = []替換一切的結束與循環:

matrix = [] 

for line in open("data.txt", "r"): 
    matrix.append([Decimal(e) for e in line[:-1].split()]) 

其次,對於「奇異矩陣」錯誤的原因完全取決於你的數據。例如,你是否有一行完全相同的值(比如全0或全1)?或者,你有兩行相同的行嗎?使用核密度估計器會導致這個問題。