オルバースのパラドックス (Olbers' paradox, Olbers's paradox) は、「宇宙の恒星の分布がほぼ一様で、恒星の大きさも平均的に場所によらないと仮定すると、空は全体が太陽面のように明るく光輝くはず」というパラドックスである。 その名は、18〜19世紀の天文学者であるヴィルヘルム・オルバースに由来する。ただしオルバースが最初に提起したわけではない。 オルバースの逆説、オルバースの逆理、オルバースの背理、ド・シェゾー=オルバースのパラドックス (de Cheseaux-Olbers paradox)などともいう。
このパラドックスの帰結は、星は距離の2乗に反比例して見かけの面積が小さくなるが、距離が遠い星の数は距離の2乗で増えるので、これらはちょうど打ち消しあい、どの方向を見てもいずれかの星のまばゆい表面がみえるはずだという推論に基づく。 現在では、そのために必要な距離や時間あるいは星の密度は、実際の宇宙の大きさ・年齢・密度よりおよそ10兆倍も大きなものとなることが明らかとなったため、パラドックスの前提は成立しないことがわかっている。 これと同様に「宇宙が一様で無限の広がりを持つ」ことを前提とした天文学のパラドックスにゼーリガーのパラドックスがある。
⇧ そんなパラドックスが存在したなんて、露程も知らず私は今日まで生きてきました、どうもボクです。
というわけで、今回は分散とかについてなんかを調査です。
レッツトライ~。
分散って?
Wikipediaさ~ん!
分散(ぶんさん、英: variance)とは、確率論では、確率変数 X からその期待値 E(X) を引いた2乗の期待値 σ2 = V(X) = E[(X − E(X))2] のこと。確率変数の2次の中心化モーメントである。確率変数の分布が期待値からどれだけ散らばっているかを示す非負の値である。
統計学では、記述統計学においては標本が標本平均からどれだけ散らばっているかを示す指標として標本分散(ひょうほんぶんさん、英: sample variance)を、推測統計学においては不偏分散(ふへんぶんさん、英: unbiased variance)・不偏標本分散(ふへんひょうほんぶんさん、英: unbiased sample variance)を用いる。0 に近いほど散らばりは小さい。
⇧ ってことで、 「分散」という名前からも分かる通り、「ある値を基準にして各値がどれだけ散らばっているか」っていう度合いを測るための指標ですと。
なので、値が複数あるってことが前提の考え方ですかね。
分布で考えた場合、
「平均値±σ」で全体の68.3%、「平均値±2σ」で全体の95.4%、「平均値±3σ」で全体の99.7%がカバーされる。製品設計においては、「平均値±3σ」を管理限界とすることが多い。「平均値±3σ」を管理限界とした場合、そこから外れる製品はアウスライサーと呼ばれる。
⇧ 横に広がるほど、標準偏差が大きくなってるから、分散も大きくなるということみたいですね。
共分散って?
Wikipediaさ~ん!
共分散(きょうぶんさん、英: covariance)は、2 組の対応するデータ間での、平均からの偏差の積の平均値である。2 組の確率変数 X, Y の共分散 Cov(X, Y) は、E で期待値を表すことにして、
で定義する。
⇧ え、え~っと...
「偏差」は?
⇧ ってことなので、「共分散」ってのは、
- Xの母集団()
- 基準値:(Xの集団の平均値)
- 偏差:基準値とXの集団の各要素との差
と、
- Yの母集団()
- 基準値:(Yの集団の平均値)
- 偏差:基準値とYの集団の各要素との差
の「偏差」の積を合計したものらしいので、
⇧ 上記サイト様を参考にさせていただくと、
\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はそれぞれ複数の値の集団なので、2つの集団で作りだされる分散ってことなんですかね?
分散共分散行列って?
Wikipediaさ~ん!
分散共分散行列(ぶんさんきょうぶんさんぎょうれつ、英: variance-covariance matrix)や共分散行列(きょうぶんさんぎょうれつ、英: covariance matrix)とは、統計学と確率論において、ベクトルの要素間の共分散の行列である。これは、スカラー値をとる確率変数における分散の概念を、多次元に拡張したものである。
⇧ 行列の要素の1つ1つが、2つの「ベクトル」間の各要素の「共分散」になっている行列のことっていうことですかね。
ちなみに、「共分散」は
⇧ ってことだったので、「分散共分散行列」は2つのベクトルの要素間での、平均からの偏差の積の平均値を要素に持つ行列で、2つのベクトルの要素で掛け算するには、
「:ベクトル」、「:ベクトル」である場合、話が少し複雑です。
実はルールがあり、「」の列数と「」の行数とが等しくないと、
積の計算ができないルールとなっています。
仮に、「」「」に縦長のベクトルであれば、計算が可能なのは、
- 「」
- 「」
のいずれかとなります。
ここで式中の「」は転置の意です。
転置とは、「ベクトル」「行列」にて、行と列を対角に反転することです。
⇧ 上記サイト様のように、両方とも縦長のベクトルの場合は、片方を「転置」させないといけませんと。
で、Wikipediaさんの情報と、
⇧ 上記サイト様を参考にさせていただくと、「分散共分散行列」 ってのは、
ベクトル 、ベクトル を、
とし、
Xの平均ベクトル 、Yの平均ベクトル を、
した場合(Xの平均ベクトル と、Yの平均ベクトル の各要素は全て同じ値になると思われるけど、ベクトルでの計算上、ベクトル と、ベクトル の各要素数と同じ要素数にする必要があるんではなかろうかと思って要素数を合わせる形にしたけど、数学の知識がないので分からず...)、 ベクトル 、ベクトル 、Xの平均ベクトル と、Yの平均ベクトル の要素数が、 とすると、ベクトル 、ベクトル の要素間の共分散 は、
の積の平均になるので、
って感じになるので、「分散共分散行列」 は最終的に、
⇧ みたいな感じになるってことですかね?
ただ、Wikipediaの情報だと、 の部分が、 ってなってるんよね、数学の知識が無いからよく分からんけど、何かさらなる計算をするってことなんですかね?
2021年1月31日(日)追記:↓ ここから
どうやら、ベクトルで掛け算すると、
⇧ すべての要素の積の総和を計算してくれてたみたいね。
ただ、Wikipediaさんの説明にある がどうやって導き出されるかは、依然として不明なわけだけど...
2021年1月31日(日)追記:↑ ここまで
k-means って?
そもそも、何で「分散」について延々と調べてきたかというと、「k-means」ってものが関係してきますと。
k平均法(kへいきんほう、英: k-means clustering)は、非階層型クラスタリングのアルゴリズム。クラスタの平均を用い、与えられたクラスタ数k個に分類することから、MacQueen がこのように命名した。k-平均法(k-means)、c-平均法(c-means)とも呼ばれる。
何度か再発見されており、まず、Hugo Steinhusが1957年に発表し、Stuart Lloydが1957年に考案し、E.W.Forgyが1965年に発表し、James MacQueenが1967年に発表しk-meansと命名した。
⇧ 紆余曲折がありつつの、
単純なアルゴリズムであり、広く用いられている。分類をファジィ化したファジィc-平均法やエントロピー法をはじめ、データ構造を発見するさまざまな応用手法が提案されている。上記の最適化問題はNP困難であるが、k-平均法は局所解を求める効率的なヒューリスティックである。k-平均法は混合正規分布に対するEMアルゴリズムの特殊な場合である
⇧ う、う~ん...難解な言葉が出てきてはいますが、
k-平均法は、一般には以下のような流れで実装される。データの数を 、クラスタの数を としておく。
⇧ 図とか無いからイメージが掴みにくいんだけど、
イメージとしては、
⇧ のような感じで、
- 「クラスタ」の中心(上図だと、青と赤の×マークになるので、2つ)を決めてあげる
- 「クラスタ」の中心と各要素の距離を計算する
- 計算した結果、それぞれの×マークに近いほうにグループ分けしてあげる
- グループの中で「クラスタ」の中心が動くようなら、改めて、1~3を繰り返す
っていうように、「クラスタ」の中心が最適な場所に来たら完了ですと。
上図の例だと、2つの「クラスタ」に分けることができましたと。
「k-means」っていうのは「教師なし機械学習」の1つで「クラスタリング」のアルゴリズムを実現する機械学習モデルってことですかね。
次元の呪いとは?
で、「機械学習」にとって、データはかなり重要な役割を担っているということのようなのですが、
次元の呪い(じげんののろい、英: The curse of dimensionality)という言葉は、リチャード・ベルマンが使ったもので、(数学的)空間の次元が増えるのに対応して問題の算法が指数関数的に大きくなることを表している。
例えば、単位区間をサンプリングするには100個の点を等間隔で、かつ点間の距離を 0.01 以上にならないように配置すれば十分である。同じようなサンプリングを10次元の単位超立方体について行おうとすると、必要な点の数は 1020 にもなる。したがって、10次元の超立方体はある意味では単位区間の1018倍の大きさとも言える。
⇧ ってな感じで、高次元になればなるほど、必要なデータ数も増えるであろうし、
高次元ユークリッド空間の広大さを示す別の例として、単位球と単位立方体の大きさを次元を上げながら比較してみればよい。次元が高くなると、単位球は単位立方体に比較して小さくなっていく。したがってある意味では、ほとんど全ての高次元空間は中心から遠く、言い換えれば、高次元単位空間はほとんど超立方体の角で構成されており、「中間」がない。このことは、カイ二乗分布を理解する上で重要である。
⇧ 分布で考えた場合、各要素と中心からの距離は、高次元になるほど長くなると。
次元の呪いは、状態変数の次元が大きい動的最適化問題を数値的後ろ向き帰納法で解く際の重大な障害となる。また機械学習問題においても、高次元の特徴空間と高次元空間での最近傍探索で、有限個の標本から自然の状態を学習しようとする際に、次元の呪いが問題を複雑化する。
⇧ ってな具合に、「機械学習」において「次元の呪い」はなかなかに厄介な問題ですと。
具体的に、「機械学習」における「次元の呪い」ってどんな状況のことを言うのか?
機械学習における次元の呪い(Curse of dimensionality)とは、次元(=ニューラルネットワークで言うと入力データとなる特徴量)の数が増えるほど、正確に一般化する(=高い精度のモデルを作る)ために必要な訓練データの量が「指数関数」的に増えてしまうことである(=呪いのようにつきまとう宿命)。
⇧ ってな感じで、超ザックリ言うと、「入力データの列(特徴量)数」を「次元」と考えるってことみたいね。
で、実際の業務で使う「入力データ」において「入力データの列(特徴量)数」が多くても、各列(特徴量)に満遍なくデータが入ってるかというと、さにあらず、って状況があるみたい。
じゃあ、使わなくても良いような「列(特徴量)」を削除すれば、「入力データ」を低次元できるってことよね?
次元削減って?
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 processing, speech recognition, neuroinformatics, and bioinformatics.
⇧ 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.
⇧「Feature projection (also called Feature extraction)」って呼ばれるそうな。
で、「次元削減」の手法は、Wikipediaさんによりますと、
- PCA(Principal component analysis)
- NFM(Non-negative matrix factorization)
- Kernel PCA(Kernel principal component analysis)
- Graph-based kernel PCA
- Linear discriminant analysis (LDA)
- Generalized discriminant analysis (GDA)
- Autoencoder
- t-SNE(t-distributed stochastic neighbor embedding)
- UMAP
ってな感じで、2021年1月30日(土)現在、9つぐらいが有名どころになるみたい。
sklearn.decomposition.PCAって?
で、Pythonの機械学習向けのライブラリで「scikit-learn」ってものに、「次元削減」用のクラスが用意されてますと。
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)は、多変量の信号を複数の加法的な成分に分離するための計算手法である。各成分は、ガウス的でない信号で相互に統計的独立なものを想定する。これはブラインド信号分離の特殊な場合である。
⇧ ってことなのかな、たぶん。
で、「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.
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.
⇧よく分からんけど、「SVD(Singular Value Decomposition)」って手法を使った「次元削減」ってことみたい。
「SVD(Singular Value Decomposition)」って?
特異値分解(とくいちぶんかい、英: singular value decomposition; SVD)とは線形代数学における複素数あるいは実数を成分とする行列に対する行列分解の一手法であり、Autonneによって導入された。悪条件方程式の数値解法で重宝するほか、信号処理や統計学の分野で用いられる。特異値分解は、行列に対するスペクトル定理の一般化とも考えられ、正方行列に限らず任意の形の行列を分解できる。
⇧ う、う~ん...超大雑把に捉えると、行列を分解できますと。
⇧ 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(m, n), σr+1 = … = σq = 0 とおけば、m 行 n 列の行列 Σ は以下の形になる。
ここで Δ は σ1, ..., σq を対角成分とする q 行 q 列の対角行列、部分行列 O は零行列である。 この分解を特異値分解、σ1, ..., σq を行列 M の特異値と呼ぶ。
⇧ っていう説明になってるけど、サッパリ意味が分からんですな...
まぁ、話を戻すと、「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 uncorrelated. Principal 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.
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.
⇧ 各データからの平均二乗距離を最小とする線を1本づつ引いていくってことらしく、1つ前に引いた線と次に引く線は直交している必要がありますと。
「第1主成分」「第2主成分」って感じで「主成分」を定義していく際に、データの分散との関係が、
っていうような感じになっている必要があるみたい。
はい、「分散」が出てきました。
まず初めに主成分分析の目的は高次元のデータにおいて分散が最大となるような方向(ベクトル)を見つけることです。
⇧ 上記サイト様によりますと、「分散」が小さくならないようにせねばならぬと。
で、さらに、この「主成分」ってのを計算すると出てくる行列ってのが、「経験的な標本共分散行列」に比例するってことで、「共分散行列」も関係してくるっぽい。
まぁ、よく分からんのだけど、「PCA(Principal component analysis)」ってのは、データの分散を出来得る限り維持するような「主成分」を定義していくことで、データの次元削減を実現するってことみたいね。
ここで、日本語のWikipediaさんのほうが概要がまとまっていたことに気付くという...
主成分分析(しゅせいぶんぶんせき、英: principal component analysis; PCA)は、相関のある多数の変数から相関のない少数で全体のばらつきを最もよく表す主成分と呼ばれる変数を合成する多変量解析の一手法。データの次元を削減するために用いられる。
主成分を与える変換は、第一主成分の分散を最大化し、続く主成分はそれまでに決定した主成分と直交するという拘束条件の下で分散を最大化するようにして選ばれる。主成分の分散を最大化することは、観測値の変化に対する説明能力を可能な限り主成分に持たせる目的で行われる。選ばれた主成分は互いに直交し、与えられた観測値のセットを線型結合として表すことができる。
言い換えると、主成分は観測値のセットの直交基底となっている。主成分ベクトルの直交性は、主成分ベクトルが共分散行列(あるいは相関行列)の固有ベクトルになっており、共分散行列が実対称行列であることから導かれる。
⇧ という感じで、データのばらつきに焦点を当てつつ、データの次元削減ができるってことですかね。
主成分分析は与えられたデータを n 次元の楕円体にフィッティングするものであると考えることができる。このとき、それぞれの主成分は楕円体の軸に対応している。楕円体の軸が短いほどデータの分散は小さく、短い軸に対応する主成分を無視することで、データの分散と同程度に小さな情報の損失だけで、データをより少ない変数で表現することができる。
楕円体の軸を見つけるには、データの平均を座標軸の原点に合わせる必要がある。そのため、データの共分散行列を計算し、共分散行列に対する固有値と固有ベクトルを計算する。また、それぞれの固有ベクトルを直交化し、正規化する必要がある。固有ベクトルの組として互いに直交する単位ベクトルが得られたなら、それらに対応する軸を持つ楕円体によってデータをフィッティングすることができる。それぞれの軸に対する寄与率(proportion of the variance: 分散の比)は、その軸に対応する固有ベクトルに対する固有値を、すべての固有値の和で割ったものとして得ることができる。
注意すべき点として、分散はデータのスケールに依存するため、主成分分析の結果はデータをスケール変換することで変わり得るということが挙げられる。
で、「主成分分析」は、
⇧「累積寄与率」ってのが高いほど、情報の損失率は低いと言えるみたい。
累積寄与率を基準とする
全体の情報の7、8割がカバーできていればよいという考え方から、累積寄与率が、70~80%に達するところまでの、主成分数を採用します。
⇧ プロジェクトの方針にもよるとは思われますが、「累積寄与率」が80%以上を目安にする感じですかね。
「主成分分析」の雰囲気については、
⇧ 上記サイト様のスライドがイメージしやすいかと。
⇧ 上記サイト様も詳しいです。
というわけで、「k-means」のような「教師なし機械学習」は「入力データ」の精度がかなり影響してくるので、「次元削減」などしてデータの精度を上げておくことが重要ってことになるんですかね。
数学の概念が入ってくると、モヤモヤ感が凄まじいことになりますな...
⇧ 数学系の説明でWikipediaさんの内容が分かり辛いって思ってたのは自分だけじゃなかったことが分かって少し救われました。
私は文系なので数学の知識が無いから辛い...
今回はこのへんで。