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

numpy.cov returning a matrix which is not positive semi-definite

我正在使用 np.cov 从二维数组计算协方差矩阵,并使用它来获取马氏距离的最近邻居。

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

和任何查询点的距离值returns nan.

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

我检查了结果 c 的特征值,其中许多结果是负数(且复数)但接近于 0。

我想问几个问题:

原来这是 in-fact 因为数值错误。纠正此问题的解决方法是向协方差矩阵的对角线元素添加一个小数字。这个数字越大,距离越接近欧几里得距离,所以在选择这个数字时一定要小心。