第10回
主成分分析 with 線形代数,Octave
2021.07.12
(Mon.)菅沼 雅徳,川越 吉晃
• 線形代数の知識で主成分分析を理解する • Octaveでの主成分分析の実⾏する
本⽇の講義内容
今回の演習課題 ⼿書き⽂字データセットのデータ分布を主成分分析で可視化するプログラム ⼆次元 三次元• 多次元データを⾏列もしくはベクトルで表現 • それらデータの変換を⾏列演算で実施 = ⾏列は写像もしくはデータそのものを表す = ⾏列の特性を知ることが重要(ランク,固有値・固有ベクトル,対⾓化, ...) 3
線形代数の基礎:⾏列
⾏列の低ランク近似例使いどころ
• 多次元データのもつ情報を可能な限り損なわずに,より低い次元で要約
• データの可視化やデータ解析の前処理としてよく使われる
主成分分析
(Principal Component Analysis; PCA)
とは
多次元データ(𝑿 ∈ ℝ!×#×$)
使いどころ
• 多次元データのもつ情報を可能な限り損なわずに,より低い次元で表現
• データの可視化やデータ解析の前処理としてよく使われる
5
主成分分析
(Principal Component Analysis; PCA)
とは
上位の主成分を 可視化
https://sandipanweb.wordpress.com/2018/01/06/eigenfaces-and-a-simple-face-detector-with-pca-svd-in-python/
固有顔 顔データ
7
主成分分析のイメージ
• 分散(ばらつき)が⼤きい⽅向に軸を設定する • 分散が⼤きい =情報量⼤ =元の情報を保持 第⼀主成分 第⼆主成分9
極端な例
元データ 変換後 主成分分析 • 元のデータは2次元で表現していたが,1次元で⼗分に表現可能 = 次元削減 • 新しい軸は元データの分散が⼤きい⽅向に⼀致する 𝑥 𝑦 𝑧1. データの標準化 • データ𝑿を平均0,分散が1になるようにデータを変換(※分散を1にしない場合もある) 2. 分散共分散⾏列の算出 • Σ = 𝑋!𝑋 3. 分散共分散⾏列から固有値・固有ベクトルを算出 • Σ = 𝑉Λ𝑉"# 4. 上位𝒌個の固有値に対応する固有値ベクトルを抽出 • Σ = 𝑉Λ𝑉"# = 𝑣#, … , 𝑣$ 𝜆# ⋯ 0 ⋮ ⋱ ⋮ 0 ⋯ 𝜆$ 𝑣#, … 𝑣$ "# 5. 上記の固有ベクトルでデータを射影 • 𝑋 = 𝑋/ !𝑉%
主成分分析の流れ
11
データの標準化
データ𝑿の形式:𝑛×𝑑⾏列 • 𝑛個のデータが格納 • 各データは𝑑次元のベクトルで表現 𝑿 = 𝑋',' ⋯ 𝑋',) ⋮ ⋱ ⋮ 𝑋*,' ⋯ 𝑋*,) 𝑑次元 𝑛サンプル データの標準化:元データの各成分の平均を0かつ分散を1にする ̂𝜇% = 1 𝑛 1 &'( ) 𝑋&,% 3𝜎% = 1 𝑛 − 11 &'( ) 𝑋&,% − ̂𝜇% + … 平均 … 標準偏差 𝑋6,7 ← 𝑋6,7 − ̂𝜇7 .𝜎7 … 標準化後のデータ.イメージ的には各成分間の単位を揃えている感じ.中⼼化もしくは標準化したデータ𝑿同⼠の⾏列積 • 分散共分散⾏列:Σ = 𝑋8𝑋 ∈ ℝ)×) • 標準化している場合は相関⾏列と呼ばれる
分散共分散⾏列の算出
Σ =
𝜎
!,!
⋯ 𝜎
!,#
⋮
⋱
⋮
𝜎
#,!
⋯ 𝜎
#,#
• 𝜎6,7 = ' : ∑;<'* (𝑋;,6−𝜇6)(𝑋;,7 − 𝜇7) • 対⾓成分には分散 • ⾮対⾓成分には共分散 • 実対称⾏列(𝜎&,( = 𝜎(,&)• 𝚺の最⼤固有値・固有ベクトルが分散最⼤の⽅向を⽰す =求めたい新しい軸 より詳しく⾔うと,分散上位𝑘個の⽅向は上位𝑘個の固有ベクトルそれぞれの⽅向に⼀致する ※ なぜそうなるかは別ページで説明 • Σを固有値分解すれば良い • Σ = 𝑉Λ𝑉=' 13
分散最⼤の⽅向=最⼤固有値に対応する固有ベクトルの⽅向
Λ = 𝜆( ⋱ 𝜆, … 固有値 𝑉 = [𝑣(, … , 𝑣,] … 固有ベクトル 𝑣( 第⼀主成分 𝑣+ 第⼆主成分• 𝑗番⽬の固有ベクトルでデータを射影する事で,第𝑗主成分を得ることが可能 例)第⼀主成分で𝑛番⽬のサンプルを表現する場合 𝑣'8𝑋* = ∑7<') 𝑣',7 𝑋*,7 = 𝑣','𝑋*,' + 𝑣',F𝑋*,F + ⋯ + 𝑣',)𝑋*,)
データの射影
• 上位𝑘個の固有ベクトルでデータを射影する事で,𝑘次元に要約された表現を得る 𝑿𝒗𝒌 = 𝑋',' ⋯ 𝑋',) ⋮ ⋱ ⋮ 𝑋*,' ⋯ 𝑋*,) 𝑣'𝑣F … 𝑣H = >𝑿 ∈ ℝ *×H … 𝑑次元→ 𝑘次元への次元削減 𝑥 𝑣 𝑣-𝑥• 寄与率は該当する主成分がデータをどの程度表現しているかを表す 第𝑗主成分の寄与率 𝐶7:∑ K! "#$ % K " • 例えば,元データの80%を表現できれば⼗分な場合,寄与率の合計が0.8を 超えるまでの固有ベクトルをもってくれば良い 15
寄与率
𝜆% ∶ 𝑗番⽬の固有値 𝑎𝑟𝑔𝑚𝑖𝑛) 9 (*# ) 𝐶( − 0.8• データを中⼼化もしくは標準化し,分散共分散⾏列を算出 • 分散共分散⾏列を固有値分解 • 寄与率の⼤きい固有ベクトルから順にとってきて,データを射影することで よりよい表現を得ることができる
主成分分析まとめ
𝑋6,7 ← 𝑋6,7 − ̂𝜇7 .𝜎7 Σ = 𝜎',' ⋯ 𝜎',) ⋮ ⋱ ⋮ 𝜎),' ⋯ 𝜎),) Σ = 𝑣# … 𝑣$ 𝜆# ⋱ 𝜆 𝑣# … 𝑣$ "# 𝑿𝒗𝒌 = >𝑿 ∈ ℝ*×H 𝑿 = 𝑋',' ⋯ 𝑋',) ⋮ ⋱ ⋮ 𝑋*,' ⋯ 𝑋*,) ∈ ℝ *×) 中⼼化 or 標準化 分散共分散⾏列 or 相関⾏列 固有値分解 寄与率上位の固有ベクトルで射影• ある単位ベクトルを𝑣とし,この⽅向への𝑋6の⻑さは,𝑣8𝑋6 で求まる • ゆえに,全サンプルに対する分散は, ' *='∑6<' * 𝑣8𝑋 6 F = 𝑣8Σ𝑣 と求まる • これを最⼤にするベクトル𝑣の⽅向を求めたい 17
(補⾜)固有値分解に帰着する理由
整理すると, 𝑣 = 1のもとで,max 𝑣8Σ𝑣 となる𝑣を⾒つけたい → ラグランジュの未定乗数法で解くことが可能 → 𝐽' = 𝑣8Σ𝑣 − 𝜆(𝑣8𝑣 − 1) を最⼤化 → OP$ OQ = 2Σ𝑣 − 2𝜆𝑣 → OP$ OQ = 0より, Σ − 𝜆𝐼 𝑣 = 0 これは固有値問題に⼀致し,上記の解は分散共分散⾏列Σの固有値・固有ベクトルとなる• 固有値分解:𝐶𝑉 = 𝑉Λ • 特異値分解:𝑋 = 𝑈Σ𝑉8 𝑋8𝑋 = 𝑉Σ𝑈8𝑈Σ𝑉8 = 𝑉ΣF𝑉8 ここで 𝐶 = 𝑋8𝑋 とおいて,右から𝑉をかけると, 𝐶𝑉 = 𝑉ΣF = 𝑉 Λ F 以上から,⾏列𝑋の右特異ベクトル𝑉と特異値⾏列Σを⽤いて, 𝑋8𝑋 の固有ベクトルを𝑉, 固有値⾏列をΣFと表すことができる
(補⾜)固有値分解と特異値分解
⼿書き数字認識のデータセットであるMNISTのデータ分布を
主成分分析によって可視化するプログラムを書いて提出してください
• MNISTのデータをPCAで2次元および3次元に次元削減し,それぞれ可視化 • 元のデータサイズが10000と⼤きいため,適当に選んだ100点〜500点を 可視化 • MNISTは下記からダウンロード • http://yann.lecun.com/exdb/mnist/ • 今回の演習では,「t10k-images-idx3-ubyte.gz」と「t10k-labels-idx1-ubyte.gz」を 解凍して使⽤して下さい 19演習課題
• fopen関数,fread関数を使⽤
• もとのファイルには画素値以外の情報も含まれているため,fread関数で情報を⾶ばす
• 画像サイズ(28×28)および画像枚数がわかっているため,サイズを指定し,fread関数で
読み込む
• fopen関数,fread関数を使⽤ • もとのファイルにはラベル以外の情報も含まれているため,fread関数で情報を⾶ばす • 画像枚数がわかっているため,サイズを指定し,fread関数で読み込む 21
MNISTの読み込み⽅法(ラベル)
label(100)=9• 同じラベルをもつデータは同じ⾊で表⽰するコード例 • hsv関数で⾊数指定,およびラベル情報と対応付け
• scatter or scatter3でそれぞれ2次元,3次元でデータをプロット可能 • scatter(data1, data2, size of circle, color)