2013-10-08 48 views
5

以下電話:RBF插值:LinAlgError:奇異矩陣

rbf = Rbf(points[0], points[1], values,epsilon=2) 

導致錯誤:

LinAlgError: singular matrix 

具有以下值:

In [3]: points 
Out[3]: 
(array([71, 50, 48, 84, 71, 74, 89, 76, 70, 77, 74, 79, 83, 71, 72, 78, 73, 
     84, 75, 65, 73, 82, 48, 86, 74, 86, 66, 74, 68, 74, 81, 74, 88, 66, 
     57, 50, 72, 86, 72, 92, 81, 67, 82, 78, 69, 70, 73, 71, 76, 72, 74, 
     75]), 
array([32, 34, 4, 35, 1, 7, 47, 16, 37, 14, 65, 18, 32, 4, 3, 27, 25, 
     34, 18, 25, 6, 25, 34, 41, 16, 35, 44, 2, 32, 2, 37, 60, 45, 32, 
     33, 42, 54, 31, 18, 38, 24, 18, 45, 48, 9, 63, 56, 45, 9, 59, 5, 
     12])) 

In [4]: values 
Out[4]: 
array([ 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 
     1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 
     1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 
     1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1., 1.]) 

我能做些什麼避免它,仍然解決插值問題?

+0

如果所有的值都是1,那麼你已經知道在任何點的內插值也應該是1.如果這些值不全是1,那麼你(可能?)將不會遇到奇異矩陣誤差。 – unutbu

+0

@unutbu - 我認爲rbf會在每個值周圍使用RBF。當我離開每個RBF的每個1時,值不應該減少嗎? (即,我將得到每個位置的高斯數的總和) – Josh

+0

徑向基函數的** sum **在由'points'指定的每個位置處必須等於1。單個RBF在這些點上不會等於1。只有總和必須等於1.問題是在所有這些點上都沒有等於1的RBF總和。 – unutbu

回答

6

我認爲你想要做的是kernel density estimation。您可以使用scipy.stats.gaussian_kde此:

import numpy as np 
from scipy.stats import gaussian_kde 
from matplotlib import pyplot as pp 

# kernel density estimate of the PDF 
kde = gaussian_kde(points) 

# evaluate the estimated PDF on a grid 
x,y = np.mgrid[40:101,-20:101] 
z = kde((x.ravel(),y.ravel())).reshape(*x.shape) 

# plot 
fig,ax = pp.subplots(1,1) 
ax.hold(True) 
pc = ax.pcolor(x,y,z) 
cb = pp.colorbar(pc) 
cb.ax.set_ylabel('Probability density') 
ax.plot(points[0],points[1],'o',mfc='w',mec='k') 

pp.show() 

enter image description here

statsmodels模塊還具有some more elaborate tools核密度估計。

0

我得到了同樣的錯誤。 最後我發現爲什麼我得到錯誤。

你有兩個相同的座標點。 (74,2) 檢查值在28日,30日有相同的座標。

在我的想法中,即使您在同一點上具有相同的值,它也會發出奇異的矩陣錯誤。