10

我正在尝试使用 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 并获得降维?

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

4

3 回答 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);

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

于 2012-08-03T09:29:49.397 回答
4

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

看看PrincipalComponents的选项。

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

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

于 2012-07-19T00:59:37.587 回答
1

最好的

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

在此处输入图像描述

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

于 2016-01-07T22:40:23.603 回答