Weka的PCA运行时间太长

我正在尝试使用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中获得PCA – 使用weka或替代库。
为此增加了赏金。

在加深WEKA代码后,瓶颈创建协方差矩阵,然后计算该矩阵的特征向量。 即使尝试切换到sparsed矩阵实现(我使用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); 

然而,当我对估计的准确度进行交叉validation时,这种方法得分更差,然后使用贪婪的信息增益和排名。

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

看看PrincipalComponents的选项。

  1. 我不确定-D意味着他们会为你正常化,或者你必须自己做。 您希望数据标准化(以均值为中心),所以我先自己手动完成。
  2. -R设置您想要计算的方差量。 默认值为0.95 。 您的数据中的相关性可能不太好,因此请尝试将其设置为低至0.8
  3. -A设置要包括的最大属性数。 我认为默认是所有这些。 同样,你应该尝试将它设置为更低的值。

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

最好

为了构建协方差矩阵,您可以使用matlab也使用的以下公式。 它比apache库快。

在此处输入图像描述

因此,Matrix是一个mxn矩阵。 (m – > #databaseFaces)