Weka的主成分分析(PCA)运行时间太长。

10

我正在尝试使用Weka工具进行PCA算法的特征选择。

我的原始数据包含大约9000个属性和2700个样本。
我尝试使用以下代码来降低数据的维度:

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并获得降维后的数据?

更新:评论证实了我的怀疑,它花费了比预期更多的时间。
我想知道:如何在Java中使用weka或其他库获得PCA。
为此添加了奖励。


1
@GuyAdini,PCA并不仅仅是矩阵乘法;它是一个更加困难的问题。虽然不足以证明需要12小时,但仍然如此。 - Don Reba
1
@GuyAdini,计算这些特征向量是计算的主要部分。最粗糙的方法是对协方差矩阵进行大幂次运算。 - Don Reba
2
我不知道这个问题为什么被踩了(而且是在发布半年后)。它展示了研究成果(我发布了我使用的代码),我相信问题非常清晰(尽管解决方案可能不是),并且我认为对于任何需要使用Weka进行PCA的人来说都是有用的,特别是在具有大量特征空间的情况下。 - amit
@amit,我问你这个问题是因为看起来你已经在文本分类方面做过工作,请帮帮我。KNN的输入应该是什么?有没有开源的KNN? - Ashish
@阿米特先生,我的问题可能不太清楚,但如果您回复我,我可以解释我的问题。请您帮帮我。 - Ashish
显示剩余8条评论
3个回答

11
在深入研究WEKA代码后,瓶颈在于创建协方差矩阵,然后计算该矩阵的特征向量。即使尝试切换到稀疏矩阵实现(使用COLTSparseDoubleMatrix2D),也没有帮助。
我想出的解决方案是首先使用快速方法降低维度(我使用了信息增益排名器,并基于文档频率进行过滤),然后对降低后的维度使用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
我能看到这个完整的代码吗?包括如何进行交叉验证以估计准确性。 - ealeon

4
看起来你正在使用PCA的默认配置,根据长时间运行的情况,很可能它为你的目的做了太多的工作。
请查看PrincipalComponents的选项。
  1. 我不确定-D是否意味着它们会为您进行归一化处理,或者您必须自己处理。但是你希望你的数据被归一化(围绕平均值中心化),所以我建议你先手动处理。
  2. -R设置你想要解释的方差量。默认值为0.95。你的数据相关性可能不好,所以尝试将其设置得更低,例如0.8
  3. -A设置要包含的属性的最大数量。我认为默认值是所有属性。同样,你应该尝试将它设置为更低的值。
我建议首先使用非常宽松的设置(例如-R=0.1-A=2),然后逐步提高到可接受的结果。

它现在已经运行了约2个小时,使用{"-R=0.1", "-A=2"}参数,但没有成功。也值得一提的是:我的样本非常稀疏,原始样本来自评论的BOW模型。 - amit
这看起来有点奇怪。为什么不直接在MATLAB/Python中手动编程(使用Python的免费numpy/scipy计算特征值),然后看看需要多长时间?这个算法真的只需要两行代码。 - Guy Adini
@amit:确实很奇怪。如果您的数据是稀疏的,那么切换到PCA的稀疏实现可能会显著加快速度。 - tskuzzy
1
感谢您的输入。参数不是问题所在。它没有加速计算(我认为它只有帮助选择要选择的特征数量,但我可能错了)。我必须先使用快速方法减少维度,然后在减少的数据上使用PCA。我添加了一个回答,提供更多细节。无论如何,感谢您的输入。 - amit
抱歉,提醒一下,链接已经失效。@2016年11月 - ldmtwo

1

最佳选择

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

enter image description here

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接