numpy.cov返回一个不是正半明确的矩阵



我使用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

而不是将 c 传递到,如果我通过身份矩阵最近的neighbors 可以按预期工作。我怀疑 c 实际上可能不是正半数的,因此,马哈拉氏症距离中的 sqrt 中的值可能会以输入为负值。

我检查了由此产生的 c 的特征值,其中许多是负(和复杂(,但接近0。

我会有几个问题:

  • 这完全是因为数值错误(还是我做错了什么(?
  • 如果是由于数值错误,是否有一种方法可以修复它?

事实证明,由于数值错误,这是事实。解决此问题的解决方法是将少量数字添加到协方差矩阵的对角线元件中。这个数字越大,距离越接近欧几里得距离,因此在选择此数字时必须小心。

相关内容

  • 没有找到相关文章

最新更新