【发布时间】:2019-03-08 01:39:15
【问题描述】:
我继承了大约一年前编写的一些代码,所以我猜当时它使用的是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-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
我仍在学习这里发生的数学细节,但令我感到奇怪的是,这段代码被声明为“可运行”。
我在这里遗漏了什么吗?是版本变化带来了这种回归,还是存在更根本的代码缺陷?我该如何解决这个问题?
【问题讨论】:
-
@PaulPanzer,
X中的许多值是1.70078660e+00+0.j,并且相当少量的值是例如3.10415554e+00-0.31921105j。我可以打电话给X.real并继续处理这个结果,看看会发生什么……? -
复数数组是LDA中协方差矩阵的特征值和特征向量。事实上,紧随其后的是一个
warnings.simplefilter('ignore', np.ComplexWarning),表示有处理复杂结果的意图。然而,代码中的几行随后引发了断言,使其在 IMO 中无法“运行”。 (PS:np.iscomplex(X)返回一个相当稀疏的True值数组。) -
嗯……
eigvals, eigvecs = np.linalg.eig(Y)这里的Y是真实的(np.iscomplexobj(Y) → False),结果很复杂。 -
Hmm ????看来
np.allclose(Y, Y.T)给了我False(根据this answer),即Y不是对称的。但是,eigh(Y)确实返回了一个实数矩阵。
标签: python-3.x numpy scikit-learn linear-discriminant mean-shift