KDE (оценка плотности ядра) Matrix с 13 измерениями с использованием numpy и matplotlib - PullRequest
2 голосов
/ 21 февраля 2012

Я получаю эти ошибки:

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()

Ответы [ 2 ]

2 голосов
/ 21 февраля 2012

Кажется, что во входной матрице есть два полностью нулевых столбца. Это приводит к большой полосе нулей во внутренней ковариационной матрице, рассчитанной по 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 голосов
/ 21 февраля 2012

Во-первых, вы делаете слишком много работы, чтобы получить матрицу. Замените все от строки matrix = [] до конца цикла for:

matrix = []

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

Во-вторых, причина ошибки «особой матрицы» полностью зависит от ваших данных. Например, у вас есть строка с полностью одинаковым значением (скажем, все 0 или все 1)? Кроме того, у вас есть две строки, которые идентичны? Любой из них может привести к этой проблеме, используя оценщик плотности ядра.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...