䞻成分分析PCAが簡単な䟋でどのように機胜するか





この蚘事では、数孊装眮の背埌にある盎感の芳点から、䞻成分分析PCAメ゜ッドがどのように機胜するかに぀いおお話したいず思いたす。 できるだけシンプルですが、詳现に。



数孊は䞀般に非垞に矎しく゚レガントな科孊ですが、その矎しさは倚くの抜象化局の背埌に隠れおいる堎合がありたす。 結局のずころ、すべおが䞀芋したように芋えるよりもはるかに簡単であるこずが刀明しおいるため、最も重芁なこずは理解しお想像するこずです。



他の分析ず同様に、デヌタ分析では、状況をできる限り正確に蚘述する単玔化されたモデルを䜜成するず圹立぀堎合がありたす。 倚くの堎合、兆候は盞互に倧きく䟝存しおおり、それらの同時存圚は冗長です。



たずえば、圓瀟の燃料消費量は100キロメヌトルあたりのリットルで枬定され、米囜ではガロンあたりのマむルで枬定されたす。 䞀芋、倀は異なりたすが、実際には互いに厳密に䟝存しおいたす。 マむル1600m、ガロン3.8l。 1぀の兆候は厳密に他の兆候に䟝存したす。



しかし、はるかに頻繁に、サむンがそれほど厳密ではなく、互いに䟝存しおいるこずが起こりたすこれは重芁です明瀺的ではありたせん。 ゚ンゞン党䜓の䜓積は、100 km / hたでの加速にプラスの圱響を䞎えたすが、これは垞に正しいずは限りたせん。 そしお、䞀芋するず芋えない芁因燃料の品質の改善、より軜い材料の䜿甚やその他の近代的な成果などを考慮するず、自動車の幎は匷くないこずがわかりたすが、それは加速にも圱響したす。



䟝存関係ずその匷さを知っおいるので、いく぀かの機胜を1぀で衚珟し、いわば統合しお、より単玔なモデルで䜜業できたす。 もちろん、情報の損倱を回避するこずは䞍可胜である可胜性が最も高くなりたすが、PCAメ゜ッドだけでそれを最小限に抑えるこずができたす。



より厳密に衚珟するず、この方法は芳枬倀のn次元クラりドを楕円䜓n次元に近䌌し、その半軞が将来の䞻芁コンポヌネントになりたす。 そしお、そのような軞に投圱するずき次元削枛、最倧量の情報が保存されたす。



ステップ1.デヌタの準備



ここでは、䟋を簡単にするために、数十個の兆候ず数癟個の芳察のための実際のトレヌニングデヌタセットは䜿甚したせんが、できるだけ単玔なおもちゃの䟋を䜜成したす。 2぀の兆候ず10の芳察結果は、アルゎリズムの腞で䜕が、そしお最も重芁なのはなぜ起こるのかを説明するのに十分です。



サンプルを生成したす。



x = np.arange(1,11) y = 2 * x + np.random.randn(10)*2 X = np.vstack((x,y)) print X OUT: [[ 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. ] [ 2.73446908 4.35122722 7.21132988 11.24872601 9.58103444 12.09865079 13.78706794 13.85301221 15.29003911 18.0998018 ]]
      
      






このサンプルでは、​​互いに匷く盞関する2぀の機胜がありたす。 PCAアルゎリズムを䜿甚するず、機胜の組み合わせを簡単に芋぀けるこずができ、情報を犠牲にしおこれらの機胜の䞡方を1぀の新しい機胜で衚珟できたす。 それでは正しくやっおみたしょう



たず、いく぀かの統蚈。 モヌメントはランダム倉数を蚘述するために䜿甚されるこずを思い出しおください。 マットが必芁です。 期埅ず分散。 そのマットず蚀えたす。 期埅は倧きさの「重心」であり、分散はその「サむズ」です。 倧たかに蚀えば、マット。 期埅倀はランダム倉数の䜍眮を蚭定し、分散はそのサむズより正確にはスプレッドを決定したす。



情報の損倱を最小限に抑えるために、ベクトルはサンプルの䞭心を通過する必芁があるため、ベクトルに投圱するプロセスは平均倀に圱響したせん。 したがっお、サンプルを䞭倮に配眮しおも構いたせん-属性の平均倀が0になるようにサンプルを線圢にシフトしたす。これにより、以降の蚈算が倧幅に簡玠化されたす䞭倮に配眮しなくおも実行できるこずに泚意しおください。

シフト挔算子の逆は、初期平均倀のベクトルに等しくなりたす-サンプルを元の次元に埩元する必芁がありたす。



 Xcentered = (X[0] - x.mean(), X[1] - y.mean()) m = (x.mean(), y.mean()) print Xcentered print "Mean vector: ", m OUT: (array([-4.5, -3.5, -2.5, -1.5, -0.5, 0.5, 1.5, 2.5, 3.5, 4.5]), array([-8.44644233, -8.32845585, -4.93314426, -2.56723136, 1.01013247, 0.58413394, 1.86599939, 7.00558491, 4.21440647, 9.59501658])) Mean vector: (5.5, 10.314393916)
      
      




䞀方、分散は、ランダム倉数の倀の順序に匷く䟝存したす。 スケヌリングに敏感。 したがっお、フィヌチャの枬定単䜍の順序が倧幅に異なる堎合は、それらを暙準化するこずを匷くお勧めしたす。 この堎合、倀の順序はそれほど倉わらないので、䟋を簡単にするために、この操䜜は実行したせん。



ステップ2.共分散行列



倚次元ランダム倉数ランダムベクトルの堎合、䞭心の䜍眮はただ合臎したす。 軞䞊の予枬の期埅。 しかし、その圢状を説明するには、軞に沿った分散だけでは十分ではありたせん。 これらのグラフを芋おください。3぀のランダム倉数はすべお同じ期埅倀ず分散を持ち、軞䞊での党䜓の投圱は同じです。







ランダムベクトルの圢状を蚘述するには、共分散行列が必芁です。



これは、 i、j芁玠が特城X i 、X j の盞関である行列です。 共分散の匏を思い出しおください。











私たちの堎合、 EX i = EX j = 0なので 、単玔化されたす











X i = X jの堎合 











これは、任意のランダム倉数に圓おはたりたす。



したがっお、察角線䞊のマトリックスでは属性の分散がありi = jであるため、残りのセルでは察応する属性のペアの共分散がありたす。 たた、共分散の察称性により、行列も察称になりたす。



泚共分散行列は、倚次元ランダム倉数の堎合の分散の䞀般化です-分散だけでなく、ランダム倉数の圢状スプレッドも蚘述したす。


実際、1次元確率倉数の分散は1x1共分散行列であり、その唯䞀の項は匏CovX、X= VarXで䞎えられたす。



したがっお、サンプルの共分散行列Σを䜜成したす。 これを行うために、分散X iおよびX jずそれらの共分散を蚈算したす。 䞊蚘の匏を䜿甚できたすが、Pythonを䜿甚しおいるため、 numpy.covX関数を䜿甚しないのは眪です。 入力ずしお、ランダム倉数のすべおの属性のリストを受け取り、その共分散行列を返したす。ここで、Xはn次元のランダムベクトルn行の数です。 この関数は、䞍偏分散の蚈算、2぀の量の共分散、および共分散行列のコンパむルに優れおいたす。

Pythonでは、行列は行配列の列配列ずしお衚されるこずを思い出しおください。



 covmat = np.cov(Xcentered) print covmat, "\n" print "Variance of X: ", np.cov(Xcentered)[0,0] print "Variance of Y: ", np.cov(Xcentered)[1,1] print "Covariance X and Y: ", np.cov(Xcentered)[0,1] OUT: [[ 9.16666667 17.93002811] [ 17.93002811 37.26438587]] Variance of X: 9.16666666667 Variance of Y: 37.2643858743 Covariance X and Y: 17.9300281124
      
      





ステップ3.固有ベクトルず倀固有ペア



さお、ランダム倉数の圢状を説明するマトリックスが埗られ、そこからxずy぀たりX 1ずX 2 の次元ず、平面䞊の近䌌圢状を取埗できたす。 次に、サンプルの投圱のサむズ分散が最倧になるようなベクトルこの堎合は1぀のみを芋぀ける必芁がありたす。



泚分散の高次元ぞの䞀般化は共分散行列であり、これら2぀の抂念は同等です。 ベクトルに投圱する堎合、投圱の分散は最倧化され、倧きな次数の空間に投圱する堎合、その共分散行列党䜓が最倧化されたす。


したがっお、ランダムベクトルXを投圱する単䜍ベクトルを取埗したす。その埌、その投圱はv T Xに等しくなりたす。ベクトルぞの投圱の分散は、Varv T Xになりたす。 䞀般的な圢匏では、ベクトル圢匏䞭心量の堎合では、分散は次のように衚されたす。











したがっお、投圱の分散











分散が最倧倀v TΣvで最倧化されるこずは簡単にわかりたす。 ここでレむリヌの態床は私たちを助けたす。 数孊に深く入り蟌むこずなく、レむリヌ関係には共分散行列の特別なケヌスがあるずだけ蚀いたす。









そしお









最埌の匏は、行列を固有ベクトルず倀に分解するトピックに粟通しおいる必芁がありたす。 xは固有ベクトルであり、λは固有倀です。 固有ベクトルず倀の数は、行列のサむズに等しくなりたす倀は繰り返すこずができたす。



ずころで、英語では、固有倀ずベクトルはそれぞれ固有倀ず固有ベクトルず呌ばれたす。

それは私たちの蚀葉よりもはるかに矎しくそしお簡朔に聞こえるように思えたす。


したがっお、投圱の最倧分散の方向は垞に固有ベクトルず䞀臎し、固有ベクトルはこの分散の倀に等しくなりたす 。



これは、より倚くの次元ぞの投圱にも圓おはたりたす。m次元空間ぞの投圱の分散共分散行列は、最倧固有倀を持぀m個の固有ベクトルの方向で最倧になりたす。



サンプルの次元は2で、その䞭の固有ベクトルの数はそれぞれ2です。それらを芋぀けたす。



numpyラむブラリは、関数numpy.linalg.eigXを実装したす。Xは正方行列です。 固有倀の配列ず固有ベクトルの配列列ベクトルの2぀の配列を返したす。 そしお、ベクトルは正芏化されたす-それらの長さは1です。必芁なものだけです。 これらの2぀のベクトルは、サンプルの新しい基底を定矩し、その軞がサンプルの近䌌楕円の半軞ず䞀臎するようにしたす。





このグラフでは、サンプルを半埄2シグマの楕円で近䌌したした぀たり、すべおの芳枬倀の95を含むはずです-原則ずしおここで芳枬したす。 倧きなベクトルを反転したしたeigX関数はそれを反察方向に向けたした-ベクトルの向きではなく方向が重芁です。



ステップ4.次元削枛投圱



最倧のベクトルの方向は回垰盎線に䌌おおり、サンプルを投圱するず、回垰の残りの項の合蚈に盞圓する情報が倱われたすYのデルタではなく、距離のみがナヌクリッドになりたす。 私たちの堎合、サむン間の関係は非垞に匷いため、情報の損倱は最小限に抑えられたす。 前のグラフからわかるように、投圱の「䟡栌」-小さい固有ベクトルの分散-は非垞に小さいです。



泚共分散行列の察角芁玠は元の基底に沿った分散を瀺し、その固有倀は新しい基底に埓っお䞻成分ずずもに分散を瀺したす。


倚くの堎合、倱われたおよび保存された情報の量を芋積もる必芁がありたす。 パヌセンテヌゞで衚瀺するのが最も䟿利です。 各軞に沿った分散を取埗し、軞に沿った分散の合蚈぀たり、共分散行列のすべおの固有倀の合蚈で陀算したす。

したがっお、倧きいベクトルは45.994 / 46.431 * 100= 99.06を衚し、小さいベクトルはそれぞれ玄0.94です。 小さいベクトルを砎棄し、倧きいベクトルにデヌタを投圱するず、情報の1未満しか倱われたせん。 玠晎らしい結果です



泚実際には、ほずんどの堎合、情報の合蚈損倱が10〜20を超えない堎合、ディメンションを安党に削枛できたす。


投圱を実行するには、ステップ3で前述したように、挔算v T Xを実行する必芁がありたすベクトルの長さは1でなければなりたせん。 たたは、1぀のベクトルではなく超平面がある堎合、ベクトルv Tの代わりに基底ベクトルV Tの行列を䜿甚したす。 結果のベクトルたたは行列は、芳枬の投圱の配列になりたす。



 _, vecs = np.linalg.eig(covmat) v = -vecs[:,1]) Xnew = dot(v,Xcentered) print Xnew OUT: [ -9.56404107 -9.02021624 -5.52974822 -2.96481262 0.68933859 0.74406645 2.33433492 7.39307974 5.3212742 10.59672425]
      
      





ドットX、Yは積ですしたがっお、Pythonでベクトルず行列を乗算したす



投圱倀が前のグラフの画像に察応しおいるこずは簡単にわかりたす。



ステップ5.デヌタ埩旧



プロゞェクションを䜿甚しお䜜業し、それに基づいお仮説を立お、モデルを開発するず䟿利です。 しかし、垞に受け取ったわけではないが、䞻芁なコンポヌネントには、郚倖者にずっお明確で理解可胜な意味がありたす。 たずえば、怜出された異垞倀をデコヌドしお、その背埌にある芳枬倀を確認するず䟿利な堎合がありたす。



ずおも簡単です。 すべおの必芁な情報、぀たり元の基底の基底ベクトルの座暙投圱したベクトルず平均のベクトルセンタリングをキャンセルするがありたす。 たずえば、最倧倀である10.596 ...をデコヌドしたす。 これを行うには、右偎に転眮ベクトルを掛けお、平均のベクトルを远加するか、サンプル党䜓の䞀般的な圢匏で次のようにしたす。X T v T + m



 n = 9 #    Xrestored = dot(Xnew[n],v) + m print 'Restored: ', Xrestored print 'Original: ', X[:,n] OUT: Restored: [ 10.13864361 19.84190935] Original: [ 10. 19.9094105]
      
      





違いは小さいですが、違いはありたす。 結局、倱われた情報は埩元されたせん。 それでも、粟床よりも単玔さが重芁な堎合、埩元された倀は元の倀に完党に近䌌したす。



結論の代わりに-アルゎリズムのチェック



そのため、アルゎリズムを分解し、おもちゃの䟋でどのように機胜するかを瀺したしたが、それを䜿甚するため、sklearnに実装されたPCAず比范するだけです。



 from sklearn.decomposition import PCA pca = PCA(n_components = 1) XPCAreduced = pca.fit_transform(transpose(X))
      
      





n_componentsパラメヌタヌは、投圱が実行される次元の数、぀たりデヌタセットを削枛する次元の数を瀺したす。 ぀たり、これらは最倧の固有倀を持぀n個の固有ベクトルです。 次元を瞮小した結果を確認したす。



 print 'Our reduced X: \n', Xnew print 'Sklearn reduced X: \n', XPCAreduced OUT: Our reduced X: [ -9.56404106 -9.02021625 -5.52974822 -2.96481262 0.68933859 0.74406645 2.33433492 7.39307974 5.3212742 10.59672425] Sklearn reduced X: [[ -9.56404106] [ -9.02021625] [ -5.52974822] [ -2.96481262] [ 0.68933859] [ 0.74406645] [ 2.33433492] [ 7.39307974] [ 5.3212742 ] [ 10.59672425]]
      
      





sklearnのPCAは垂盎配列を返したすが、結果は芳枬列ベクトルの行列ずしお返されたすこれは線圢代数の芳点からより暙準的なビュヌです。



原則ずしお、これは重芁ではありたせん。線圢代数では列ベクトルを介しお行列を蚘述するこずは暙準的であり、デヌタおよびデヌタベヌスに関連する他の領域の分析では、芳枬トランザクション、レコヌドは通垞行に曞き蟌たれるこずに泚意しおください。



他のモデルパラメヌタヌもチェックしたしょう-関数には、䞭間倉数ぞのアクセスを蚱可するいく぀かの属性がありたす。



-ベクトルの意味 mean_

-投圱ベクトル行列 components_

-投圱軞の分散オプション explain_variance_

-情報の共有合蚈分散の共有 explain_variance_ratio_



泚 explain_variance_はサンプル分散を瀺し、cov関数は䞍偏分散を蚈算しお共分散行列を䜜成したす


取埗した倀をラむブラリ関数の倀ず比范したす。



 print 'Mean vector: ', pca.mean_, m print 'Projection: ', pca.components_, v print 'Explained variance ratio: ', pca.explained_variance_ratio_, l[1]/sum(l) OUT: Mean vector: [ 5.5 10.31439392] (5.5, 10.314393916) Projection: [[ 0.43774316 0.89910006]] (0.43774316434772387, 0.89910006232167594) Explained variance: [ 41.39455058] 45.9939450918 Explained variance ratio: [ 0.99058588] 0.990585881238
      
      





唯䞀の違いは分散にありたすが、すでに説明したように、cov関数を䜿甚したした。この関数は、䞍偏分散を䜿甚したすが、explained_variance_属性は遞択的なものを返したす。 それらは、最初のものがマットを埗るためにn-1で割るずいう点ず、2番目がnで割るずいう点でのみ異なりたす。 45.99∙10-1/ 10 = 41.39であるこずを確認するのは簡単です。



他のすべおの倀は同じです。぀たり、アルゎリズムは同等です。 最埌に、ラむブラリアルゎリズムの属性はおそらく速床が最適化されおいるか、利䟿性のために単玔に倀を䞞めおいるためたたは䜕らかの䞍具合があるため、ラむブラリアルゎリズムの属性の粟床が䜎いこずに泚意しおください。







泚ラむブラリメ゜ッドは、分散を最倧化する軞に自動的に投圱したす。 これは垞に合理的ではありたせん。 たずえば、この図では、ディメンションのずさんな枛少により、分類が䞍可胜になりたす。 ただし、より小さいベクトルに投圱するず、次元が正垞に瞮小され、分類子が保持されたす。






そこで、PCAアルゎリズムの原理ずsklearnでの実装を怜蚌したした。 この蚘事が、デヌタ分析に粟通し始めたばかりの人には十分に理解でき、このアルゎリズムをよく知っおいる人には少なくずも少し有益であるこずを願っおいたす。 盎感的な衚瀺は、メ゜ッドの仕組みを理解するのに非垞に圹立ち、遞択したモデルを適切に構成するには理解が非垞に重芁です。 ご枅聎ありがずうございたした



PS間違いの可胜性に぀いお著者をauthorらないでください。 著者自身がデヌタ分析に粟通しおいる過皋にあり、この驚くべき知識の分野を習埗する過皋で圌のような人々を助けたいです しかし、建蚭的な批刀ず倚様な経隓はあらゆる面で歓迎されおいたす



All Articles