【问题标题】:Weka's PCA is taking too long to runWeka 的 PCA 运行时间过长
【发布时间】:2012-07-13 23:45:59
【问题描述】:

我正在尝试使用 Weka 通过 PCA 算法进行特征选择。

我的原始特征空间在 2700 个样本中包含约 9000 个属性。
我尝试使用以下代码降低数据的维度:

AttributeSelection selector = new AttributeSelection();
PrincipalComponents pca = new PrincipalComponents();
Ranker ranker = new Ranker();
selector.setEvaluator(pca);
selector.setSearch(ranker);
Instances instances = SamplesManager.asWekaInstances(trainSet);
try { 
    selector.SelectAttributes(instances);
    return SamplesManager.asSamplesList(selector.reduceDimensionality(instances));
} catch (Exception e ) {
            ...
}

但是,它没有在 12 小时内完成运行。卡在selector.SelectAttributes(instances);方法中。

我的问题是: weka 的 PCA 需要这么长的计算时间吗?还是我错误地使用了 PCA?

如果预计运行时间较长:
如何调整 PCA 算法以使 运行得更快?你能建议一个替代方案吗? (+示例代码如何使用)?

如果不是:
我做错了什么?我应该如何使用 weka 调用 PCA 并获得降维?

更新: cmets 证实了我的怀疑,即它花费的时间比预期的要长得多。
我想知道:如何在 java 中获得 PCA - 使用 weka 或替代库。
为此添加了赏金。

【问题讨论】:

  • 我不知道 weka,但这不是一个合理的时间量。 PCA 的运行时间与矩阵乘法一样长(因为本质上就是这样)。
  • @GuyAdini:我认为这是不合理的,我在滥用它。你知道我可以使用的开源库[最好是java]吗? [我也很乐意获得如何使用它的示例代码]
  • @GuyAdini,PCA 本质上不是矩阵乘法;这是一个困难得多的问题。不足以证明 12 小时的合理性,但仍然如此。
  • @GuyAdini,计算这些特征向量是计算的主要部分。最粗略的方法是采用协方差矩阵的大幂。
  • 我不知道这个问题被否决了(在它发布半年后)。它显示了研究(我发布了我使用的代码),我相信问题非常清楚(尽管解决方案可能不是),并且我相信它对于需要使用具有大特征空间的 Weka 使用 PCA 的任何人都很有用。

标签: java algorithm machine-learning weka


【解决方案1】:

在 WEKA 代码中深入后,瓶颈是创建协方差矩阵,然后计算这个矩阵的特征向量。即使尝试切换到稀疏矩阵实现(我使用COLT 的SparseDoubleMatrix2D)也无济于事。

我想出的解决方案是首先使用第一种快速方法降低维度(我使用了信息增益排序器,以及基于文档频率的过滤),然后在降低的维度上使用 PCA 进一步降低它。

代码比较复杂,但基本上可以归结为:

Ranker ranker = new Ranker();
InfoGainAttributeEval ig = new InfoGainAttributeEval();
Instances instances = SamplesManager.asWekaInstances(trainSet);
ig.buildEvaluator(instances);
firstAttributes = ranker.search(ig,instances);
candidates = Arrays.copyOfRange(firstAttributes, 0, FIRST_SIZE_REDUCTION);
instances = reduceDimenstions(instances, candidates)
PrincipalComponents pca = new PrincipalComponents();
pca.setVarianceCovered(var);
ranker = new Ranker();
ranker.setNumToSelect(numFeatures);
selection = new AttributeSelection();
selection.setEvaluator(pca);
selection.setSearch(ranker);
selection.SelectAttributes(instances );
instances = selection.reduceDimensionality(wekaInstances);

但是,当我对估计的准确度进行交叉验证时,这种方法的得分比使用贪婪信息增益和排名器的方法要差。

【讨论】:

  • 我可以看到完整的代码吗?包括如何为估计的准确性进行交叉验证
【解决方案2】:

看起来您正在使用 PCA 的默认配置,从较长的运行时间来看,它可能为您的目的做了太多工作。

查看PrincipalComponents 的选项。

  1. 我不确定-D 是否意味着他们会为您标准化,或者您是否必须自己做。不过,您希望您的数据标准化(以均值为中心),所以我会先自己手动执行此操作。
  2. -R 设置您想要考虑的差异量。默认为0.95。您的数据中的相关性可能不好,因此请尝试将其设置为较低的值,例如 0.8。
  3. -A 设置要包含的最大属性数。我认为默认值是所有这些。同样,您应该尝试将其设置为更低的值。

我建议首先从非常宽松的设置开始(例如-R=0.1 和-A=2),然后逐步达到可接受的结果。

【讨论】:

  • 它现在使用{"-R=0.1", "-A=2"} 运行了大约 2 个小时,但没有成功。可能还值得一提:我的样本非常稀疏,原始样本取自 cmets 的 BOW 模型。
  • 这开始看起来很奇怪。为什么不直接在 MATLAB/Python 中手动编程(使用 Python 的免费 numpy/scipy 计算特征值),看看需要多长时间?该算法实际上是两行代码。
  • @amit:这确实很奇怪。如果您的数据稀疏,则可能值得切换到 PCA 的稀疏实现,这将显着加快速度。
  • 感谢您的意见。参数不是问题。它并没有加快计算速度(我认为它不会,我认为它只会帮助它选择要选择的特征数量,但我可能是错的)。我必须首先使用快速方法来降低维度,然后对缩减后的数据使用 PCA。我添加了一个提供更多细节的答案。无论如何感谢您的意见。
  • 仅供参考链接已损坏。 @ 2016 年 11 月
【解决方案3】:

最好的

对于协方差矩阵的构造,您可以使用 matlab 也使用的以下公式。它比 apache 库更快。

其中 Matrix 是一个 m x n 矩阵。 (m --> #databaseFaces)

【讨论】:

    猜你喜欢
    • 2020-04-16
    • 2018-04-07
    • 1970-01-01
    • 1970-01-01
    • 2016-06-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-05-12
    相关资源
    最近更新 更多