2012-02-21 131 views
2

をmatplotlibの私は、これらのエラーを得続ける:KDE(カーネル密度推定)と

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'ファイルの内容を提供していただけますか? –

答えて

2

入力行列には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

まず仕事に取得しようとしてきたコードであり、あなたは行列を取得するために遠く、あまりにも多くの仕事をしています。 forループの最後にラインmatrix = []からすべてを置き換えます。

matrix = [] 

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

第二に、「特異行列」エラーの理由は、あなたのデータに完全に依存。たとえば、全く同じ値の行がありますか(たとえば、すべて0か1のいずれか)ですか?あるいは、2つの行が同じであるかどうかを確認します。いずれの場合も、カーネル密度推定器を使用してこの問題が発生します。

関連する問題