以下簡單示例返回一個奇異矩陣。爲什麼?任何方法來克服它?KDE失敗兩點?
In: from scipy.stats import gaussian_kde
Out:
In: points
Out: (array([63, 84]), array([46, 42]))
In: gaussian_kde(points)
Out: (array([63, 84]), array([46, 42]))
LinAlgError: singular matrix
以下簡單示例返回一個奇異矩陣。爲什麼?任何方法來克服它?KDE失敗兩點?
In: from scipy.stats import gaussian_kde
Out:
In: points
Out: (array([63, 84]), array([46, 42]))
In: gaussian_kde(points)
Out: (array([63, 84]), array([46, 42]))
LinAlgError: singular matrix
查看回溯,反轉協方差矩陣時可以看到它失敗。這是由於您的數據的確切multicollinearity。從頁,你有多重數據中的兩個變量是共線的,也就是說,如果
兩個自變量之間的相關性等於1或-1
在這種情況下,這兩個變量只有兩個樣本,它們總是共線的(平凡,總是有一條線通過兩個不同的點)。我們可以檢查:
np.corrcoef(array([63,84]),array([46,42]))
[[ 1. -1.]
[-1. 1.]]
爲了不一定是共線的,兩個變量必須至少有n=3
樣本。爲了增加這個限制,你有ali_m指出的限制,樣本數n
應該大於或等於變量數p
。把兩者結合起來,
n>=max(3,p)
在這種情況下p=2
和n>=3
是正確的約束。
錯誤時gaussian_kde()
試圖採取輸入數據的協方差矩陣的逆矩陣進行。爲了使協方差矩陣是非奇異的,輸入中(非相同)點的數量必須大於等於變量數量。嘗試添加第三點,你應該看到它的作品。
This answer on Crossvalidated對此有正確的解釋。
他的點數是> =變量的數量,2> = 2 – gg349
@flebool D'oh - 不知道如何錯過!是的,當然你是對的,擁有'n> = p'是一個必要但不充分的條件 - 如果你有多重共線性,協方差矩陣仍然可能是等級不足的。 –