2012-02-21 117 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)?或者,你有两行相同的行吗?使用核密度估计器会导致这个问题。