SVDとPCAの関係。SVDを使用してPCAを実行する方法


352

主成分分析(PCA)は通常、共分散行列の固有分解によって説明されます。ただし、データ行列特異値分解(SVD)を介して実行することもできます。どのように機能しますか?これら2つのアプローチの関係は何ですか?SVDとPCAの関係は何ですか?X

または、言い換えると、データ行列のSVDを使用して次元削減を実行する方法ですか?


8
このFAQスタイルの質問は、さまざまな形式で頻繁に尋ねられるため、自分の回答と一緒に書きましたが、正規のスレッドがないため、重複を閉じるのは困難です。この付随するメタスレッドでメタコメントを提供してください。
アメーバ


2
他のリンクを含む優れた詳細なアメーバの答えに加えて、これを確認することをお勧めします。PCAは他のSVDベースのテクニックと並んで考えられています。そこの議論は、PCAを説明する際のスピーチが [または ]のsvd分解を行うというわずかな違いを除いて、アメーバとほぼ同一の代数を提示します。代わりに -共分散行列の固有分解を介して行われるPCAに関連するため、単純に便利です。X/nX/n1X
ttnphns

PCAはSVDの特殊なケースです。PCAは、理想的には同じ単位のデータを正規化する必要があります。行列はPCAのnxnです。
オーヴァーコルヴァー

@OrvarKorvar:あなたは何のnxn行列について話しているのですか?
Cbhihe

回答:


412

データ行列サイズをます。ここで、はサンプル数、は変数の数です。それが中央にある仮定しましょう。つまり、列の平均が差し引かれ、ゼロになりました。Xn×pnp

次に、共分散行列は、与えられます。これは対称行列であるため、対角化することができます:ここでは固有ベクトルの行列(各列は固有ベクトルです)およびは対角線上の降順の固有値をもつ対角行列。固有ベクトルは、データの主軸または主方向と呼ばれます。主軸上のデータの射影は主成分と呼ばれ、PCスコアとも呼ばれますp×pCC=XX/(n1)

C=VLV,
VLλi; これらは、新しい、変換された変数として見ることができます。主成分番目は次式で与えられるの列目。新しいPC空間の番目のデータポイントの座標は、番目の行で指定されます。jjXViiXV

特異値分解を実行すると、分解ここで、はユニタリ行列で、は対角行列です特異値は。ここから、つまり、右特異ベクトルは主方向であり、特異値は介して共分散行列の固有値に関連することを意味します。。主成分はX

X=USV,
USsi
C=VSUUSV/(n1)=VS2n1V,
Vλi=si2/(n1)XV=USVV=US

要約する:

  1. もし、その後の列主方向/軸があります。X=USVV
  2. 列は主成分(「スコア」)です。US
  3. 特異値は介して共分散行列の固有値に関連しています。固有値は、それぞれのPCの分散を示します。λi=si2/(n1)λi
  4. 標準化されたスコアは列で与えられ、負荷は列で与えられます。「ロード」を主要な指示と混同しない理由については、たとえばここここを参照してください。n1UVS/n1
  5. 上記はが中央にある場合のみ正しい。Xその場合のみ、共分散行列は等しくなります。XX/(n1)
  6. 上記は、行にサンプルがあり、列に変数があるに対してのみ正しいです。変数が行にあり、サンプルが列にある場合、と解釈を交換します。XUV
  7. (共分散行列の代わりに)相関行列でPCAを実行したい場合、列を中央だけでなく、標準化、つまり標準偏差で割る必要があります。X
  8. データの次元をからに減らすには、最初の列、および左上部分の選択します。それらの積は、最初の PC を含む必要な行列です。pk<pkUk×kSUkSkn×kk
  9. さらに、第一乗算主軸を対応させてPCを収率元有する行列サイズですが、より低いランク(ランク)です。この行列は、最初の PC からの元のデータの再構成を提供します。再構成エラーは可能な限り最小ですこちらの回答をご覧くださいkVkXk=UkSkVkn×pkXkk
  10. 厳密に言えば、はサイズで、はサイズです。ただし、場合、最後の列は任意です(対応する行は定数ゼロです)。したがって、サイズのを返し、無駄な列を削除するエコノミーサイズ(またはthin)SVDを使用する必要があります。そうしないと、大きい、行列は不必要に大きくなります。同じことが反対の状況にも当てはまりますUn×nVp×pn>pnpUSUn×pnpUnp

その他のリンク

PCAアニメーションの回転


5
@Antoine、共分散行列は定義により x_i-に等しい。すべてのが1つの行列行としてスタックされる場合、この式はと等しくなり。場合次に中央に配置され、それは単純化の。分散について考えてください。と等しい。ただし、(つまり、データが中央に配置される)の場合、単純に平均値になります。(xix¯)(xix¯)xiX(XX¯)(XX¯)/(n1)XXX/(n1)(xix¯)2x¯=0xi2
アメーバ

2
SVDによるPCAのコードサンプル: stackoverflow.com/questions/3181593/…–
楽観主義者

1
アメーバ、私はあなたが提供したリンクに沿ってもう1つのリンクを追加する責任を負いました。それが適切であると思います。
ttnphns

2
@amoebaはい、でもなぜそれを使うのですか?また、同じ分母を使用することは可能ですか?問題は、式を見て、それをどのように使用するかを理解しようとすることです。Sλi=si2
ディム

1
@sera行列を転置して問題を取り除きます。そうしないと混乱するだけです。
アメーバ

22

@amoebaの回答に付随するPython&Numpyスニペットを作成しました。誰かに役立つ場合に備えて、ここに残しておきます。コメントは主に@amoebaの回答から取られています。

import numpy as np
from numpy import linalg as la
np.random.seed(42)


def flip_signs(A, B):
    """
    utility function for resolving the sign ambiguity in SVD
    http://stats.stackexchange.com/q/34396/115202
    """
    signs = np.sign(A) * np.sign(B)
    return A, B * signs


# Let the data matrix X be of n x p size,
# where n is the number of samples and p is the number of variables
n, p = 5, 3
X = np.random.rand(n, p)
# Let us assume that it is centered
X -= np.mean(X, axis=0)

# the p x p covariance matrix
C = np.cov(X, rowvar=False)
print "C = \n", C
# C is a symmetric matrix and so it can be diagonalized:
l, principal_axes = la.eig(C)
# sort results wrt. eigenvalues
idx = l.argsort()[::-1]
l, principal_axes = l[idx], principal_axes[:, idx]
# the eigenvalues in decreasing order
print "l = \n", l
# a matrix of eigenvectors (each column is an eigenvector)
print "V = \n", principal_axes
# projections of X on the principal axes are called principal components
principal_components = X.dot(principal_axes)
print "Y = \n", principal_components

# we now perform singular value decomposition of X
# "economy size" (or "thin") SVD
U, s, Vt = la.svd(X, full_matrices=False)
V = Vt.T
S = np.diag(s)

# 1) then columns of V are principal directions/axes.
assert np.allclose(*flip_signs(V, principal_axes))

# 2) columns of US are principal components
assert np.allclose(*flip_signs(U.dot(S), principal_components))

# 3) singular values are related to the eigenvalues of covariance matrix
assert np.allclose((s ** 2) / (n - 1), l)

# 8) dimensionality reduction
k = 2
PC_k = principal_components[:, 0:k]
US_k = U[:, 0:k].dot(S[0:k, 0:k])
assert np.allclose(*flip_signs(PC_k, US_k))

# 10) we used "economy size" (or "thin") SVD
assert U.shape == (n, p)
assert S.shape == (p, p)
assert V.shape == (p, p)

21

PCAから始めましょう。それぞれd個の数値(または次元)で構成されるn個のデータポイントがあるとします。このデータを中央に配置する(各データベクトルから平均データポイント引く)と、データを積み重ねて行列を作成できます。μxi

X=(x1TμTx2TμTxnTμT).

共分散行列

S=1n1i=1n(xiμ)(xiμ)T=1n1XTX

データが与えられるさまざまな座標がどの程度変化するかを測定します。したがって、データの変動をキャプチャするために設計されたPCAが共分散行列の観点から与えられることは驚くことではないでしょう。特に、の固有値分解は次のようになります。S

S=VΛVT=i=1rλiviviT,

ここで、は番目の主成分、またはPCであり、は番目の固有値であり、番目のPCに沿ったデータの分散にも等しくなります。この分解は、線形代数の一般的な定理に由来し、リラティーノをPCAに動機付けるために、いくつかの作業を行う必要があります。viiλiiSi

ランダムに生成されたガウスデータセットのPCA

SVDは、列スペースと行スペースの観点からマトリックスを理解する一般的な方法です。(これは、行列を行と列の空間に直観的に関係する他の行列に関して書き換える方法です。)たとえば、行列ドメインと範囲で方向と見つけることができるので、A=(1201)uivi

2x2の例のSVD

これらを見つけるには、線形変換としてのがそのドメイン内の単位球を楕円にモーフィングする方法を検討することにより、楕円の主要な半軸がおよびと整列する前画像です。ASuivi

いずれにせよ、上記のデータ行列(実際には設定だけ)に対して、SVDはXA=X

X=i=1rσiuivjT,

ここでとの固有値分解とvectors.A比較の正規直交セットである「右特異ベクトル」ことを明らかにする PCに等しく、「右特異ベクトルは、」あります{ui}{vi}Svi

ui=1(n1)λiXvi,

そして、「特異値」は、次を介してデータ行列に関連していますσi

σi2=(n1)λi.

一般に、正しい特異ベクトルは列空間にまたがっています。この特定の場合、は、番目の主成分の方向へのデータスケーリングされた投影を与えます。一般に、左の特異ベクトルはの行空間に広がります。これにより、PCのようにデータに広がる正規直交ベクトルのセットが得られます。uiXuiXiviX

この長い記事では、PCAとSVDの関係の詳細と利点について説明します。


アンサー・アンドレに感謝します。わずか2つの誤字修正:1.最後の段落では、左右を混同しています。2. Xの(大文字)式では、v_iの代わりにv_jを使用しています。
アロン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.