numpy.cov返回一个非正半正定矩阵

时间:2018-03-30 04:11:48

标签: python-3.x numpy scikit-learn covariance

我正在使用np.cov从2D数组计算协方差矩阵,并使用它来获得与Mahalanobis距离最近的邻居。

c = np.cov(arr)
neigh = NearestNeighbors(100,metric='mahalanobis',metric_params = {'VI':np.linalg.inv(c)})
neigh.fit(dfeatures)

但出于某种原因,我正在

/lib/python3.4/site-packages/sklearn/externals/joblib/parallel.py:131: RuntimeWarning: invalid value encountered in sqrt

并且任何查询点的距离值都返回 nan

如果我传递一个单位矩阵, NearestNeighbors 按预期工作,而不是将 c 传递给 NearestNeighbors 。我怀疑 c 实际上可能不是半正的,因此Mahalanobis距离中 sqrt 中的值可能会得到负值作为输入。

我检查了结果 c 的特征值,其中许多证明是负的(和复杂的)但接近于0.

我有几个问题:

  • 这完全是因为数字错误(或者我做错了什么)?
  • 如果是因为数字错误,有没有办法解决它?

1 个答案:

答案 0 :(得分:0)

事实证明这是因为数字错误。解决此问题的解决方法是向协方差矩阵的对角线元素添加一个小数字。该数字越大,距离欧氏距离越近,因此选择此数字时必须小心。