【问题标题】:Principal Component Analysis being too slow (MLPY Python)主成分分析太慢(MLPY Python)
【发布时间】:2015-07-16 14:40:28
【问题描述】:

我在 python (http://mlpy.sourceforge.net/docs/3.2/dim_red.html) 中使用来自 MLPY API 的 PCAFast 方法

当它学习到如下生成的特征矩阵时,该方法执行得非常快:

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 特征矩阵中的数据类型有关?

关于如何解决这个问题的任何想法?

【问题讨论】:

    标签: pca python dimensionality-reduction


    【解决方案1】:

    这是一个糟糕的(条件差的)矩阵,无法运行主成分分析。它的特征值为零(这本身可能有问题),其余的特征值为 1(您可以将行彼此相减以获得退化矩阵)。 Python 的特征系统求解器的实现可能很差,该求解器依赖于合理规则的矩阵(所有特征值都是不同的,并且与零和彼此充分分离)。我不熟悉该方法,但我的感觉,基于快速定点的标题,它们依赖于放大特征值的乘法属性:if Akλkuk uk' 用于适当的正交向量 ukλ1 > λ2 > ... > λp > 0,则 An ≈ λ1u1u1' 足够大幂次n。当您将一组元素作为输入时,这个想法根本不起作用:您只是不断获得一个不与其他元素分离的顶部特征值。更糟糕的是,对于您输入的特定矩阵, (7·10-5)20 接近可以表示为双精度的矩阵精度数。最后,您的输出可能完全是废话。有一些适当的计算线性代数方法在计算上更加稳定和可靠。实施一种或另一种方法的决定是开发人员的判断调用;除了 fast 部分之外,还需要考虑该方法的稳健性。无意冒犯,但在大多数情况下,我会采用稳定的慢速方法而不是快速而肮脏的方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-16
      • 2013-03-31
      • 2012-10-24
      • 2013-08-24
      • 2014-04-08
      • 2018-12-06
      相关资源
      最近更新 更多