4

下面的简单示例返回一个奇异矩阵。为什么?有什么办法克服吗?

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
4

2 回答 2

7

查看回溯,您可以看到它在反转协方差矩阵时失败。这是由于您的数据存在精确的多重共线性。从页面上看,如果两个变量共线,则数据中存在多重共线性,即如果

两个自变量之间的相关性等于 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是正确的约束。

于 2013-10-10T07:07:53.583 回答
1

gaussian_kde()尝试取输入数据的协方差矩阵的逆时会发生错误。为了使协方差矩阵是非奇异的,输入中(不相同)点的数量必须 >= 到变量的数量。尝试添加第三个点,您应该会看到它有效。

Crossvalidated 上的这个答案对为什么会这样有一个正确的解释。

于 2013-10-09T10:51:05.657 回答