無意義なつぶやき

渋谷ではたらくエンジニアブログ。

線形回帰分析と相関係数

1個まえscikit-learnで線形回帰分析 - 無意義なつぶやき
の記事で書いた線形回帰分析について少し詳し目に書きます。


従属変数yと独立変数xが与えられたとき
{ \displaystyle

Y=θX+ε

}

これが線形回帰分析のモデルです。

{ \displaystyle

 Δ=\sum|y_i-θx_i|

}

Δ^2を最小にするようにθを設定します。

簡単のため

{ \displaystyle

y=ax+b

}

で考えることにします。
{ \displaystyle

 Δ^2=\sum|y_i-ax_i-b|^2

=\sum(yi^2-2ax_iy_i-2by_i+a^2x_i^2+2abx_i+b^2)

}
となるので
{ \displaystyle
{A} = \left(
    \begin{array}{c}
      a \\
      b \\
    \end{array}
  \right)
}
でこれを微分
{ \displaystyle
{∂Δ^2/∂θ} = \left(
    \begin{array}{c}
      ∂Δ^2/∂a\\
      ∂Δ^2/∂b \\
    \end{array}
  \right)
=-2(X^tY-X^tXθ)=0
}

{ \displaystyle
{θ} = (X^tX)^{-1}X^tY
}

ここで{ \displaystyle
(X^tX)^{-1}
}は相関行列になります。

ここで各要素の相関が非常に高い場合はどうなるのでしょうか?

irisを例に考えてみます。
slswはsepal lengthとsepal widthを切り出したものです。
これとsepal lengthの相関を考えてみると当然ですが、
以下のようになります。

In [60]: dcoef=np.corrcoef(slsw.T, sl.T)

In [61]: dcoef
Out[61]: 
array([[ 1.        , -0.10936925,  1.        ],
       [-0.10936925,  1.        , -0.10936925],
       [ 1.        , -0.10936925,  1.        ]])

In [62]: np.linalg.eig(dcoef)
Out[62]: 
(array([  2.02337679e+00,   3.33066907e-16,   9.76623209e-01]),
 array([[ -6.99166411e-01,   7.07106781e-01,   1.05670856e-01],
        [  1.49441157e-01,  -1.34995136e-16,   9.88770621e-01],
        [ -6.99166411e-01,  -7.07106781e-01,   1.05670856e-01]]))

In [63]: np.linalg.det(dcoef)
Out[63]: 0.0

determinantが0となるため、{ \displaystyle
(X^tX)^{-1}
}が存在しないことになります。
これは極端な例ですが、相関行列の変数が相関が高いペアが含まれていると
モデル精度が不安定になるようです。

これを解消するために考案されたのがリッジ回帰です。

続きはまた今度