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