PCA(主成分分析)の理論 | デイビッドの宇宙開発ブログ

PCA(主成分分析)の理論

こんにちは,デイビッドです.今回は,
教師なし学習(Unsupervised Learning)>PCA Principal Components Analysis(主成分分析)についてです.

教師なし学習

全体に戻る場合はこちら↓

深層学習の理論学習の全体像
こんにちは,デイビッドです.近頃,JDLAのE資格学習を進めており,せっかくなので,学びを残していこうと思います.この記事では, 「機械学習・深層学習の理論学習の全体像について」(学習が渋滞している). です. 日頃より知識や概念...

 

PCAとは

統計学と機械学習における次元削減の手法の一つ.PCAは高次元データを低次元に変換し,データの構造やパターンを簡潔に表現する.相関のある多数の変数から,相関のない少数で全体のばらつきを最もよく表す「主成分」を合成する.
PCAの目的は,

  1. 次元削減:高次元データをより少ない次元に変換し,データの本質的な特徴を保ちながら計算コストを削減
  2. データの可視化:データを2次元や3次元にプロットし,視覚的に理解しやすくする
  3. 特徴抽出:重要な特徴を抽出し,データの構造や相関関係を明らかにする

たとえば,BMIは,身長と体重の二次元データを一次元のデータに変換しており,から

制約

  • 線形変換のみを使用するため、非線形な関係を捉えにくい。
  • 主成分の解釈が難しい場合がある。
  • 標準化の影響を受けやすい。

計算手順

  1. データの標準化:データセットの各特徴量を平均0、分散1に標準化します。これにより、異なるスケールの特徴量が均等に扱われます。
  2. 共分散行列の計算:データの共分散行列を計算します。共分散行列は、特徴量間の分散と共分散を表します。
  3. 固有値と固有ベクトルの計算:共分散行列の固有値と固有ベクトルを計算します。固有値はデータのばらつきの大きさを示し、固有ベクトルは新しい次元の方向を示します。
  4. 主成分の選択:固有値の大きさに基づいて、最も情報を多く含む主成分を選択します。一般的には、累積寄与率が十分に高く(70〜80%以上程度で決めることが多い)なるまで主成分を選びます。削減する次元数を決める.
  5. データの変換:選ばれた主成分に基づいて元のデータを変換し、新しい低次元のデータを得ます。指定した次元空間に写像する.

 

適用例

ワインの品種ラベルがついた多次元データを次元削減する.

 

# 必要なライブラリのインストールとインポート
!pip install numpy pandas matplotlib scikit-learn

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.preprocessing import StandardScaler
from sklearn.datasets import load_wine

# UCIのワインデータセットのロード
wine = load_wine()
data = wine.data
labels = wine.target
label_names = wine.target_names

# データフレームに変換
df = pd.DataFrame(data, columns=wine.feature_names)
df['WineType'] = labels

# データの標準化
features = df.columns[:-1]
x = df.loc[:, features].values
y = df.loc[:, ['WineType']].values
x = StandardScaler().fit_transform(x)

# PCAの適用
pca = PCA(n_components=2)
principal_components = pca.fit_transform(x)
principal_df = pd.DataFrame(data=principal_components, columns=['Principal Component 1', 'Principal Component 2'])

# ワインの種類を追加
final_df = pd.concat([principal_df, df[['WineType']]], axis=1)

# 結果のプロット
fig, ax = plt.subplots(figsize=(8, 6))
wine_types_unique = final_df['WineType'].unique()
colors = ['r', 'g', 'b']
for wine_type, color in zip(wine_types_unique, colors):
    indices_to_keep = final_df['WineType'] == wine_type
    ax.scatter(final_df.loc[indices_to_keep, 'Principal Component 1'],
               final_df.loc[indices_to_keep, 'Principal Component 2'],
               c=color,
               s=50,
               label=label_names[wine_type])
ax.legend()
ax.set_title('PCA of Wine Types')
ax.set_xlabel('Principal Component 1')
ax.set_ylabel('Principal Component 2')
plt.show()

まとめ

PCAでした.

 

 

コメント

タイトルとURLをコピーしました