10

PCAアルゴリズムを使用した特徴選択にWekaを使用しようとしています。

私の元の機能スペースには、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 に答える