線形回帰とそのPython実現(最大尤度法)


線形回帰とそのPython実現(最大尤度法)
ラベル:Python機械学習
本節の内容はブロガーが牛客網機械学習特訓キャンプのノート参考資料にまとめた.
1.線形回帰とは
ウィキペディア:線形回帰統計学では、線形回帰は、線形回帰方程式と呼ばれる最小二乗関数を用いて、1つ以上の自己変数と因変数の関係をモデリングする回帰分析である.
ブロガー自身の理解によると、線形性は変数の変化量と自己変数の変化量に比例し(例えば1個の卵1元、2個の卵2元、3個の卵3元、そのうち価格変化量:卵変化量は常に1:1)、数学的に1次導数が定数として表現されている.例えば、この例の線形回帰方程式は、y=x y=x y=xであり、一次導関数y’=1 yprime=1 y’=1である.
線形回帰とは,因変数と自己変数の関係を線形の関係と見なし,それらの間の線形関係を求めることであり,エントロピーを減らす効果であると感じられるので回帰である.例えば,ヒト足底板の長さを自己変数,身長を因変数とすると,この2つのデータの間に単純な線形回帰が可能となり,足底板の長さと身長の関係式が得られる.警察官はこのような方法で犯行現場の足跡から容疑者の身長を推定することができる.
2.回帰係数式の導出
因変数をy y y,自変数をx 1,x 2,.,x n x_1, x_2, ... , x_n x1​,x2​,...,xnは、(1)y=hw(x)=w 0+w 1 x 1+.+w n x n = ∑ i = 0 n w i x i = w T x y=h_w(x)=w_0+w_1x_1+...+w_nx_n=\sum _{i=0}^nw_ix_i=w^Tx\tag{1} y=hw​(x)=w0​+w1​x1​+...+wn​xn​=i=0∑n​wi​xi​=wTx(1)
w 0 w_0 w 0はx 0=1 x_0=1 x 0=1の係数は,グローバルオフセット量を表し,平面直線における具体的な意味は断面積であり,引数の1次元としても用いられる.
いろいろな原因で、データは一定の誤差でフィットする曲線の両側に分布しているので、そうしないと少数のデータだけで完璧な直線をフィットすることができます.幸いなことに,この誤差は正規分布に合致するので,ここから線形回帰方程式を導出した.
合計m個のサンプルがあると仮定すると,i番目のデータ(注意は二乗ではない)に対して,(2)y(i)=w Tx(i)+ξ ( i ) y^{(i)}=w^Tx^{(i)}+\xi ^{(i)}\tag{2} y(i)=wTx(i)+ξ(i)(2)
内ξ ( i )\xi ^{(i)} ξ(i)確率密度が正規分布である確率密度(3)p(ξ ( i ) ) = 1 2 π σ e x p [ − ( ξ ( i ) ) 2 2 σ 2 ] p(\xi ^{(i)})=\frac {1}{\sqrt {2\pi}\sigma}exp[-\frac {(\xi ^{(i)})^2}{2\sigma ^2}]\tag{3} p(ξ(i))=2π ​σ1​exp[−2σ2(ξ(i))2​](3)
結合(2)(3)式には(4)p(y(i)x(i)がある.ξ ( i ) ) = 1 2 π σ e x p [ − ( y ( i ) − w T x ( i ) ) 2 2 σ 2 ] p(y^{(i)}|x^{(i)};\xi ^{(i)})=\frac {1}{\sqrt {2\pi}\sigma}exp[-\frac {(y^{(i)}-w^Tx^{(i)})^2}{2\sigma ^2}]\tag{4} p(y(i)∣x(i);ξ(i))=2π ​σ1​exp[−2σ2(y(i)−wTx(i))2​](4)
(4)式があれば,尤度関数(5)L(w)=∏i=1 m p(y(i)∣x(i)を得ることができる.ξ ( i ) ) = ∏ i = 1 m 1 2 π σ e x p [ − ( y ( i ) − w T x ( i ) ) 2 2 σ 2 ] L(w)=\prod _{i=1}^m p(y^{(i)}|x^{(i)};\xi ^{(i)}) =\prod _{i=1}^m\frac {1}{\sqrt {2\pi}\sigma}exp[-\frac {(y^{(i)}-w^Tx^{(i)})^2}{2\sigma ^2}]\tag{5} L(w)=i=1∏m​p(y(i)∣x(i);ξ(i))=i=1∏m​2π ​σ1​exp[−2σ2(y(i)−wTx(i))2​](5)
尤度関数はサンプルから分布パラメータw w wを推定するが,なぜ乗算するのか.独立したイベントは互いに影響を及ぼさず,それらが同時に発生する確率が乗算であると理解できるので,尤度関数を最大にするときのw^hat w^を理論におけるw w w wに最も近づける(最大尤度推定の例を参照)ことを求める.尤度関数には指数があり、対数をとると計算しやすいため、対数尤度関数(6)l(w)=l o g L(w)=l o g∏i=1 m 1 2πがあるσ e x p [ − ( y ( i ) − w T x ( i ) ) 2 2 σ 2 ] = m l o g 1 2 π σ − 1 σ 2 ⋅ 1 2 ∑ i = 1 m ( y ( i ) − w T x ( i ) ) 2\begin {aligned} l(w)=&logL(w)\\=&log\prod _{i=1}^m\frac {1}{\sqrt {2\pi}\sigma}exp[-\frac {(y^{(i)}-w^Tx^{(i)})^2}{2\sigma ^2}]\\=&mlog\frac {1}{\sqrt{2\pi}\sigma}-\frac {1}{\sigma ^2}\cdot\frac {1}{2}\sum _{i=1}^m( y^{(i)}-w^Tx^{(i)})^2\end {aligned}\tag{6} l(w)===​logL(w)logi=1∏m​2π ​σ1​exp[−2σ2(y(i)−wTx(i))2​]mlog2π ​σ1​−σ21⋅21 i=1Σm(y(i)−wTx(i))2(6)ターゲット関数(7)J(w)=1 2Σi=1 m(y(i)−wTx(i))2 J(w)=frac{1}{2}sum_{i=1}^m(y^{(i)}−w^Tx^{(i)})^2tag{7}J(w)=21 i=1Σm(y(i)−wTx(i))2(7)尤度関数に最大値がある場合,目標関数に最小値があり,(7)式を導出すればw w wの推定値が得られるが,等式を整理し,m個のn n次元サンプルをマトリクスX Xで表し,1行に1個のサンプルを表すと,X XはMである× N M\times N M×N次行列は、行列X X X Xを式(8)J(w)=1 2Σi=1 m(y(i)−w T x(i))2=1 2(X w−y)T(X w−y)J(w)=frac{1}{2}sum_に統合する{i=1}^m( y^{(i)}-w^Tx^{(i)})^2=\frac {1}{2}(Xw-y)^T(Xw-y)\tag{8} J(w)=21​i=1∑m​(y(i)−wTx(i))2=21​(Xw−y)T(Xw−y)(8)
(8)式に対してベクトルw w w wを求める導関数(9)J’(w)=X T X w−X T y Jprime(w)=X^TXw−X^Tytag{9}J’(w)=XTXw−XTy(9)に対して目標関数の最小値を求めると、最小値の点は定在点であるべきであり、(10)0=X T X w−X T y⇒w=(X T)−1 X T ybegin{aligned}0&=X^TXw−X^Ty\Rightarrow w&=(X X^T)^{−1}X^Tyend{aligned}tag{10}0⇒w=XTXw−XTy=(XT)−1 XTy(10)
(10)は,wwを求める式を導き出すものであり,ここではX X T X^T X X Tが可逆的であることが要求されるため,採取したサンプルの個数は必ずサンプルの次元数よりも多く,また無効なデータがないことが望ましいため,サンプルの数はサンプルの次元数よりもはるかに大きく,計算された回帰係数はより正確である.
3.リニア回帰Python実現
コードは主に2つの部分に分けられ,第1の部分はサンプルの採取をシミュレートし,第2の部分は線形回帰である.サンプルの生成式は、y=0.5∗x+3+r a n d o m∗4∗s i n x y=0.5*x+3+random*4*sin x y=0.5∗x+3+random 4∗sinxであり、r a n d o m randomは[0,1]の間のランダムな小数である.この試料の計算による線形回帰係数w wは,[3,0.5]T[3,0.5]^T[3,0.5]Tに近いはずである.
import numpy as np
import matplotlib.pyplot as plt
import math
import random
#    
x = np.arange(0, 100, 0.2)
xArr = []
yArr = []
for i in x:
	lineX = [1]
	lineX.append(i)
	xArr.append(lineX)
	yArr.append( 0.5 * i + 3 + random.uniform(0, 1) * 4 *math.sin(i) )
#    
xMat = np.mat(xArr)
yMat = np.mat(yArr).T
xTx = xMat.T * xMat
if np.linalg.det(xTx) == 0.0:
	print "Can't inverse"
ws = xTx.I * xMat.T * yMat
print ws

y = xMat * ws
#  
plt.title("linear regression")
plt.xlabel("independent variable")
plt.ylabel("dependent variable")
plt.plot(x, yArr, 'go')
plt.plot(x, y, 'r', linewidth = 2)
plt.show()

サンプルデータと回帰直線:
4.線形回帰の応用
線形回帰には主に2つの用途があり,1つは予測であり,1つは分類である.
4.1予測
上記の線形回帰を例にとると,自己変数が[001]のデータのみを収集したが,線形回帰方程式により,[10200]内の自己変数に対応する因子変数を予測できた.一般的な応用はGDP、石油価格、株価トレンド予測(ウィキペディア参照).
4.2分類
上図には円形サンプル点と三角形サンプル点があり、中間赤色の線は回帰方程式に対応する曲線であり、線形回帰方程式はy=f(x)y=f(x)y=f(x)y=f(x)である.1つのサンプル(x 0,y 0)(x_0,y_0)(x 0,y_0)(y 0,y 0)について、y=f(x 0)y=f(x_0)y=f(x 0)y=f(x 0)y=f(x 0)を計算することができ、y5.まとめ
  • 線形回帰は広く応用され,計算は簡単であり,その導出過程と最終解式
  • を理解すべきである.
  • 本論文では,最大尤度法による回帰係数と勾配降下法による回帰係数
  • を紹介した.
  • 線形回帰の最後の結果は直線であり、例えば、本例ではy=0.5∗x+3+4∗s i n x y=0.5*x+3+4*sin x y=0.5∗x+3+4∗sinxに近い結果を得るためには、局所重み付け線形回帰
  • を用いることができる.
  • X X T X^T X X Tが不可逆である場合、嶺回帰法
  • を用いることができる.
  • 最後に3つの良心的な資料を推薦します
  • Harrington P.機械学習実戦[J].人民郵電出版社、北京、2013.
  • 李航統計学習方法[J].2012.
  • ウィキペディア(オフライン版あり)

  • 6.付録
    6.1ウィキペディアにおける最大尤度推定の一例
    クリックして原図を表示