复数 numpy 数组的 Python 均值移位聚类



我继承了一些大约一年前编写的代码,所以我想当时它使用的是numpy 1.13(现在是v1.15.2(,scipy 1.00rc(现在是v1.1.0(和sklearn 0.19(现在是v.0.20.0(。

它实现了费舍尔的LDA,将n维空间减少到1...n-1维空间,其结果是生成复数的 numpy 数组(由于浮点不精确(。然后,该数组被愉快地挑选并输入到sklearn.cluster.MeanShift,这会立即引发异常:

File "/…/lib/python3.6/site-packages/sklearn/cluster/mean_shift_.py", line 416, in fit
X = check_array(X)
File "/…/lib/python3.6/site-packages/sklearn/utils/validation.py", line 531, in check_array
_ensure_no_complex_data(array)
File "/…/lib/python3.6/site-packages/sklearn/utils/validation.py", line 354, in _ensure_no_complex_data
"{}n".format(array))
ValueError: Complex data not supported

我仍在学习这里发生的事情的数学细节,但令我感到奇怪的是,这段代码被宣布为"可运行"。

我在这里错过了什么吗?版本更改是否带来了这种回归,还是存在更基本的代码缺陷?我将如何解决此问题?

在评论/聊天中,我们至少发现了一个问题,即

(cov_w + I)^-1 @ cov_b                       (1)

不是真实的,但它会返回重要的虚部。这里@是矩阵乘法,cov_w和cov_b是协方差矩阵,I是单位矩阵。这可以通过计算 (cov_w + I(^-1 的矩阵平方根来解决,我们称之为 SQ,然后使用 (1( 类似于

SQ @ cov_b @ SQ                              (2)

因此具有相同的特征值,如果 V 是 (2( 的特征向量,则 (1( 的(右(特征向量是 SQ @ V。

我们得到的是,因为(2(是一个对称矩阵,所以它的特征分解可以使用保证纯真实结果的numpy.linalg.eigh来计算。eigh也可用于计算 SQ,请参阅此处。请务必绕过反向,直接在cov_w + I甚至cov_w上应用eigh

相关内容

  • 没有找到相关文章

最新更新