※当サイトの記事には、広告・プロモーションが含まれます。

分散と共分散と分散共分散行列とsklearn.decomposition.PCAとK-means法と

f:id:ts0818:20210123190301j:plain

オルバースのパラドックス (Olbers' paradox, Olbers's paradox) は、「宇宙恒星の分布がほぼ一様で、恒星の大きさも平均的に場所によらないと仮定すると、空は全体が太陽面のように明るく光輝くはず」というパラドックスである。 その名は、18〜19世紀の天文学者であるヴィルヘルム・オルバースに由来する。ただしオルバースが最初に提起したわけではない。 オルバースの逆説オルバースの逆理オルバースの背理ド・シェゾー=オルバースのパラドックス (de Cheseaux-Olbers paradox)などともいう。

オルバースのパラドックス - Wikipedia

このパラドックスの帰結は、星は距離の2乗に反比例して見かけの面積が小さくなるが、距離が遠い星の数は距離の2乗で増えるので、これらはちょうど打ち消しあい、どの方向を見てもいずれかの星のまばゆい表面がみえるはずだという推論に基づく。 現在では、そのために必要な距離や時間あるいは星の密度は、実際の宇宙の大きさ・年齢・密度よりおよそ10兆倍も大きなものとなることが明らかとなったため、パラドックスの前提は成立しないことがわかっている。 これと同様に「宇宙が一様で無限の広がりを持つ」ことを前提とした天文学パラドックスゼーリガーのパラドックスがある。

オルバースのパラドックス - Wikipedia

⇧ そんなパラドックスが存在したなんて、露程も知らず私は今日まで生きてきました、どうもボクです。

というわけで、今回は分散とかについてなんかを調査です。

レッツトライ~。

 

分散って?

Wikipediaさ~ん!

分散(ぶんさん、variance)とは、確率論では、確率変数 X からその期待値 E(X) を引いた2乗の期待値 σ2 = V(X) = E[(X − E(X))2] のこと確率変数の2次の中心化モーメントである。確率変数の分布期待値からどれだけ散らばっているかを示す非負の値である

分散 (確率論) - Wikipedia

統計学では、記述統計学においては標本標本平均からどれだけ散らばっているかを示す指標として標本分散(ひょうほんぶんさん、sample variance)を、推測統計学においては不偏分散(ふへんぶんさん、unbiased variance)・不偏標本分散(ふへんひょうほんぶんさん、unbiased sample variance)を用いる。0 に近いほど散らばりは小さい。

分散 (確率論) - Wikipedia

⇧ ってことで、 「分散」という名前からも分かる通り、「ある値を基準にして各値がどれだけ散らばっているか」っていう度合いを測るための指標ですと。

なので、値が複数あるってことが前提の考え方ですかね。 

分布で考えた場合、  

seihin-sekkei.com

「平均値±σ」で全体の68.3%、「平均値±2σ」で全体の95.4%、「平均値±3σ」で全体の99.7%がカバーされる。製品設計においては、「平均値±3σ」を管理限界とすることが多い。「平均値±3σ」を管理限界とした場合、そこから外れる製品はアウスライサーと呼ばれる。

正規分布 せいきぶんぷ/normal distribution - 製品設計知識

⇧ 横に広がるほど、標準偏差が大きくなってるから、分散も大きくなるということみたいですね。

 

共分散って?

Wikipediaさ~ん!

共分散(きょうぶんさん、covariance)は、2 組の対応するデータ間での、平均からの偏差の積の平均値である。2 組の確率変数 XY の共分散 Cov(XY) は、E で期待値を表すことにして、

で定義する。

共分散 - Wikipedia

⇧ え、え~っと...

「偏差」は?

偏差(へんさ、deviation)とは、統計学において、ある母集団に属する数値と、母集団の基準値(平均中央値など)との差のこと。偏差は母集団内の要素1つ1つに対して定まるものである。

偏差 - Wikipedia

⇧ ってことなので、「共分散」ってのは、

  • Xの母集団( x_1, x_2, x_3, \cdots, x_n
    • 基準値: \overline{ {\mu}_x }(Xの集団の平均値)
    • 偏差:基準値とXの集団の各要素との差

と、 

  • Yの母集団( y_1, y_2, y_3, \cdots, y_n
    • 基準値: \overline{{\mu}_y} (Yの集団の平均値)
    • 偏差:基準値とYの集団の各要素との差

の「偏差」の積を合計したものらしいので、

hiraocafe.com

⇧ 上記サイト様を参考にさせていただくと、

\begin{eqnarray} S_{xy} &=& (x_1 - \overline{ {\mu}_x })(y_1 - \overline{ {\mu}_x }) + (x_2 - \overline{ {\mu}_x })(y_2 - \overline{ {\mu}_x }) \cdots (x_n - \overline{ {\mu}_x })(y_n - \overline{ {\mu}_x }) \\ &=& \displaystyle \frac{ 1 }{ n }\displaystyle \sum_{i=1}^n (x_i - \overline{ {\mu}_x })(y_i - \overline{ {\mu}_y }) \\ &=& \displaystyle \frac{ 1 }{ n }\displaystyle \sum_{i=1}^n ({x_i}{y_i} - \overline{ {\mu}_y }{x_i} - \overline{ {\mu}_x }{y_i} + {\overline{ {\mu}_x }} {\cdot} {\overline{ {\mu}_y }} ) \\ &=& {\overline{ {\mu}_{xy} }} - {\overline{ {\mu}_y }} \displaystyle \frac{ 1 }{ n }\displaystyle \sum_{i=1}^n {x_i} - {\overline{ {\mu}_x }} \displaystyle \frac{ 1 }{ n }\displaystyle \sum_{i=1}^n {y_i} + \displaystyle \frac{ 1 }{ n }\ {n} ({\overline{ {\mu}_x }}{\cdot}{\overline{ {\mu}_y }} ) \\ &=& {\overline{ {\mu}_{xy} }} - {\overline{ {\mu}_y }}{\cdot}{\overline{ {\mu}_x }} - {\overline{ {\mu}_x }}{\cdot}{\overline{ {\mu}_y }} + {\overline{ {\mu}_x }}{\cdot}{\overline{ {\mu}_y }} \\ &=& {\overline{ {\mu}_{xy} }} - {\overline{ {\mu}_x }}{\cdot}{\overline{ {\mu}_y }} \end{eqnarray}

 

ってな感じになるので、

 (Xの偏差)×(Yの偏差) = (X×Yの平均) - (Xの平均)×(Yの平均)

ってことになるらしい。

X、Yはそれぞれ複数の値の集団なので、2つの集団で作りだされる分散ってことなんですかね?

 

分散共分散行列って?

Wikipediaさ~ん!

分散共分散行列(ぶんさんきょうぶんさんぎょうれつ、variance-covariance matrix)や共分散行列(きょうぶんさんぎょうれつ、covariance matrix)とは、統計学確率論において、ベクトルの要素間の共分散行列である。これは、スカラー値をとる確率変数における分散の概念を、多次元に拡張したものである。

分散共分散行列 - Wikipedia

⇧ 行列の要素の1つ1つが、2つの「ベクトル」間の各要素の「共分散」になっている行列のことっていうことですかね。

ちなみに、「共分散」は 

共分散(きょうぶんさん、covariance)は、2 組の対応するデータ間での、平均からの偏差の積の平均値である。

共分散 - Wikipedia

⇧ ってことだったので、「分散共分散行列」は2つのベクトルの要素間での、平均からの偏差の積の平均値を要素に持つ行列で、2つのベクトルの要素で掛け算するには、

qiita.com

 a :ベクトル」、「 b :ベクトル」である場合、話が少し複雑です。
実はルールがあり、「 a 」の列数と「 b 」の行数とが等しくないと、
積の計算ができないルールとなっています。
仮に、「 a 」「 b 」に縦長のベクトルであれば、計算が可能なのは、

  •  a^{T}b
  •  ab^{T}

のいずれかとなります。
ここで式中の「 ^{T} 」は転置の意です。
転置とは、「ベクトル」「行列」にて、行と列を対角に反転することです。

線形代数の基本・「スカラー」「ベクトル」「行列」の積 - Qiita

⇧ 上記サイト様のように、両方とも縦長のベクトルの場合は、片方を「転置」させないといけませんと。

で、Wikipediaさんの情報と、 

zellij.hatenablog.com

⇧ 上記サイト様を参考にさせていただくと、「分散共分散行列」 \sum ってのは、

ベクトル  X 、ベクトル  Y を、

 X = \begin{bmatrix}  x_1 \\ x_2 \\ {\vdots} \\ x_n \end{bmatrix}

 Y = \begin{bmatrix}  y_1 \\ y_2 \\ {\vdots} \\ y_n \end{bmatrix}

とし、

Xの平均ベクトル  \overline{u_{x}} 、Yの平均ベクトル  \overline{u_{y}} を、

 \overline{u_{x}} = \begin{bmatrix}  \overline{u_{x1}} \\ \overline{u_{x2}} \\ {\vdots} \\ \overline{u_{xn}} \end{bmatrix}

 \overline{u_{y}} = \begin{bmatrix}  \overline{u_{y1}} \\ \overline{u_{y2}} \\ {\vdots} \\ \overline{u_{yn}} \end{bmatrix}

した場合(Xの平均ベクトル  \overline{u_{x}} と、Yの平均ベクトル  \overline{u_{y}} の各要素は全て同じ値になると思われるけど、ベクトルでの計算上、ベクトル  X と、ベクトル  Y の各要素数と同じ要素数にする必要があるんではなかろうかと思って要素数を合わせる形にしたけど、数学の知識がないので分からず...)、 ベクトル  X 、ベクトル  Y 、Xの平均ベクトル  \overline{u_{x}} と、Yの平均ベクトル  \overline{u_{y}} の要素数が、 n とすると、ベクトル  X 、ベクトル  Y の要素間の共分散  S_{XY} は、

 \begin{bmatrix}  x_1 \\ x_2 \\ {\vdots} \\ x_n \end{bmatrix}  +  \begin{bmatrix}  -{\overline{u_{x1}}} \\ -{\overline{u_{x2}}} \\ {\vdots} \\ -{\overline{u_{xn}}} \end{bmatrix}  = \begin{bmatrix}  x_1 -{\overline{u_{x1}}} \\ x_2 -{\overline{u_{x2}}} \\ {\vdots} \\ x_n -{\overline{u_{xn}}} \end{bmatrix}

 \begin{bmatrix}  y_1 \\ y_2 \\ {\vdots} \\ y_n \end{bmatrix} +  \begin{bmatrix}  -{\overline{u_{y1}}} \\ -{\overline{u_{y2}}} \\ {\vdots} \\ -{\overline{u_{yn}}} \end{bmatrix} = \begin{bmatrix}  y_1 -{\overline{u_{y1}}} \\ y_2 -{\overline{u_{y2}}} \\ {\vdots} \\ y_n -{\overline{u_{yn}}} \end{bmatrix}

の積の平均になるので、 

\( \begin{eqnarray} S_{XY} &=& \frac{1}{n} \begin{bmatrix}  x_1 -{\overline{u_{x1}}} \\ x_2 -{\overline{u_{x2}}} \\ {\vdots} \\ x_n -{\overline{u_{xn}}} \end{bmatrix}  \begin{bmatrix}  y_1 -{\overline{u_{y1}}} \\ y_2 -{\overline{u_{y2}}} \\ {\vdots} \\ y_n -{\overline{u_{yn}}} \end{bmatrix}^T \\ &=& \frac{1}{n} \begin{bmatrix}  x_1 -{\overline{u_{x1}}} \\ x_2 -{\overline{u_{x2}}} \\ {\vdots} \\ x_n -{\overline{u_{xn}}} \end{bmatrix} \begin{bmatrix}  y_1 -{\overline{u_{y1}}} \quad y_2 -{\overline{u_{y2}}} \quad {\cdots} \quad y_n -{\overline{u_{yn}}} \end{bmatrix} \\ &=& \frac{1}{n} \begin{bmatrix} (x_1 -{\overline{u_{x1}}})(y_1 -{\overline{u_{y1}}}) \ & (x_1 -{\overline{u_{x1}}})(y_2 -{\overline{u_{y2}}}) & {\cdots}&(x_1 -{\overline{u_{x1}}})(y_n -{\overline{u_{yn}}}) \\ (x_2 -{\overline{u_{x2}}})(y_1 -{\overline{u_{y1}}}) \ & (x_2 -{\overline{u_{x2}}})(y_2 -{\overline{u_{y2}}}) & {\cdots}&(x_2 -{\overline{u_{x2}}})(y_n -{\overline{u_{yn}}}) \\ {\vdots}  & {\vdots} & {\ddots} & {\vdots} \\  (x_n -{\overline{u_{xn}}})(y_1 -{\overline{u_{y1}}}) \ & (x_n -{\overline{u_{xn}}})(y_2 -{\overline{u_{y2}}})&{\cdots} & (x_n -{\overline{u_{xn}}})(y_n -{\overline{u_{yn}}}) \end{bmatrix}  \\ &=& \begin{bmatrix} \frac{1}{n} (x_1 -{\overline{u_{x1}}})(y_1 -{\overline{u_{y1}}}) \ & \frac{1}{n} (x_1 -{\overline{u_{x1}}})(y_2 -{\overline{u_{y2}}}) & {\cdots} & \frac{1}{n} (x_1 -{\overline{u_{x1}}})(y_n -{\overline{u_{yn}}}) \\ \frac{1}{n} (x_2 -{\overline{u_{x2}}})(y_1 -{\overline{u_{y1}}}) \ & \frac{1}{n} (x_2 -{\overline{u_{x2}}})(y_2 -{\overline{u_{y2}}}) & {\cdots} & \frac{1}{n} (x_2 -{\overline{u_{x2}}})(y_n -{\overline{u_{yn}}}) \\ {\vdots}  & {\vdots} & {\ddots} & {\vdots} \\  \frac{1}{n} (x_n -{\overline{u_{xn}}})(y_1 -{\overline{u_{y1}}}) \ & \frac{1}{n} (x_n -{\overline{u_{xn}}})(y_2 -{\overline{u_{y2}}})&{\cdots} & \frac{1}{n} (x_n -{\overline{u_{xn}}})(y_n -{\overline{u_{yn}}}) \end{bmatrix}  \end{eqnarray} \)

って感じになるので、「分散共分散行列」 \sum は最終的に、

\( \begin{eqnarray} \sum =  \begin{bmatrix} \frac{1}{n} (x_1 -{\overline{u_{x1}}})(y_1 -{\overline{u_{y1}}}) \ & \frac{1}{n} (x_1 -{\overline{u_{x1}}})(y_2 -{\overline{u_{y2}}}) & {\cdots} & \frac{1}{n} (x_1 -{\overline{u_{x1}}})(y_n -{\overline{u_{yn}}}) \\ \frac{1}{n} (x_2 -{\overline{u_{x2}}})(y_1 -{\overline{u_{y1}}}) \ & \frac{1}{n} (x_2 -{\overline{u_{x2}}})(y_2 -{\overline{u_{y2}}}) & {\cdots} & \frac{1}{n} (x_2 -{\overline{u_{x2}}})(y_n -{\overline{u_{yn}}}) \\ {\vdots}  & {\vdots} & {\ddots} & {\vdots} \\  \frac{1}{n} (x_n -{\overline{u_{xn}}})(y_1 -{\overline{u_{y1}}}) \ & \frac{1}{n} (x_n -{\overline{u_{xn}}})(y_2 -{\overline{u_{y2}}})&{\cdots} & \frac{1}{n} (x_n -{\overline{u_{xn}}})(y_n -{\overline{u_{yn}}}) \end{bmatrix}  \end{eqnarray} \)

⇧ みたいな感じになるってことですかね?

ただ、Wikipediaの情報だと、 \frac{1}{n} の部分が、 E ってなってるんよね、数学の知識が無いからよく分からんけど、何かさらなる計算をするってことなんですかね?

2021年1月31日(日)追記:↓ ここから

どうやら、ベクトルで掛け算すると、

www.ydc.co.jp

同様に、a と b を偏差ベクトルとすると、その内積は偏差積和になります。

Vol5-21.png
つまり
Vol5-22.png

を偏差ベクトル a と b の内積を用いて次のように表わすことができます。
Vol5-23.png

YDC | データ解析ならPythonが最高!第5回

⇧ すべての要素の積の総和を計算してくれてたみたいね。

ただ、Wikipediaさんの説明にある E がどうやって導き出されるかは、依然として不明なわけだけど...

2021年1月31日(日)追記:↑ ここまで

 

k-means って?

そもそも、何で「分散」について延々と調べてきたかというと、「k-means」ってものが関係してきますと。

k平均法(kへいきんほう、k-means clustering)は、非階層型クラスタリングアルゴリズムクラスタの平均を用い、与えられたクラスタ数k個に分類することから、MacQueen がこのように命名した。k-平均法(k-means)、c-平均法(c-means)とも呼ばれる。

k平均法 - Wikipedia

何度か再発見されており、まず、Hugo Steinhusが1957年に発表し、Stuart Lloydが1957年に考案し、E.W.Forgyが1965年に発表し、James MacQueenが1967年に発表しk-meansと命名した。

k平均法 - Wikipedia

⇧ 紆余曲折がありつつの、

数式で表現すると、下記最適化問題を解くアルゴリズム。本アルゴリズムでは最小値ではなく初期値依存の極小値に収束する。

k平均法 - Wikipedia

単純なアルゴリズムであり、広く用いられている。分類をファジィ化したファジィc-平均法エントロピー法をはじめ、データ構造を発見するさまざまな応用手法が提案されている。上記の最適化問題NP困難であるが、k-平均法は局所解を求める効率的なヒューリスティックである。k-平均法は混合正規分布に対するEMアルゴリズムの特殊な場合である

k平均法 - Wikipedia

⇧ う、う~ん...難解な言葉が出てきてはいますが、

k-平均法は、一般には以下のような流れで実装される。データの数を クラスタの数を  としておく。

  1. 各データ  に対してランダムクラスタを割り振る。
  2. 割り振ったデータをもとに各クラスタの中心  を計算する。計算は通常割り当てられたデータの各要素の算術平均が使用されるが、必須ではない。
  3. 各  と各  との距離を求め、 を最も近い中心のクラスタに割り当て直す。
  4. 上記の処理で全ての  のクラスタの割り当てが変化しなかった場合、あるいは変化量が事前に設定した一定の閾値を下回った場合に、収束したと判断して処理を終了する。そうでない場合は新しく割り振られたクラスタから  を再計算して上記の処理を繰り返す。

k平均法 - Wikipedia

⇧ 図とか無いからイメージが掴みにくいんだけど、

イメージとしては、

⇧ のような感じで、

  1. クラスタ」の中心(上図だと、青と赤の×マークになるので、2つ)を決めてあげる
  2. クラスタ」の中心と各要素の距離を計算する
  3. 計算した結果、それぞれの×マークに近いほうにグループ分けしてあげる
  4. グループの中で「クラスタ」の中心が動くようなら、改めて、1~3を繰り返す

 っていうように、「クラスタ」の中心が最適な場所に来たら完了ですと。

上図の例だと、2つの「クラスタ」に分けることができましたと。

「k-means」っていうのは「教師なし機械学習」の1つで「クラスタリング」のアルゴリズムを実現する機械学習モデルってことですかね。

 

次元の呪いとは?

で、「機械学習」にとって、データはかなり重要な役割を担っているということのようなのですが、

次元の呪い(じげんののろい、The curse of dimensionality)という言葉は、リチャード・ベルマンが使ったもので、(数学的)空間の次元が増えるのに対応して問題の算法指数関数的に大きくなることを表している。

次元の呪い - Wikipedia

例えば、単位区間をサンプリングするには100個の点を等間隔で、かつ点間の距離を 0.01 以上にならないように配置すれば十分である。同じようなサンプリングを10次元の単位超立方体について行おうとすると、必要な点の数は 1020 にもなる。したがって、10次元の超立方体はある意味では単位区間の1018倍の大きさとも言える。

次元の呪い - Wikipedia

⇧ ってな感じで、高次元になればなるほど、必要なデータ数も増えるであろうし、

高次元ユークリッド空間の広大さを示す別の例として、単位球と単位立方体の大きさを次元を上げながら比較してみればよい。次元が高くなると、単位球は単位立方体に比較して小さくなっていく。したがってある意味では、ほとんど全ての高次元空間は中心から遠く、言い換えれば、高次元単位空間はほとんど超立方体の角で構成されており、「中間」がない。このことは、カイ二乗分布を理解する上で重要である。

次元の呪い - Wikipedia

⇧ 分布で考えた場合、各要素と中心からの距離は、高次元になるほど長くなると。

次元の呪いは、状態変数の次元が大きい動的最適化問題を数値的後ろ向き帰納法で解く際の重大な障害となる。また機械学習問題においても、高次元の特徴空間と高次元空間での最近傍探索で、有限個の標本から自然の状態を学習しようとする際に、次元の呪いが問題を複雑化する。

次元の呪い - Wikipedia

⇧ ってな具合に、「機械学習」において「次元の呪い」はなかなかに厄介な問題ですと。

具体的に、「機械学習」における「次元の呪い」ってどんな状況のことを言うのか?

www.atmarkit.co.jp

 機械学習における次元の呪いCurse of dimensionality)とは、次元(=ニューラルネットワークで言うと入力データとなる特徴量)の数が増えるほど、正確に一般化する(=高い精度のモデルを作る)ために必要な訓練データの量が「指数関数」的に増えてしまうことである(=呪いのようにつきまとう宿命)。

次元の呪い(Curse of dimensionality)とは?:AI・機械学習の用語辞典 - @IT

⇧ ってな感じで、超ザックリ言うと、「入力データの列(特徴量)数」を「次元」と考えるってことみたいね。

で、実際の業務で使う「入力データ」において「入力データの列(特徴量)数」が多くても、各列(特徴量)に満遍なくデータが入ってるかというと、さにあらず、って状況があるみたい。

じゃあ、使わなくても良いような「列(特徴量)」を削除すれば、「入力データ」を低次元できるってことよね?

 

次元削減って?

Wikipediaさ~ん!

Dimensionality reduction, or dimension reduction, is the transformation of data from a high-dimensional space into a low-dimensional space so that the low-dimensional representation retains some meaningful properties of the original data, ideally close to its intrinsic dimension. Working in high-dimensional spaces can be undesirable for many reasons; raw data are often sparse as a consequence of the curse of dimensionality, and analyzing the data is usually computationally intractable. Dimensionality reduction is common in fields that deal with large numbers of observations and/or large numbers of variables, such as signal processingspeech recognitionneuroinformatics, and bioinformatics.

https://en.wikipedia.org/wiki/Dimensionality_reduction

Wikipediaさ~んの説明によりますと、「次元の呪い」のせいで疎らになってしまってる「入力データ」を高次元から低次元へと次元を削除すること、っていうことになるみたいね。

専門用語だと、

Feature projection (also called Feature extraction) transforms the data from the high-dimensional space to a space of fewer dimensions. The data transformation may be linear, as in principal component analysis (PCA), but many nonlinear dimensionality reduction techniques also exist.[4][5] For multidimensional data, tensor representation can be used in dimensionality reduction through multilinear subspace learning.

https://en.wikipedia.org/wiki/Dimensionality_reduction

⇧「Feature projection (also called Feature extraction)」って呼ばれるそうな。

で、「次元削減」の手法は、Wikipediaさんによりますと、

ってな感じで、2021年1月30日(土)現在、9つぐらいが有名どころになるみたい。 

 

sklearn.decomposition.PCAって?

で、Python機械学習向けのライブラリで「scikit-learn」ってものに、「次元削減」用のクラスが用意されてますと。

scikit-learn.org

The sklearn.decomposition module includes matrix decomposition algorithms, including among others PCA, NMF or ICA. Most of the algorithms of this module can be regarded as dimensionality reduction techniques.

https://scikit-learn.org/stable/modules/classes.html#module-sklearn.decomposition

⇧「PCA」「NMF」「ICA」などの「行列分解アルゴリズム」は「次元削除手法」と見なすことができます、という説明がありますと。

「ICA」ってのは、

独立成分分析(どくりつせいぶんぶんせき、independent component analysis、ICA)は、多変量の信号を複数の加法的な成分に分離するための計算手法である。各成分は、ガウス的でない信号で相互に統計的独立なものを想定する。これはブラインド信号分離の特殊な場合である。

独立成分分析 - Wikipedia

⇧ ってことなのかな、たぶん。

で、「sklearn.decomposition.PCA」 は、

Linear dimensionality reduction using Singular Value Decomposition of the data to project it to a lower dimensional space. The input data is centered but not scaled for each feature before applying the SVD.

https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA

It uses the LAPACK implementation of the full SVD or a randomized truncated SVD by the method of Halko et al. 2009, depending on the shape of the input data and the number of components to extract.

https://scikit-learn.org/stable/modules/generated/sklearn.decomposition.PCA.html#sklearn.decomposition.PCA

⇧よく分からんけど、「SVD(Singular Value Decomposition)」って手法を使った「次元削減」ってことみたい。

「SVD(Singular Value Decomposition)」って?

特異値分解(とくいちぶんかい、singular value decomposition; SVD)とは線形代数学における複素数あるいは実数を成分とする行列に対する行列分解の一手法であり、Autonneによって導入された。悪条件方程式の数値解法で重宝するほか、信号処理統計学の分野で用いられる特異値分解は、行列に対するスペクトル定理の一般化とも考えられ、正方行列に限らず任意の形の行列を分解できる

特異値分解 - Wikipedia

⇧ う、う~ん...超大雑把に捉えると、行列を分解できますと。

Wikipediaさんの説明によると、上図は、

\( \begin{eqnarray} \mathit{ M }  = \begin{bmatrix}1 & 1 \\0 & 1\end{bmatrix} \end{eqnarray} \)

っていう行列があった場合、 

\( \begin{eqnarray} \mathit{ M }  = \mathit{ U } {\cdot} {\Sigma} {\cdot} \mathit{ V }^{*} \end{eqnarray} \) 

ってな具合に、分解できるらしく、

 ここで U は m 行 m 列のユニタリ行列V* は n 行 n 列のユニタリ行列 V の随伴行列複素共役かつ転置行列)。さらに半正定値行列 MM*(あるいは M*M)の正の固有値平方根 σ1 ≥ … ≥ σr > 0 が存在して、q = min(mn), σr+1 = … = σq = 0 とおけば、m 行 n 列の行列 Σ は以下の形になる。

ここで Δ は σ1, ..., σq を対角成分とする q 行 q 列の対角行列、部分行列 O は零行列である。 この分解を特異値分解σ1, ..., σq を行列 M の特異値と呼ぶ。

特異値分解 - Wikipedia

⇧ っていう説明になってるけど、サッパリ意味が分からんですな...

まぁ、話を戻すと、「sklearn.decomposition.PCA」 は、「PCA(Principal component analysis)」ということみたいなんだけど、「PCA(Principal component analysis)」は日本語だと「主成分分析」とか呼ばれるみたいですが、内部の計算処理なんかで「SVD(Singular Value Decomposition)」って手法を使ってるんだと。

 

PCA(Principal component analysis)もとい、主成分分析って?

で、「PCA(Principal component analysis)」っていうのは、どういったことをやっているのか?

The principal components of a collection of points in a real p-space that are a sequence of  direction vectors, where the  vector is the direction of a line that best fits the data while being orthogonal to the first  vectors. Here, a best-fitting line is defined as one that minimizes the average squared distance from the points to the line. These directions constitute an orthonormal basis in which different individual dimensions of the data are linearly uncorrelatedPrincipal component analysis (PCA) is the process of computing the principal components and using them to perform a change of basis on the data, sometimes using only the first few principal components and ignoring the rest.

https://en.wikipedia.org/wiki/Principal_component_analysis

PCA is defined as an orthogonal linear transformation that transforms the data to a new coordinate system such that the greatest variance by some scalar projection of the data comes to lie on the first coordinate (called the first principal component), the second greatest variance on the second coordinate, and so on.

https://en.wikipedia.org/wiki/Principal_component_analysis

⇧ 各データからの平均二乗距離を最小とする線を1本づつ引いていくってことらしく、1つ前に引いた線と次に引く線は直交している必要がありますと。

「第1主成分」「第2主成分」って感じで「主成分」を定義していく際に、データの分散との関係が、

 第1主成分 \gt 第2主成分 \gt 第3主成分 \cdots \gt  第n主成分

 データの分散 = 第1主成分の分散 + 第2主成分の分散 \\ + 第3主成分の分散 \cdots 第n主成分の分散  

っていうような感じになっている必要があるみたい。

はい、「分散」が出てきました。 

www.investor-daiki.com

まず初めに主成分分析の目的は高次元のデータにおいて分散が最大となるような方向(ベクトルa)を見つけることです。

https://en.wikipedia.org/wiki/Principal_component_analysis

⇧ 上記サイト様によりますと、「分散」が小さくならないようにせねばならぬと。

で、さらに、この「主成分」ってのを計算すると出てくる行列ってのが、「経験的な標本共分散行列」に比例するってことで、「共分散行列」も関係してくるっぽい。

まぁ、よく分からんのだけど、「PCA(Principal component analysis)」ってのは、データの分散を出来得る限り維持するような「主成分」を定義していくことで、データの次元削減を実現するってことみたいね。

ここで、日本語のWikipediaさんのほうが概要がまとまっていたことに気付くという...

主成分分析(しゅせいぶんぶんせき、principal component analysis; PCA)は、相関のある多数の変数から相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を合成する多変量解析の一手法。データの次元を削減するために用いられる。

主成分分析 - Wikipedia

主成分を与える変換は、第一主成分の分散最大化し、続く主成分はそれまでに決定した主成分と直交するという拘束条件の下で分散を最大化するようにして選ばれる。主成分の分散を最大化することは、観測値の変化に対する説明能力を可能な限り主成分に持たせる目的で行われる。選ばれた主成分は互いに直交し、与えられた観測値のセットを線型結合として表すことができる。

主成分分析 - Wikipedia

言い換えると、主成分は観測値のセットの直交基底となっている。主成分ベクトルの直交性は、主成分ベクトルが共分散行列(あるいは相関行列)の固有ベクトルになっており、共分散行列が実対称行列であることから導かれる。

主成分分析 - Wikipedia

⇧ という感じで、データのばらつきに焦点を当てつつ、データの次元削減ができるってことですかね。

主成分分析は与えられたデータを n 次元の楕円体にフィッティングするものであると考えることができる。このとき、それぞれの主成分は楕円体の軸に対応している。楕円体の軸が短いほどデータの分散は小さく、短い軸に対応する主成分を無視することで、データの分散と同程度に小さな情報の損失だけで、データをより少ない変数で表現することができる。

主成分分析 - Wikipedia

楕円体の軸を見つけるには、データの平均座標軸原点に合わせる必要がある。そのため、データの共分散行列を計算し、共分散行列に対する固有値固有ベクトルを計算する。また、それぞれの固有ベクトル直交化し、正規化する必要がある。固有ベクトルの組として互いに直交する単位ベクトルが得られたなら、それらに対応する軸を持つ楕円体によってデータをフィッティングすることができる。それぞれの軸に対する寄与率proportion of the variance: 分散の)は、その軸に対応する固有ベクトルに対する固有値を、すべての固有値の和で割ったものとして得ることができる。

主成分分析 - Wikipedia

注意すべき点として、分散はデータのスケールに依存するため、主成分分析の結果はデータをスケール変換することで変わり得るということが挙げられる。

主成分分析 - Wikipedia

で、「主成分分析」は、

⇧「累積寄与率」ってのが高いほど、情報の損失率は低いと言えるみたい。

www.macromill.com

 

累積寄与率を基準とする

全体の情報の7、8割がカバーできていればよいという考え方から、累積寄与率が、70~80%に達するところまでの、主成分数を採用します。

 

主成分分析|マーケティングリサーチのマクロミル | マクロミル

⇧ プロジェクトの方針にもよるとは思われますが、「累積寄与率」が80%以上を目安にする感じですかね。

「主成分分析」の雰囲気については、

⇧ 上記サイト様のスライドがイメージしやすいかと。

recruit.cct-inc.co.jp

⇧ 上記サイト様も詳しいです。

というわけで、「k-means」のような「教師なし機械学習」は「入力データ」の精度がかなり影響してくるので、「次元削減」などしてデータの精度を上げておくことが重要ってことになるんですかね。

数学の概念が入ってくると、モヤモヤ感が凄まじいことになりますな...

zellij.hatenablog.com

⇧ 数学系の説明でWikipediaさんの内容が分かり辛いって思ってたのは自分だけじゃなかったことが分かって少し救われました。

私は文系なので数学の知識が無いから辛い...

今回はこのへんで。