我正在使用python中的MLPY API的PCAFast方法(http://mlpy.sourceforge.net/docs/3.2/dim_red.html)
当学习如下生成的特征矩阵时,该方法执行得非常快:
x = np.random.rand(100, 100)
此命令的示例输出为:
[[ 0.5488135 0.71518937 0.60276338 ..., 0.02010755 0.82894003
0.00469548]
[ 0.67781654 0.27000797 0.73519402 ..., 0.25435648 0.05802916
0.43441663]
[ 0.31179588 0.69634349 0.37775184 ..., 0.86219152 0.97291949
0.96083466]
...,
[ 0.89111234 0.26867428 0.84028499 ..., 0.5736796 0.73729114
0.22519844]
[ 0.26969792 0.73882539 0.80714479 ..., 0.94836806 0.88130699
0.1419334 ]
[ 0.88498232 0.19701397 0.56861333 ..., 0.75842952 0.02378743
0.81357508]]
但是,当特征矩阵x由以下数据组成时:
x = 7.55302582e-05*np.ones((n, d[i]))
示例输出:
[[ 7.55302582e-05 7.55302582e-05 7.55302582e-05 ..., 7.55302582e-05
7.55302582e-05 7.55302582e-05]
[ 7.55302582e-05 7.55302582e-05 7.55302582e-05 ..., 7.55302582e-05
7.55302582e-05 7.55302582e-05]
[ 7.55302582e-05 7.55302582e-05 7.55302582e-05 ..., 7.55302582e-05
7.55302582e-05 7.55302582e-05]
...,
[ 7.55302582e-05 7.55302582e-05 7.55302582e-05 ..., 7.55302582e-05
7.55302582e-05 7.55302582e-05]
[ 7.55302582e-05 7.55302582e-05 7.55302582e-05 ..., 7.55302582e-05
7.55302582e-05 7.55302582e-05]
[ 7.55302582e-05 7.55302582e-05 7.55302582e-05 ..., 7.55302582e-05
7.55302582e-05 7.55302582e-05]]
方法变得非常慢......为什么会这样?这是否与存储在x特征矩阵中的数据类型有关?
关于如何解决这个问题的任何想法?
答案 0 :(得分:0)
这是一个糟糕的(条件差的)矩阵,用于运行主成分分析。它的特征值为零(这本身可能有问题),剩余的特征值为1(您可以相互减去行以获得简并矩阵)。 Python可能有一个很差的特征系统求解器的实现,它依赖于矩阵是合理规则的(所有特征值都是不同的,并且与零和相互之间有很好的分离)。我不熟悉这种方法,但我的感觉,基于快速不动点的标题,是它们依赖于吹动特征值的乘法特性:if A =Σ k λ k u k u k '用于适当的正交向量 u k ,λ 1 > λ 2 > ...> λ p > 0,然后 A n ≈λ 1 u 1 u 1 '以获得足够大的功率 n 。当你将一个数组作为输入时,这个想法根本不起作用:你只是不断获得一个不与其他元素分开的特征值。更糟糕的是,对于您输入的特定矩阵,(7 >> -5 ) 20 接近于可以表示为双重的精度数。最后,您可能在输出中有一个完整的废话。有适当的计算线性代数方法,其计算稳定性和可靠性更高。实施一种或另一种方法的决定是开发者的判断调用;除了 fast 部分之外,还需要考虑该方法的稳健性。没有冒犯,但我会在大多数情况下采用一种快速而肮脏的方法来稳定缓慢的方法。