数値解析法及び演習 第十三回

相関行列と主成分分析
  1. 固有値,固有ベクトルを求めるサブルーチン
  2. 相関行列
  3. 主成分分析
  4. 今日の宿題

[1] 固有値,固有ベクトルを求めるサブルーチン

n行n列の実対称行列a(n,n)および行列のサイズnを代入すると,固有値がd(n)に,規格化された(長さが1)固有ベクトルがv(n,n)に出力されるサブルーチン(Numerical recipes in Fortran77より).v(i,j)がj番目の固有ベクトルのi成分,d(j)が対応する固有値となる.

注意点:代入する配列のサイズはn行n列になっていること.メインプログラムでは同じサイズの配列を宣言しておかないとエラーになる.


SUBROUTINE jacobi(a,n,d,v)
  INTEGER :: n,np,nrot
  DOUBLE PRECISION, INTENT(INOUT) :: a(n,n),d(n),v(n,n)
  INTEGER, PARAMETER :: NMAX=500

  INTEGER :: i,ip,iq,j
  DOUBLE PRECISION :: c,g,h,s,sm,t,tau,theta,tresh,b(NMAX),z(NMAX)
  do ip=1,n
     do iq=1,n
        v(ip,iq)=0.D0
     enddo
     v(ip,ip)=1.D0
  enddo
  do  ip=1,n
     b(ip)=a(ip,ip)
     d(ip)=b(ip)
     z(ip)=0.D0
  enddo
  nrot=0
  do i=1,50
     sm=0.D0
     do ip=1,n-1
        do iq=ip+1,n
           sm=sm+abs(a(ip,iq))
        enddo
     enddo
     if(sm == 0.D0)return
     if(i .lt. 4)then
        tresh=0.2D0*sm/n**2
     else
        tresh=0.D0 
     endif
     do ip=1,n-1
        do iq=ip+1,n
           g=100.D0*dabs(a(ip,iq))
      
           if((i.gt.4).and.(dabs(d(ip))+g.eq.dabs(d(ip))) &
                .and.(dabs(d(iq))+g.eq.dabs(d(iq))))then
              a(ip,iq)=0.D0
           else if(dabs(a(ip,iq)).gt.tresh)then
              h=d(iq)-d(ip)
              if(dabs(h)+g.eq.dabs(h))then
                 t=a(ip,iq)/h 
              else
                 theta=0.5D0*h/a(ip,iq)
                 t=1./(dabs(theta)+dsqrt(1.+theta**2))
                 if(theta.lt.0.) t=-t
              endif
              c=1.D0/dsqrt(1+t**2)
              s=t*c
              tau=s/(1.+c)
              h=t*a(ip,iq)
              z(ip)=z(ip)-h
              z(iq)=z(iq)+h
              d(ip)=d(ip)-h
              d(iq)=d(iq)+h
              a(ip,iq)=0.
              do j=1,ip-1
                 g=a(j,ip)
                 h=a(j,iq)
                 a(j,ip)=g-s*(h+g*tau)
                 a(j,iq)=h+s*(g-h*tau)
              enddo
              do j=ip+1,iq-1
                 g=a(ip,j)
                 h=a(j,iq)
                 a(ip,j)=g-s*(h+g*tau)
                 a(j,iq)=h+s*(g-h*tau)
              enddo
              do j=iq+1,n
                 g=a(ip,j)
                 h=a(iq,j)
                 a(ip,j)=g-s*(h+g*tau)
                 a(iq,j)=h+s*(g-h*tau)
              enddo
              do j=1,n
                 g=v(j,ip)
                 h=v(j,iq)
                 v(j,ip)=g-s*(h+g*tau)
                 v(j,iq)=h+s*(g-h*tau)
              enddo
              nrot=nrot+1
           endif
        enddo
     enddo
     do ip=1,n
        b(ip)=b(ip)+z(ip)
        d(ip)=b(ip)
        z(ip)=0.
     enddo
  enddo

  return
END SUBROUTINE jacobi


練習問題1

以下の行列の固有方程式を手で解いて固有値,固有ベクトルを求めよ.さらに上に与えたサブルーチンjacobiを用いて以下の行列の固有値,固有ベクトルを求め,答えが一致することを確認せよ.
  5.D0  2.D0
  2.D0  2.D0

[2] 相関行列

記号の意味

データの種類(国語,数学..)を \(j\) ,サンプル番号(生徒の番号)を \(i\) で記す.データの種類は \(n\) ,サンプルは \(m\) 個あるものとする.データ種類 \(j\),サンプル番号 \(i\) の値を\(x_{ij}\)とする.例えば,生徒番号4,数学の成績(練習問題2)は\(x_{43}\)となる.

データの標準化

一般に異なる変量は異なる次元を持つ.そのためまず各変量をおなじように扱えるようにするために標準化という作業をおこなう.これは,平均値がゼロ,分散が1となるような変換をデータに施すことである.変量\(x_{ij}\)は

\begin{equation} z_{ij} = {x_{ij} - \bar{x}_j\over \sigma_{x_j}} \end{equation} と\(z_{ij}\)に変換される.ここで平均値と分散は \begin{eqnarray} \bar{x}_{j} &=& {1\over m}\sum_{i=1}^mx_{ij}\nonumber\\ \sigma_{x_j}^2 &=& {1\over m}\sum_{i=1}^m (x_{ij}-\bar{x}_j)^2 \end{eqnarray} で与えられる. 標準化の結果, 全てのデータ種の平均値が0, 分散が1となる. \begin{eqnarray} \bar{z}_{j} &=& {1\over m}\sum_{i=1}^mz_{ij}=0\nonumber\\ \sigma_{z_j}^2 &=& {1\over m}\sum_{i=1}^m (z_{ij})^2={1\over m}\sum_{i=1}^m\left({x_{ij} - \bar{x}_j\over \sigma_{x_j}}\right)^2=1 \end{eqnarray} 標準化を行った結果,\(i\)を行番号,\(j\)を列番号とする行列\(z_{ij}\)が作られる. \begin{equation} Z= \left( \begin{array}{cccc} z_{11} & z_{12} & \ldots & z_{1n} \\ z_{21} & z_{22} & \ldots & z_{2n} \\ ... & ... & ... & ...\\ z_{m1} & z_{m2} & \ldots & z_{mn} \end{array} \right) \end{equation}


この行列の転置行列を\(Z\)にかけると次の行列Rを得ることができる. \begin{eqnarray} R={1\over m}Z^{T}Z&=&{1\over m} \left( \begin{array}{cccc} z_{11} & z_{21} & \ldots & z_{m1} \\ z_{12} & z_{22} & \ldots & z_{m2} \\ ... & ... & ... & ...\\ z_{1n} & z_{2n} & \ldots & z_{mn} \end{array} \right) \left( \begin{array}{cccc} z_{11} & z_{12} & \ldots & z_{1n} \\ z_{21} & z_{22} & \ldots & z_{2n} \\ ... & ... & ... & ...\\ z_{m1} & z_{m2} & \ldots & z_{mn} \end{array} \right)\nonumber\\ &=&{1\over m}\left( \begin{array}{cccc} \sum_{i=1}^{m} z_{i1}^2 & \sum_{i=1}^{m} z_{i1}z_{i2} & \ldots & \sum_{i=1}^{m} z_{i1}z_{im} \\ \sum_{i=1}^{m} z_{i2}z_{i1} & \sum_{i=1}^{m} z_{i2}^2 & \ldots & \sum_{i=1}^{m} z_{i2}z_{im} \\ ... & ... & ... & ...\\ \sum_{i=1}^{m} z_{in}z_{i1} & \sum_{i=1}^{m} z_{in}z_{i2} & \ldots & \sum_{i=1}^{m} z_{in}^2 \end{array} \right) \end{eqnarray} 各要素は二つの変量の間の相関係数 \begin{equation} \rho_{jk} ={1/m\sum_{i=1}^m(x_{ij}-\bar{x}_j)(x_{ik}-\bar{x}_k)\over \sqrt{\sum_{i=1}^m(x_{ij}-\bar{x}_j)^2/m\sum_{i=1}^m(x_{ik}-\bar{x}_k)^2}/m} \end{equation}

を与える.この行列を相関行列と呼ぶ.

二つの変量の相関がよいほど相関係数の値の絶対値は1に近 くなる.行列\(R\)の要素はそれぞれ二つの変量の相関係数のため,\(R\)は相関行列と 呼ばれる.

それではでて来た相関係数はどう味わえばよいのか? それには次の表を用いる. Nはデータの数, rは相関係数である. それぞれの数値は, 無相関の\(N\)個のデータがあった時に\(r\)以上の相関係数が出現する確率(パーセント)である. この数値が小さい程, 二つのデータには相関があると思ってよい. 5以下なら有意, 1以下なら高度に有意であるという.


r
N 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
3 100 94 87 81 74 67 59 51 41 29 0
6 100 85 70 56 43 31 21 12 6 1 0
10 100 78 58 40 25 14 7 2 0.5 0
20 100 67 40 20 8 2 0.5 0.1 0
50 100 49 16 3 0.4 0

無相関な二つの量が \(N\) 組あったとき, 相関係数が\(r\)以上になる確率. 空白は0.05%以下.

練習問題2

以下はテストのデータである (多変量解析入門,永田・棟近共著,サイエンス社 より).相関行列を生成し,どの科目とどの科目との間に強い相関があるのか確認せよ.

 
生徒番号 i 国語 x1 英語 x2 数学 x3 理科 x4
1 86 79 6768
2 71 75 7884
342 43 3944
4 62 58 9895
5 96 97 6163
6 39 33 4550
7 50 53 64 72
8 78 66 52 47
9 51 44 7672
10 89 92 9391

プログラムのおおまかな構造

  
  宣言文

  integer, parameter :: n=4, m=10
  double precision :: z(n,m) x(n,m), xsigma(n), xav(n)

  成績データの読み込み read(1,*) ( x(j,i), j = 1, n )

  各科目nについて,平均値xav(n)と標準偏差xsigma(n)を求める  式(2)

  平均値と標準偏差を用いて,x(n,m)からz(n,m)を作る  式(1), (4)

  R=ZTZ/mを求め,行列の各要素を出力する  式(5)

  
  

[2] 主成分分析

\(i\)番目のデータ種に着目したとする.\(z_{ij}\)のヒストグラムを作ったとすると,データは標準化されているので平均がゼロ,分散1の正規分布となる.これはiによらない.つまり,データを標準化すると全てのデータ種について同じ分布となっている.

複数のデータ種の線形結合を作り,この分布がどうなるか考える.全てのデータ種の平均値はゼロなので,線型結合の平均値もゼロ.しかし線型結合の分散は一般に1とは異なってくる.分散が大きい場合と小さい場合とがありえる.分散が小さいということは,その線形結合に対する依存性が小さいということ.逆に分散が大きくなると,その組み合わせによってデータの依存性がよく説明できるということになる.

データの線型結合を

\begin{equation} u_{i}=a_1z_{i1}+a_2z_{i2}+...+a_nz_{in}=\sum_{j=1}^{n}a_jz_{ij} \end{equation}

で与える.この線型結合の二乗和(平均値がゼロなので分散と同一)を作る.

\begin{eqnarray} S&=&{1\over m}\sum_{i=1}^m(u_{i})^2\nonumber\\ &=&{1\over m}\sum_{i=1}^m(\sum_{j=1}^{n}a_jz_{ij})^2\nonumber\\ &=&{1\over m}\sum_{i=1}^m(a_1^2z^2_{i1}+a_2^2z^2_{i2}+... +2a_1a_2z_{i1}z_{i2}+a_1a_3z_{i1}z_{i3}+..)\nonumber\\ &=& a_1^2+a_2^2+...+2\rho_{12}a_1a_2+... \end{eqnarray}

ここで,各データ種について分散は1,平均はゼロなので,\(z_{ij}\)のjについての二乗和は全て1になることに注意.

また,各iについて平均値はゼロなので,ここで\(\rho_{ik}\)は相関係数となっていることに注意.

\(S\)が「最大」になる\(a_i\)の組み合わせを探す.ただし,\(a_i\)ベクトルの長さは1

\begin{equation} a_1^2+a_2^2+...a_n^2=1 \end{equation}

という制約をつけておく必要がある(そうしておかないと\(a\)を大きくすれば\(S\)が大きくなる).このような条件では,ラグランジュの未定乗数法を用いることで\(a_i\)を見つけることができる.ラグランジュの未定乗数\(\lambda\)を用いて

\begin{equation} f(a_1,a_2,...a_n,\lambda) = a_1^2+a_2^2+...a_n^2+2\rho_{12}a_1a_2+2\rho_{13}a_1a_3+.... - \lambda(a_1^2+a_2^2+...a_n^2-1) \end{equation}

という総和を作り,各\(a\)で偏微分すると

\begin{equation} {\partial f\over \partial a_k}=0 \quad 1\le k \le n \end{equation} から以下の式が\(n\)本導出される. \begin{eqnarray} 2a_1+2\rho_{12}a_2+2\rho_{13}a_3+.... - 2\lambda a_1 &=& 0\nonumber\\ 2\rho_{21}a_1+2a_2+2\rho_{23}a_3+.... - 2\lambda a_2 &=& 0\nonumber\\ .....&& \nonumber\\ 2\rho_{n1}a_1+2\rho_{n2}a_2 + .....2a_n - 2\lambda a_n &=& 0 \label{eqs} \end{eqnarray}

行列の形に書き換えると

\begin{equation} \left( \begin{array}{ccccc} 1 & \rho_{12} & \rho_{13} & \ldots &\\ \rho_{21} & 1 & \rho_{23} & \ldots &\\ ... & ... & ... & ... & ...\\ \rho_{i1} \ldots & \rho_{ik} & ... & ... &\\ ... & ... & ... & ... & ... \end{array} \right) \left( \begin{array}{c} a_{1} \\ a_2 \\ ...\\ a_{k} \\ ... \end{array} \right)= \lambda \left( \begin{array}{c} a_1 \\ a_2 \\ ...\\ a_k\\ ... \end{array} \right) \end{equation}

とまとめることができる.この行列を見ると,相関係数からなる「相関行列」の固有ベクトルが求めるaの組み合わせ,未定乗数λがその固有ベクトルの寄与ということになる.さらに,式\eqref{eqs}の第一行目の両辺に\(a_1\),2行目の両辺に\(a_2\),...第\(n\)行目に\(a_n\)を掛けて2で割ると

\begin{eqnarray} a_1^2+\rho_{12}a_1a_2+\rho_{13}a_1a_3+.... &=& \lambda a_1^2 \nonumber\\ \rho_{21}a_2a_1+a_2^2+\rho_{23}a_2a_3+.... &=&\lambda a_2^2 \nonumber\\ .....&& \nonumber\\ \rho_{n1}a_na_1+\rho_{n2}a_na_2 + .....a_n^2 &=& \lambda a_n^2 \end{eqnarray}

これらの式をすべて足し合わせると,式(8)と(9)から

\begin{equation} S = \lambda \end{equation}

となることがわかる.よって,それぞれの主成分に対応して生じる分散は固有値となることがわかる.したがって固有値が大きければ大きいほどデータのばらつきの説明に寄与していることになる.一方で,全ての固有値の和は今の場合 \(n\) (固有値の総和と行列の対角和は等しい)であり,\(n\)が全ての固有ベクトルに対する分散の和となる.したがって,\(\lambda/n\) が,その固有値の寄与率となる.

練習問題3

大きい順に2つの固有値と対応する固有ベクトルを求め,それぞれの主成分の寄与率を求めよ.また,それぞれの主成分に対応する固有ベクトルの値を観察することで,この集団の学力がどのような科目の組み合わせで特徴づけられているか議論せよ.なお,固有ベクトルは長さ1に規格化されていることに注意.

プログラムのおおまかな構造

  
  宣言文  z(n,m) x(n,m), xsigma(n), xav(n)

  成績データの読み込み read(1,*) ( x(n,m), n = 1, 4 )

  各科目nについて,平均値xav(n)と標準偏差xsigma(n)を求める  式(2)

  平均値と標準偏差を用いて,x(n,m)からz(n,m)を作る  式(1), (4)

  ZTZ/mを求め,相関行列の各要素を出力する  式(5)

  サブルーチンjacobiを用い,相関行列の固有値と対応する固有ベクトルを求める

  固有値の大きさ/4が寄与率,固有ベクトルの成分が対応する主成分の要素を表す
  
  

今日の宿題 (2点:1/17日まで)

練習問題3のプログラムと結果(4つのうち大きい固有値二つと対応する固有ベクトルの成分)を送付すること.




日程表へ戻る <<