2012-02-21 4 views
2

Je continue à obtenir ces erreurs:KDE (estimation densité du noyau) de la matrice avec 13 dimensions en utilisant numpy et 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 

Je ne sais pas comment cela s'applique à mes données. C'est un énorme mur de texte mais si cela aide à voir au moins dans quel contexte le code est appliqué ici, c'est http://pastebin.com/Myx5TpYy. Chaque matrice contient 12 points de données, pour être honnête, je ne suis pas sûr d'avoir besoin de tous les points de données, mais je pense que le fait de savoir ce qui ne va pas m'aidera de toute façon. Voici le code que j'ai essayé de se rendre au travail

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

Pourriez-vous s'il vous plaît fournir le contenu du 'data.txt' fichier? –

Répondre

2

Il semble qu'il y ait deux colonnes complètement nulles dans la matrice d'entrée. Ceci produit une grande bande de zéros dans la matrice de covariance interne calculée par gaussian_kde, la rendant singulière et provoquant l'échec de la routine.

Si je réécris votre exemple comme ceci:

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

Il fonctionne: enter image description here

2

D'abord, vous faites beaucoup, beaucoup trop de travail pour obtenir la matrice. Remplacer tout de la ligne matrix = [] jusqu'à la fin de la boucle avec:

matrix = [] 

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

En second lieu, la raison de l'erreur « matrice singulière » dépend entièrement de vos données. Par exemple, avez-vous une ligne de la même valeur (par exemple, tous les 0 ou tous les 1)? Sinon, avez-vous deux lignes identiques? L'un ou l'autre de ces problèmes conduirait à ce problème en utilisant l'estimateur de densité du noyau.

Questions connexes