質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

3回答

3752閲覧

python 主成分分析(PCA)について

---stax---

総合スコア148

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

4クリップ

投稿2018/09/04 03:53

主成分分析の次元削減に関して学習しています
そこで分からないことがあるので質問させてください

※scikit-learnのPCAを使ってコードを書いています

①特徴量が30個あるデータを2つの主成分だけ維持するとした場合
この2つというのは30個ある特徴量のなかで1番分散が大きい特徴量、2番目に分散が大きい特徴量を維持する
という認識はあっているでしょうか?

②以下のように主成分を見れるコードを作成したのですが、2つの主成分に対して30個の特徴量を指しているのかなと考えるのですが
ここで表示されている30個の値は何を示しているのでしょうか?
また、2つの主成分とされているものはどの特徴量を指している、というのはどう判断するのでしょうか(そもそも①の理解が間違っているかもしれません)

理解が出来ておらず的外れな質問をしていると思いますがアドバイス宜しくお願い致します。

python

1print('PCA components shape : {}'.format(pca.components_.shape)) 2#PCA components shape : (2, 30) 3 4print('PCA components : \n {}'.format(pca.components_)) 5 6#PCA components : 7 [[ 0.21890244 0.10372458 0.22753729 0.22099499 0.14258969 0.23928535 8 0.25840048 0.26085376 0.13816696 0.06436335 0.20597878 0.01742803 9 0.21132592 0.20286964 0.01453145 0.17039345 0.15358979 0.1834174 10 0.04249842 0.10256832 0.22799663 0.10446933 0.23663968 0.22487053 11 0.12795256 0.21009588 0.22876753 0.25088597 0.12290456 0.13178394] 12 [-0.23385713 -0.05970609 -0.21518136 -0.23107671 0.18611302 0.15189161 13 0.06016536 -0.0347675 0.19034877 0.36657547 -0.10555215 0.08997968 14 -0.08945723 -0.15229263 0.20443045 0.2327159 0.19720728 0.13032156 15 0.183848 0.28009203 -0.21986638 -0.0454673 -0.19987843 -0.21935186 16 0.17230435 0.14359317 0.09796411 -0.00825724 0.14188335 0.27533947]]

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答3

0

ベストアンサー

PCAは次元削減に有効です。しかしながら、次元削減に合わせて本来有している情報が消失したのでは意味がありません。そこでPCAは新たに生成される次元が有する情報量を計算して割合の大きいもの(つまり、重要なもの)から降順にリストします。質問にある2つの主成分がこのリストの上位2つを指しているのであれば、本来有している情報量に対して重要なものということになります。
ちなみに、各主成分の重要度はexplained_variance_ratio_で出力できるので、確認してどの主成分まで維持するかに使うといいと思います。(今回の場合、component数が2つのようなので役に立たないかもしれませんが・・・)

components_で出力されるものは主成分の計算のインプットに対する重み付け係数です。あまり使うことはないものですが、私は主成分の解釈に使うことがあります。
例えば、国語、社会、数学、物理のテストの点数にPCAを適用したとします。結果、第1主成分について国語と社会の重みがプラスで数学と物理がほぼゼロという結果であればこの主成分は文系科目指数と解釈できるのではないかと考えます。今回の場合、30次元から成り立っているので解釈は難しいかもしれませんが、各主成分に意味を持たせたいのであれば、丹念に眺めることをお勧めします

投稿2018/09/04 06:53

R.Shigemori

総合スコア3376

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

---stax---

2018/09/05 01:51 編集

回答ありがとうございます。 ①に関しては30個の特徴量から各データポイントが表現されるデータセットの中で大きい分散を持つ箇所を抽出するという理解でよいでしょうか? 元々の解釈は30個の特徴量を(例えばA,B,C~という名前の場合)各特長量のなかで一番分散が大きい特徴量を主成分として維持する、という理解でした。(AとBを比べるとAの方が分散が大きい←これをすべての特徴量でやるイメージでした) また重ねて質問になってしまうのですが、explained_variance_ratio_で出た結果はどの主成分がどれだけ元のデータを表現できているか。という理解なのですが、この結果が何に使えるのか、この値を見たうえでデータをどう扱うのかが調べてみたのですがイメージがわきません・・・。 これを例えば上位90%のデータだけ使いたい場合、次元削減した結果、元の特徴量(30個)の情報は失われて2次元や3次元になり、自分が持っている情報はexplained_variance_ratio_で出た結果と、components_で出た結果だと思うのですがcomponents_で出る各特長量の係数は次元削減された時点で使える情報で無いように感じます 的外れな質問で申し訳ありません 色んな情報が混ざっておかしい理解をしていたり、他の方の回答に答えが書かれてるのに理解できていないだけかもしれませんが、アドバイス宜しくお願い致します
R.Shigemori

2018/09/05 09:51

主成分は分散が大きいものを採るというより最も分散が大きくなるように軸を回転させるというほうが正しい理解かと思います。したがって、分散の大きさは回転させる基準であってその特徴量が維持されるわけではありません。 explained_variance_ratioは元の次元が持つ情報量を主成分がどれだけ保持しているかを示す指標です。元データが30次元あるものを第1主成分と第2主成分の2次元に圧縮すれば情報量はそれなりに失われます。しかしながらこの2つの主成分の累計が全体の80%だとすると、後に実行するタスク次第ですが、十分有効です。しかしながら、累計が30%ならばもう少し採択する次元を増やさないとうまくいかないと見込まれます。つまり、選択した削減後の次元数が妥当か否かを判断する基準になるということです。 components_は因子負荷量と言って主成分に対して特徴量が与える影響力を表すものでざっくりいうと重み付けのようなものです。したがって、主成分に何らかの意味合いを持たせたい場合、この指標をもとに吟味するといいかと思います
guest

0

根本的に理解が間違っているような。

参考:
主成分分析の考え方 | Logics of Blue
意味がわかる主成分分析

3次元空間上で「板」の上にあるデータがあったら、2次元で表現できます(「板」の歪みや厚さは考えないものとする)。「板」の傾きなどを表すパラメータを持ってくれば、線形変換して2次元で表現できます。

「棒」の上にあれば1次元で表現できます(棒の曲がりや太さは考えないものとする)。この場合も同様。

主成分を削減後の空間の基底にしたいので、主成分が直交するような表現を作ります。これは共分散行列を固有値分解して固有ベクトルを得れば良いのですね。

追記

components_から削減後のデータ(いわゆる主成分得点)を生成するのは簡単です。

python

1>>> import numpy as np 2>>> from sklearn.decomposition import PCA 3>>> from sklearn.datasets import load_iris 4>>> iris = load_iris() 5>>> pca = PCA() 6>>> X = pca.fit_transform(iris.data) 7>>> X[0] # 0番目の変換後のデータ 8array([-2.68420713e+00, 3.26607315e-01, -2.15118370e-02, 1.00615724e-03]) 9>>> np.matmul(iris.data - iris.data.mean(axis=0), pca.components_.T)[0] # データから平均を引いてセンタリングして、pca.components_を転置したものと行列積を計算し、0番目を取り出す 10array([-2.68420713e+00, 3.26607315e-01, -2.15118370e-02, 1.00615724e-03])

transformを呼ぶと、こういう処理がなされると。

投稿2018/09/04 04:32

編集2018/09/04 04:40
hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

①特徴量が30個あるデータを2つの主成分だけ維持するとした場合

この2つというのは30個ある特徴量のなかで1番分散が大きい特徴量、2番目に分散が大きい特徴量を維持する
という認識はあっているでしょうか?

誤解を招きそうな表現ですので、間違っていると考えたほうがいいかな。
特徴量が30個あるデータから、PCAで30個の主成分を求め、その中で1番分散が大きくなる主成分(第一主成分)と2番目に分散が大きくなる主成分(第二主成分)を維持します。

②以下のように主成分を見れるコードを作成したのですが、2つの主成分に対して30個の特徴量を指しているのかなと考えるのですが

ここで表示されている30個の値は何を示しているのでしょうか?

pca.components_の大きさを(n_pca, n_dim)として考えてみると、n_pcaは何番目の主成分かを示します。例えば、pca.components_[0, n_dim]はこれは1番目(index=0)の主成分です。この式のn_dimは、n_dim番目の(元の)特徴量への係数(重み)を表しています。


補足
主成分は直交基底なので、pca.components_[0, :]pca.components_[1, :]の内積はだいたい0になります。もっと言うと、正規化された直交基底なので、pca.components_[0, :]pca.components_[0, :]の内積は、pca.components_[1, :]pca.components_[1, :]の内積にだいたい一致します。"だいたい"とあるのは、理論的には一致するものの、数値計算を行うと丸め誤差などが発生するためです。

投稿2018/09/04 04:24

tachikoma

総合スコア3601

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問