🐈

Act 25. 主成分分析(PCA)について学ぶ

2024/11/28に公開

はじめに

Act 01. AIで外国為替を自動売買するまでの道のりをベースに学習を進めて行く。

前回は教師なし学習のk平均法について勉強した。
今回は、同じ教師なし学習の主成分分析(PCA)について学習していく。

今後学習する内容は以下の通り。
学習はChatGTPさん考案の以下の順序で進めて行く。

学習順序

教師あり学習

  1. 線形回帰: 基本的な回帰問題を学ぶ。 2024/11/13 学習済み
  2. ロジスティック回帰: 分類問題の基本を理解する。 2024/11/17 学習済み
  3. 決定木: シンプルで直感的なモデル。 2024/11/20 学習済み
  4. ランダムフォレスト: 決定木のアンサンブル学習。 2024/11/22 学習済み

教師なし学習

  1. k平均法: クラスタリングの基本。 2024/11/24 学習済み
  2. 主成分分析(PCA): 次元削減の手法。

強化学習

  1. 基本的な概念: エージェント、環境、報酬の関係を理解する。
  2. Q学習: 簡単な強化学習アルゴリズム。
    ※強化学習は重要だと判断したため、概念から再度学習する。

この記事で主成分分析について学習して、次の記事でpythonを使って主成分分析の実装を行う。
それが終わったらついに強化学習だー!

早くこの記事を書き終えたい気持ちが強いけど、きっと主成分分析は役に立つ内容だと思うので、自分のためにもしっかりと学習していく。

主成分分析

ChatGPTさんの回答

いつものごとく、ChatGTPさんにどんな物なのか聞いてみた。
以下はその回答。

主成分分析(PCA, Principal Component Analysis)は、次元削減のための統計的手法です。データの情報をなるべく失わずに、少ない次元で表現することを目的としています。以下にPCAについて詳細に説明します。

PCAの目的

  1. 高次元データ(例:特徴量が多いデータ)を、より少ない次元に圧縮する。
  2. データの変動(情報)を最大限保持する。

これにより、計算効率が向上し、データの可視化が容易になります。また、ノイズを減らす効果もあります。

PCAの基本的な流れ

  1. データの標準化

    • データを標準化(平均0、分散1)します。

      x' = \frac{x - \mu}{\sigma}

      ここで、\mu は平均、\sigma は標準偏差です。

  2. 共分散行列の計算
    データの分布を把握するため、共分散行列を計算します。共分散行列は次のように定義されます:

    \mathbf{C} = \frac{1}{n} \mathbf{X}^\top \mathbf{X}

    ここで、\mathbf{X} はデータ行列(各行がデータサンプル、各列が特徴量)、\mathbf{C} は共分散行列です。

  3. 固有値と固有ベクトルの計算
    共分散行列の固有値と固有ベクトルを計算します。

    • 固有ベクトルはデータの主成分を表します。
    • 固有値は主成分の「重要度」(分散の大きさ)を表します。
  4. 次元削減
    固有値が大きい順に固有ベクトルを選びます。その選ばれた固有ベクトルにデータを射影することで、次元を削減します。次元削減後のデータは次のように計算されます:

    \mathbf{Z} = \mathbf{X} \mathbf{W}

    ここで、\mathbf{W} は選ばれた固有ベクトルを列に持つ行列です。

数式の詳細な説明

1. 共分散行列

共分散行列の各要素 (i, j) は、特徴量 ij の共分散を示します:

\text{Cov}(X_i, X_j) = \frac{1}{n} \sum_{k=1}^n (x_{k,i} - \bar{x}_i)(x_{k,j} - \bar{x}_j)
  • \bar{x}_i は特徴量 i の平均値。
  • 共分散が大きいほど、2つの特徴量が互いに強い線形関係を持つことを意味します。

2. 固有値と固有ベクトル

共分散行列 \mathbf{C} に対する固有値 \lambda と固有ベクトル \mathbf{v} は、次のように定義されます:

\mathbf{C} \mathbf{v} = \lambda \mathbf{v}
  • 固有値 \lambda は、対応する固有ベクトルがデータの分散をどれだけ説明できるかを示します。
  • 固有ベクトルは次元削減後の新しい軸(主成分)を表します。

3. 次元削減の射影

選ばれた k 個の固有ベクトル \mathbf{W} = [\mathbf{v}_1, \mathbf{v}_2, \ldots, \mathbf{v}_k] を使い、元のデータ \mathbf{X} を新しい次元に射影します:

\mathbf{Z} = \mathbf{X} \mathbf{W}

ここで、\mathbf{Z} は次元削減後のデータです。

具体例

例えば、2次元データを1次元に圧縮する場合:

  1. データを標準化する。
  2. 共分散行列を計算し、2×2の行列を得る。
  3. 固有値と固有ベクトルを求める。
  4. 大きい固有値に対応する固有ベクトルを選び、データをその方向に射影する。

PCAのポイント

  • 主成分は「データの分散を最大化する方向」を表します。
  • データの次元を削減しながら、情報(分散)の多くを保持します。
  • PCAは線形変換に基づいており、非線形な関係を扱いたい場合は「カーネルPCA」が必要になります。

応用例

  • データの前処理(特徴量削減、ノイズ除去)。
  • データの可視化(2次元または3次元にプロット)。
  • モデルの学習効率向上(高次元データの計算負荷を軽減)。

自分なりに解説

ChatGTPさんの回答のPCAの目的に記載されている以下の内容について。
個人的に、これはめちゃくちゃ重要な内容なのでは?と読んでいて思った。

  1. 高次元データ(例:特徴量が多いデータ)を、より少ない次元に圧縮する。
  2. データの変動(情報)を最大限保持する。

今後、FXの相場予想をするAIを作りたいわけだが、特徴量がどのくらいになるかあまり想像できていない。
もしかしたら10個かもしれないし、もっと多くて100個とかになる可能性もある。

データが多いということは、分析や学習に時間がかかってしまうため、インフラリソースのコストもその分増えると考えている。
次元削減の流れ、絶対に身に着けよう!

ということで、ChatGTPさんの回答について補足を加えながら記載していこうと思う。
以降は以下のデータを使って説明していくので良しなに。

データ番号 身長 (cm) 体重 (kg)
1 155 48
2 162 55
3 168 67
4 174 72
5 185 85

1. データの標準化

まず初めに、データの標準化を行う。
なぜデータの標準化を行うのかというと、それぞれの特徴量の単位スケールの違いを調整するため。

単位やスケールの違いとは、例えば 体重(kg)や 身長(cm)、髪の毛の本数(本)など。
表にしてみると以下のようなイメージ。

名前 体重(kg) 身長(cm) 髪の毛の本数(本)
田中 60 160 100,000,000
佐藤 100 190 80,000,000
高橋 40 140 130,000,000

恐らくだが、標準化せずにこのデータで次元を削減しようとすると、"髪の毛の本数"の影響をかなり受けることになると思う。

そのため、それぞれの値に対して標準化を行うことで調整を行おうというわけだ。
標準化の公式については以下の通り。

x' = \frac{x - \mu}{\sigma}
  • x': 標準化後のデータ
  • x: 元のデータ
  • \mu: 平均値
  • \sigma: 標準偏差

標準偏差については以前やったが、少し頭から抜けていたので再度学習することに決定!

そもそも標準偏差とは?
標準偏差はデータが平均値からどの程度離れているか、つまり、データのバラつきを表す指標となる。
値が小さいほど平均値に近い位置に集まっており、値が大きいほど平均値から広がっていることを意味する。

最初に記載した下記のデータを使って、標準化を行うまでの流れを記載していく。

データ番号 身長 (cm) 体重 (kg)
1 155 48
2 162 55
3 168 67
4 174 72
5 185 85

1. 平均を求める

まずは平均を求める。

  • 身長

    \mu = \frac{1}{n}\sum_{i=1}^{n}x_i = \frac{1}{5}\sum_{i=1}^{5}x_i = \frac{155 + 162 + 168 + 174 + 185}{5} = 168.8
  • 体重
    同じ方程式なので途中は省略する。

    \mu = \frac{48 + 55 + 67 + 72 + 85}{5} = 65.4

平均を含めると以下のような感じになる。

データ番号 身長 (cm) 体重 (kg)
1 155 48
2 162 55
3 168 67
4 174 72
5 185 85
\mu(平均) 168.8 65.4

2. 平均との誤差(偏差)を計算

各データに対してデータと平均の差である偏差を求める。
これに関してはただ引き算を行うだけ。

x_i - \mu
データ番号 身長 (cm) 体重 (kg) 身長の偏差 体重の偏差
1 155 48 -13.8 -17.4
2 162 55 -6.8 -10.4
3 168 67 -0.8 1.6
4 174 72 5.2 6.6
5 185 85 16.2 19.6
\mu(平均) 168.8 65.4 - -

3. 偏差の二乗を求める

偏差でマイナスになっているものがあるので、二乗することで全て正の値にする。

\left(x_i - \mu\right)^2
データ番号 身長 (cm) 体重 (kg) 身長の偏差の二乗 体重の偏差の二乗
1 155 48 190.44 302.76
2 162 55 46.24 108.16
3 168 67 0.64 2.56
4 174 72 27.04 43.56
5 185 85 262.44 384.16
\mu(平均) 168.8 65.4 - -

4. 偏差の二乗の平均を求める(分散)

偏差の二乗が求められたのでそれの平均を求める。
ちなみに、3 ~ 5 の手順を数式にすると以下の通り。

\text{分散(Variance)} = \frac{1}{n}\sum_{i=1}^{n}\left(x_i - \mu\right)^2

偏差の二乗の平均値を追加すると以下になる。

データ番号 身長 (cm) 体重 (kg) 身長の偏差の二乗 体重の偏差の二乗
1 155 48 190.44 302.76
2 162 55 46.24 108.16
3 168 67 0.64 2.56
4 174 72 27.04 43.56
5 185 85 262.44 384.16
\mu(平均) 168.8 65.4 105.36 168.24

5. 分散の平方根を取る(標準偏差)

偏差を二乗した値の平方根を取る。
ここまでの全てを数式にすると以下の通り。

\sigma\text{(標準偏差)} = \sqrt{\frac{1}{n}\sum_{i=1}^{n}\left(x_i - \mu\right)^2}

それぞれの標準偏差を求める。

身長の標準偏差 = \sqrt{105.36} = 10.26
体重の標準偏差 = \sqrt{168.24} = 12.97

算出した平均と標準偏差を表に追加する。

データ番号 身長 (cm) 体重 (kg)
1 155 48
2 162 55
3 168 67
4 174 72
5 185 85
\mu(平均) 168.8 65.4
\sigma(標準偏差) 10.26 12.97

6. 標準化を行う

1 ~ 5 までの流れで\sigma(標準偏差)を求めることが出来た。
ということで次は各パラメータを標準化していこうと思う。

標準化の公式を再度載せておく。
ここまで学んできた我らに怖いものはない。

x' = \frac{x - \mu}{\sigma}

それぞれのデータを標準化すると以下のようになる。
全ての値が 0 に近い数字に標準化されているのが分かる。

データ番号 身長 (cm) 体重 (kg) 身長の標準化 体重の標準化
1 155 48 -1.34 -1.34
2 162 55 -0.66 -0.8
3 168 67 -0.08 0.12
4 174 72 0.5 0.51
5 185 85 1.58 1.51
\mu(平均) 168.8 65.4 0 0
\sigma(標準偏差) 10.26 12.97 1 1

補足だが、標準化を行ったデータの平均値は 0 となり、標準偏差は 1 となる。
ここまでで、まず一つ目のステップである標準化が完了した。

長くなってしまったが、重要だからきちんと解説するということで…。
2/3 くらいだから頑張ろう!!

2. 共分散行列の計算

続いてが共分散行列(Covariance Matrix)について。

共分散行列とは、データセットの異なる特徴量間の関係(相関)を表すための行列。

今回例として使っているデータセットの場合は、身長と体重の相関を表している行列になる。

主成分分析(PCA)では、この共分散行列を使ってデータの分散や相関関係を分析し、主成分を見つけるらしい。

共分散とは

そもそも共分散って何ぞや!となったので調べた。
共分散(Covariance) は、二つの特徴量がどの程度一緒に変動するかを示す値とのこと。

2つの特徴量 X, Y の共分散の式は以下のように定義される。

\text{Cov}(X, Y) = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})

それぞれの記号については以下の通り。

  • x_i, y_i: それぞれの特徴量(身長や体重)
  • \bar{x}, \bar{y}: それぞれの特徴量の平均値
  • n: データ総数

と言うことで先ほど標準化した以下のデータで計算してみる。

データ番号 身長 (cm) 体重 (kg) 身長の標準化 体重の標準化
1 155 48 -1.34 -1.34
2 162 55 -0.66 -0.8
3 168 67 -0.08 0.12
4 174 72 0.5 0.51
5 185 85 1.58 1.51
\mu(平均) 168.8 65.4 0 0
\sigma(標準偏差) 10.26 12.97 1 1

標準化したデータの平均値は 0 となるため、\bar{x}, \bar{y} の記載は省く。

\text{Cov}(X, Y) = \frac{(-1.34 × -1.34) + (-0.66 × -0.8) + (-0.08 × 0.12) + (0.5 × 0.51) + (1.58 × 1.51)}{5} = \frac{1.7956 + 0.528 - 0.0096 + 0.255 + 2.3858}{5} = 0.994

と言うことで身長と体重の共分散は 0.994 となった。

この結果が何を表すのかというとこんな感じ。

  • \text{Cov}(X, Y) > 0: 2つの変数は同じ方向に変動する
  • \text{Cov}(X, Y) < 0: 2つの変数は逆方向に変動する
  • \text{Cov}(X, Y) = 0: 2つの変数が無関係(直線的な関係がない)

つまり、体重と身長は同じ方向に変動すると言うことがわかり、実際その結果は正しい。

ここまでが共分散。

共分散行列とは

次に共分散行列(Covariance Matrix) について。
共分散行列は、データセットが複数の特徴量を持つ場合、すべての特徴量の共分散を計算して行列として表したもの。

まずは共分散の公式についておさらい。
これを脳裏に焼き付けておく。

\text{Cov}(X, Y) = \frac{1}{n}\sum_{i=1}^{n}(x_i - \bar{x})(y_i - \bar{y})

焼き付けたところで共分散行列の定義について紹介する。

データセット \mathbf{X}(サイズ:n \times p)n 個のサンプルと、y 個の特徴量を持つ場合、共分散行列 \mathbf{C} は以下の様に表される。

\mathbf{C} = \frac{1}{n}\mathbf{X}^\top \mathbf{X}

\mathbf{X}^\top はデータ行列 \mathbf{X} の転置行列となる。

はいはい、転置行列ね。そんなん忘れた。という人に向けて。

例えば \mathbf{X} が以下の通りだとする。
n はデータセットのサンプル数で、p が特徴量の数。

\mathbf{X} = \begin{bmatrix} x_{1,1} & x_{1,2} & \cdots & x_{1,p} \\ x_{2,1} & x_{2,2} & \cdots & x_{2,p} \\ \vdots & \vdots & \ddots & \vdots \\ x_{n,1} & x_{n,2} & \cdots & x_{n,p} \end{bmatrix}

これの転置行列は以下の通り。

\mathbf{X}^\top = \begin{bmatrix} x_{1,1} & x_{2,1} & \cdots & x_{n,1} \\ x_{1,2} & x_{2,2} & \cdots & x_{n,2} \\ \vdots & \vdots & \ddots & \vdots \\ x_{1,p} & x_{2,p} & \cdots & x_{n,p} \end{bmatrix}

先ほど求めた身長と体重の標準化を行ったデータで具体的に説明する。

データ番号 身長 (cm) 体重 (kg) 身長の標準化 体重の標準化
1 155 48 -1.34 -1.34
2 162 55 -0.66 -0.8
3 168 67 -0.08 0.12
4 174 72 0.5 0.51
5 185 85 1.58 1.51

まず、このデータセット \mathbf{X}5 \times 2 の行列となっている。
それを式として表すと以下の通り。

\mathbf{X} = \begin{bmatrix} -1.34 & -1.34\\ -0.66 & -0.8\\ -0.08 & 0.12\\ 0.5 & 0.51\\ 1.58 & 1.51 \end{bmatrix}

転置行列はこれをパタンとひっくり返したもの。
具体的には以下のような感じ。

\mathbf{X}^\top = \begin{bmatrix} -1.34 & -0.66 & -0.08 & 0.5 & 1.58\\ -1.34 & -0.8 & 0.12 & 0.51 & 1.51 \end{bmatrix}

そして \mathbf{C} は、これらを掛け合わせたものになる。

ここで行列の積についておさらい。
行列の積は 1つ目の行列のと2つ目の行列のが同じ数字じゃないと掛け算できない。

そして積は以下の様に同じ矢印の色同士で行う。

実際に式にすると以下の通り。

\mathbf{X}^\top\mathbf{X} = \begin{bmatrix} (-1.34)^2 + (-0.66)^2 + (-0.08)^2 + (0.5)^2 + (1.58)^2 & (-1.34)^2 + (-0.66)(-0.8) + (-0.08)(0.12) + (0.5)(0.51) + (1.58)(1.51)\\ (-1.34)^2 + (-0.8)(-0.66) + (0.12)(-0.08) + (0.51)(0.5) + (1.51)(1.58) & (-1.34)^2 + (-0.8)^2 + (0.12)^2 + (0.51)^2 + (1.51)^2\\ \end{bmatrix}\\ = \begin{bmatrix} 5 & 4.97\\ 4.97 & 5 \end{bmatrix}\\

つまり、共分散行列 \mathbf{C} は以下の通りとなる。

\mathbf{C} = \frac{1}{n}\mathbf{X}^\top \mathbf{X} = \begin{bmatrix} 1 & 0.994\\ 0.994 & 1 \end{bmatrix}\\

今回は特徴量が2つなのであまり実感はないが、特徴量が何十個も存在する場合、それぞれの特徴量間での相関を確認することが可能になるため、共分散行列は結構凄いのでは?と思っている。

共分散行列を求めることで、次の固有値と固有ベクトルの計算が行えるのかな?と予想して次の内容へ。
あと少し頑張ろう。

3. 固有値と固有ベクトルの計算

固有値と固有ベクトルの計算については、ChatGTPさんに質問したが理解できなかった。
なのでChatGTPさんの回答をそのまま載せておく…。

ここで挫折しては意味がないので、何となく概要を頭に入れたし次へ進む。

固有値と固有ベクトルの計算について詳しく解説

固有値と固有ベクトルは、線形代数において非常に重要な概念で、主成分分析(PCA)やデータ解析の基礎となります。以下に、これらの計算方法や具体例を詳しく説明します。

3-1. 固有値と固有ベクトルの定義

固有値・固有ベクトルの式
行列 \mathbf{A} に対して、次の関係を満たすスカラー(値)\lambda とベクトル \mathbf{v} があるとき:

\mathbf{A} \mathbf{v} = \lambda \mathbf{v}
  • \lambda: 固有値(eigenvalue)
    ベクトル \mathbf{v} の伸縮率を表します。
  • \mathbf{v}: 固有ベクトル(eigenvector)
    行列 \mathbf{A} によって変換されても方向が変わらないベクトルです。

簡単なイメージ

  • 固有ベクトルは「行列が引っ張ったり押し縮めたりしても向きが変わらない方向」。
  • 固有値は、その方向でベクトルがどれだけ伸びたり縮んだりするかを表します。

3-2. 固有値と固有ベクトルを求める手順

固有値と固有ベクトルを計算するには、次の手順を行います。

ステップ1: 固有値を求める
固有値は次の「固有値方程式」を解くことで得られます:

\det(\mathbf{A} - \lambda \mathbf{I}) = 0

ここで:

  • \mathbf{A}:対象の行列(サイズ n \times n
  • \mathbf{I}:単位行列(同じサイズ n \times n
  • \lambda:固有値
  • \det:行列式を計算する記号

意味

  • (\mathbf{A} - \lambda \mathbf{I})\mathbf{A} から固有値 \lambda を引いた行列
  • \det(\mathbf{A} - \lambda \mathbf{I}) = 0:行列が特異行列(逆行列が存在しない)になる条件

具体的な計算

  1. 行列式を計算し、\lambda に関する多項式(固有方程式)が得られる。
  2. 固有方程式を解いて、\lambda(固有値)を求める。

ステップ2: 固有ベクトルを求める
固有値が求まったら、それぞれの固有値に対して次の式を解きます:

(\mathbf{A} - \lambda \mathbf{I}) \mathbf{v} = 0

ここで:

  • \mathbf{v}:固有ベクトル

意味

  • 固有値 \lambda に対応する行列 (\mathbf{A} - \lambda \mathbf{I}) のカーネル(零空間)を求める操作。
  • 零空間に属するベクトル(固有ベクトル)は無数に存在するため、通常は「正規化」(長さを1に揃える)して1つに固定します。

3-3. 具体例

行列 \mathbf{A}

\mathbf{A} = \begin{bmatrix} 4 & 2 \\ 1 & 3 \end{bmatrix}

ステップ1: 固有値の計算
固有値方程式:

\det(\mathbf{A} - \lambda \mathbf{I}) = 0
  1. \mathbf{A} - \lambda \mathbf{I} を計算:

    \mathbf{A} - \lambda \mathbf{I} = \begin{bmatrix} 4 - \lambda & 2 \\ 1 & 3 - \lambda \end{bmatrix}
  2. 行列式を計算:

    \det(\mathbf{A} - \lambda \mathbf{I}) = (4 - \lambda)(3 - \lambda) - (2)(1) = 0

    展開すると:

    \lambda^2 - 7\lambda + 10 = 0
  3. 固有値 \lambda を求める:

    \lambda^2 - 7\lambda + 10 = 0 \quad \Rightarrow \quad (\lambda - 5)(\lambda - 2) = 0
    \lambda = 5, \, 2

ステップ2: 固有ベクトルの計算
固有値ごとに固有ベクトルを計算します。

固有値 \lambda = 5 の場合

  1. 行列 (\mathbf{A} - 5 \mathbf{I}) を計算:

    \mathbf{A} - 5\mathbf{I} = \begin{bmatrix} 4 - 5 & 2 \\ 1 & 3 - 5 \end{bmatrix} = \begin{bmatrix} -1 & 2 \\ 1 & -2 \end{bmatrix}
  2. 連立方程式を解く:

    \begin{bmatrix} -1 & 2 \\ 1 & -2 \end{bmatrix} \begin{bmatrix} v_1 \\ v_2 \end{bmatrix} = \begin{bmatrix} 0 \\ 0 \end{bmatrix}

    1行目より:

    -1v_1 + 2v_2 = 0 \quad \Rightarrow \quad v_1 = 2v_2

    固有ベクトル(任意定数をtとすると):

    \mathbf{v} = \begin{bmatrix} 2 \\ 1 \end{bmatrix}

    固有値 \lambda = 2 の場合
    同様の手順で計算:

    \mathbf{A} - 2\mathbf{I} = \begin{bmatrix} 2 & 2 \\ 1 & 1 \end{bmatrix}

    固有ベクトル:

    \mathbf{v} = \begin{bmatrix} -1 \\ 1 \end{bmatrix}

3-4. 固有値と固有ベクトルの結果

  • 固有値:\lambda = 5, \, 2

  • 対応する固有ベクトル:

    \lambda = 5 \quad \Rightarrow \quad \mathbf{v} = \begin{bmatrix} 2 \\ 1 \end{bmatrix}, \quad \lambda = 2 \quad \Rightarrow \quad \mathbf{v} = \begin{bmatrix} -1 \\ 1 \end{bmatrix}

3-5. 固有値と固有ベクトルの重要性

  • 固有値:主成分分析(PCA)では、データの分散を説明する主成分の重要度を示します(大きいほど重要)。
  • 固有ベクトル:主成分(新しい軸)を表し、データの方向を決定します。

このように、固有値と固有ベクトルの計算は、線形代数を基にデータ解析や次元削減の基礎を作る非常に重要なステップです!

4. 次元削減

固有値が大きい順に固有ベクトルを選び、その選ばれた固有ベクトルにデータを射影することで、次元を削減する。

さいごに

後半が分からなかった。
ただ、計算式を理解しなくても概要だけ理解していれば、今後は困らないんじゃ?精神でやっていく。

もしここら辺の詳しい知識が必要になったら未来の自分に任せようと思う。
次回はPythonで主成分分析を行ってみる。

ではまた。

Discussion