下面的简单示例返回一个奇异矩阵。为什么?有什么办法克服吗?
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
下面的简单示例返回一个奇异矩阵。为什么?有什么办法克服吗?
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
查看回溯,您可以看到它在反转协方差矩阵时失败。这是由于您的数据存在精确的多重共线性。从页面上看,如果两个变量共线,则数据中存在多重共线性,即如果
两个自变量之间的相关性等于 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()
尝试取输入数据的协方差矩阵的逆时会发生错误。为了使协方差矩阵是非奇异的,输入中(不相同)点的数量必须 >= 到变量的数量。尝试添加第三个点,您应该会看到它有效。
Crossvalidated 上的这个答案对为什么会这样有一个正确的解释。