我想使用的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);
。
我的问题是:预计秧鸡的PCA这么长的计算时间? 还是我用错PCA?
如果从长远来看,时间预计:
我怎样才能调整PCA算法运行得更快? 您能否提供一个替代? (+示例代码如何使用它)?
如果不是:
我究竟做错了什么? 我应该如何调用PCA使用秧鸡拿到我的降维?
更新:评论证实了我的怀疑,它正在采取比预期更多的时间。
我想知道 :我怎样才能在Java中获得PCA -使用秧鸡或备选库。
新增的赏金这一个。
在WEKA代码深化之后,瓶颈正在创建的协方差矩阵,然后计算该矩阵的特征向量。 即使尝试切换到矩阵疏林实现(我用COLT的SparseDoubleMatrix2D )并没有帮助。
我想出了首先降低使用第一快速方法的维数的溶液(I使用的信息增益排名器,并且基于文档frequencey滤波),然后使用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);
但是,这种方法取得了差那么用贪婪的信息增益和排序器,当I交叉验证用于估计的准确性。
它看起来像你使用的PCA,其中由长期运行的情况来看,很可能是做了太多的工作,你的目的的默认配置。
看看的选项PrincipalComponents 。
- 我不知道如果
-D
意味着他们将它归为你或者你必须自己做。 您希望您的数据进行归一化(为中心的意思)了,所以我就自己做手工第一。 -
-R
设置要将占方差的量。 默认值是0.95
。 在您的数据的相关性可能不是很好,所以尽量状下将其设置为东西0.8
。 -
-A
设置属性包括的最大数量。 我相信默认为所有的人。 再次,你应该尝试将其设置为较低值。
我建议首先以非常宽松的设置开始了(例如-R=0.1
和-A=2
),那么工作的方式达到可接受的结果。
最好
为您的协方差矩阵的结构,你可以使用下面的公式,也使用MATLAB。 这是更快,那么Apache的库。
由此矩阵是m×n矩阵。 (米 - > #databaseFaces)