19

多次元データ (132 次元) の大規模なデータセットがあります。

私はデータマイニングの初心者で、Matlab を使用して主成分分析を適用したいと考えています。しかし、ウェブ上で説明されている関数がたくさんあるのを見てきましたが、それらをどのように適用すればよいのかわかりません。

基本的に、PCA を適用して、データから固有ベクトルとそれに対応する固有値を取得したいと考えています。

このステップの後、取得した固有ベクトルの選択に基づいてデータの再構成を実行できるようにしたいと考えています。

これは手動で行うことができますが、既に最適化されている必要があるため、これを行うことができる事前定義された関数があるかどうか疑問に思っていました。

私の初期データは : のようなものですsize(x) = [33800 132]。だから基本的に私は132特徴(次元)と33800データポイントを持っています。そして、このデータセットに対して PCA を実行したいと思います。

ヘルプやヒントは何でも構いません。

4

2 に答える 2

48

簡単なチュートリアルを次に示します。まず、隠し変数 (または「因子」) のマトリックスを作成します。100 個の観測値があり、2 つの独立した要因があります。

>> factors = randn(100, 2);

ローディングマトリックスを作成します。これにより、隠し変数が観測変数にマッピングされます。観測された変数に 4 つの特徴があるとします。次に、ローディングマトリックスが必要です4 x 2

>> loadings = [
      1   0
      0   1
      1   1
      1  -1   ];

これは、最初に観察された変数が最初の因子に負荷をかけ、2 番目の変数が 2 番目の因子に負荷をかけ、3 番目の変数が因子の合計に負荷をかけ、4 番目の変数が因子の差に負荷をかけることを示しています。

次に、観測を作成します。

>> observations = factors * loadings' + 0.1 * randn(100,4);

実験誤差をシミュレートするために少量のランダム ノイズを追加しました。pca次に、統計ツールボックスの関数を使用して PCA を実行します。

>> [coeff, score, latent, tsquared, explained, mu] = pca(observations);

変数scoreは、主成分スコアの配列です。これらは構築によって直交し、確認できます-

>> corr(score)
ans =
    1.0000    0.0000    0.0000    0.0000
    0.0000    1.0000    0.0000    0.0000
    0.0000    0.0000    1.0000    0.0000
    0.0000    0.0000    0.0000    1.0000

組み合わせscore * coeff'は、観察の中心バージョンを再現します。平均値muは、PCA を実行する前に差し引かれます。元の観察結果を再現するには、元に戻す必要があります。

>> reconstructed = score * coeff' + repmat(mu, 100, 1);
>> sum((observations - reconstructed).^2)
ans =
   1.0e-27 *
    0.0311    0.0104    0.0440    0.3378

元のデータの近似値を取得するために、計算された主成分から列の削除を開始できます。どの列を削除するかを理解するために、explained変数を調べます

>> explained
explained =
   58.0639
   41.6302
    0.1693
    0.1366

エントリは、分散の何パーセントが各主成分によって説明されるかを示します。最初の 2 つの成分が 2 番目の 2 つの成分よりも有意であることがはっきりとわかります (それらは、それらの間の分散の 99% 以上を説明しています)。最初の 2 つの成分を使用して観測値を再構築すると、ランク 2 の近似が得られます。

>> approximationRank2 = score(:,1:2) * coeff(:,1:2)' + repmat(mu, 100, 1);

プロットを試すことができます:

>> for k = 1:4
       subplot(2, 2, k);
       hold on;
       grid on
       plot(approximationRank2(:, k), observations(:, k), 'x');
       plot([-4 4], [-4 4]);
       xlim([-4 4]);
       ylim([-4 4]);
       title(sprintf('Variable %d', k));
   end

ここに画像の説明を入力

元の観測をほぼ完全に再現しています。より粗い近似が必要な場合は、最初の主成分のみを使用できます。

>> approximationRank1 = score(:,1) * coeff(:,1)' + repmat(mu, 100, 1);

それをプロットし、

>> for k = 1:4
       subplot(2, 2, k);
       hold on;
       grid on
       plot(approximationRank1(:, k), observations(:, k), 'x');
       plot([-4 4], [-4 4]);
       xlim([-4 4]);
       ylim([-4 4]);
       title(sprintf('Variable %d', k));
   end

ここに画像の説明を入力

今回の再構築はあまり良くありません。これは、意図的に 2 つの要素を持つようにデータを構築し、そのうちの 1 つから再構築しているだけだからです。

元のデータを作成した方法とその複製との間に示唆的な類似性があるにもかかわらず、

>> observations  = factors * loadings'  +  0.1 * randn(100,4);
>> reconstructed = score   * coeff'     +  repmat(mu, 100, 1);

と の間、またはfactorsとの間に必ずしも対応があるとは限りません。PCA アルゴリズムは、データの構成方法については何も知りません。連続する各コンポーネントでできる限り多くの分散を説明しようとするだけです。scoreloadingscoeff


ユーザー @Mari はコメントで、再構成誤差を主成分の数の関数としてプロットする方法を尋ねました。上記の変数を使用するのexplainedは非常に簡単です。効果を説明するために、より興味深い因子構造を持つデータを生成します -

>> factors = randn(100, 20);
>> loadings = chol(corr(factors * triu(ones(20))))';
>> observations = factors * loadings' + 0.1 * randn(100, 20);

これで、すべての観測値が重要な共通因子に負荷され、他の因子の重要性が低下します。前と同じように PCA 分解を取得できます

>> [coeff, score, latent, tsquared, explained, mu] = pca(observations);

説明された分散のパーセンテージを次のようにプロットします。

>> cumexplained = cumsum(explained);
   cumunexplained = 100 - cumexplained;
   plot(1:20, cumunexplained, 'x-');
   grid on;
   xlabel('Number of factors');
   ylabel('Unexplained variance')

ここに画像の説明を入力

于 2012-10-02T11:15:27.560 に答える
6

http://homepage.tudelft.nl/19j49/Matlab_Toolbox_for_Dimensionality_Reduction.htmlにはかなり優れた次元削減ツールボックスがあります。PCA 以外にも、このツールボックスには次元削減のためのアルゴリズムがたくさんあります。

PCA の実行例:

Reduced = compute_mapping(Features, 'PCA', NumberOfDimension);
于 2012-10-02T16:17:21.780 に答える