Py学习  »  Python

复数numpy数组的python均值漂移聚类

Jens • 5 年前 • 508 次点击  

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

它实现了 Fisher’s LDA 减少 n -1的维空间 n -一维空间,其结果是产生复数的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

我仍然在学习这里发生的事情的数学细节,但我觉得奇怪的是,这段代码被声明为可运行的。

我是不是丢了什么东西?版本更改是否导致了此回归,或者是否存在更基本的代码缺陷?我该如何着手解决这个问题?

Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/39711
 
508 次点击  
文章 [ 1 ]  |  最新文章 5 年前
Paul Panzer
Reply   •   1 楼
Paul Panzer    6 年前

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

(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,请参见 here . 一定要绕过逆时针方向 哎哟 直接打开 cov_w + I 甚至 cov_w .