機械学習についての概略の基本的な分析手法を学んでいく.
まず,基本的な分析手法は4つに分類される.
1. 線形回帰分析
2. ロジスティック回帰分析
3. 因子分析
4. クラスター分析\
今回は線形回帰分析について学んだ. 線形回帰分析とは複数の変数における相関関係を直線モデルによって説明しようとする分析手法のことである.
下記の図が使用するデータである.
[htb]
顧客番号 年齢(x) 年間支出額(y)
1 32 40,000
2 23 38,000
3 39 46,000
4 47 48,000
[population]
図の作成及び計算はPythonを用いた.
顧客の年齢と年間支出額がなんらかの関係があるのかを考えていく. 関係を分かりやすくするため,表1のデータをグラフにすると図1のようになる.
この際用いたソースコードが下記になる\
import numpy as np
import matplotlib.pyplot as plt
x = np.array([32, 23, 39, 47])
y = np.array([40000, 38000, 46000, 48000])
plt.scatter(x, y, color = 'blue')
plt.show()
図1でプロットされたデータに一本の近似した直線を引くことによって,年齢と年間支出額を予測する. 直線のグラフは,$y = \beta_1 x+ \beta_0$で表される. このような変数xとyの間の関係のとき,xとyは線形関係にあるという.
年齢(x)が原因で,年間支出額(y)が結果と考えると,y方向に誤差が出ていると考えられる. そのため垂直方向の距離を誤差とする. この際,最小二乗法を使い,誤差を最小に近づける.
まず,グラフ
年齢(x)に23に代入すると, $ y = 23\beta_1 +\beta_0 $ になる.
そこに実際の購入額である38,000円をyに代入すると,
これにより,それぞれの残差のみに注目できるようになった.
同様に3つのデータについても,差の二乗を計算し,それらを合計すると,
以下が式になる.
この式により,
よって,$y = \beta_1 x+ \beta_0$が
となり,近似した1本の直線が求められた.
以下が図1に近似した1本の直線を加えたものである.\
図2を作る際,用いたソースコードが下記になる.\
import numpy as np
import matplotlib.pyplot as plt
x = np.array( [32, 23, 39, 47] )
y = np.array( [40000, 38000, 46000, 48000] )
plt.scatter(x, y, color = 'blue')
xdata = np.vstack( [x, np.ones(len(x))] ).T
b1, b0 = np.linalg.lstsq(xdata, y)[0]
plt.scatter(x, y, color = 'blue')
plt.plot(x, (b1 * x + b0), color = 'red')
plt.show()
ソースコード2では.numpy.liang.lstsg関数を使い,行列xdata,yを代入し,$(x\beta_1 + \beta_0 - y)^2$を最小にする$\beta_1$(b1),$\beta_0$(b0)を求める.
xdataはnumpy.liang.lstsgでxの値が扱えるように,全要素が1の配列を加えたものである.
np.linalg.lstsq関数にxdata, yを代入した時,出力される値が以下になる.\
np.linalg.lstsq(xdata, y) = ( x の配列, 残差, 階数, 特異値の配列 )
= ( array ( [ 450.83932854, 27107.91366906 ] ),
array ( [ 4431654.67625901 ] ),
2,
array ( [ 72.71013252, 0.48644497] ) )
求めているのは,返り値の1つ目の要素なので[0]で一つ目を指定してb1,b0に代入する.
最後に,$y = \beta_1 x + \beta_0$に相当する$y = b1*x + b0$を
2
NumPy Reference
https://docs.scipy.org/doc/numpy/reference/index.html
解析情報グループ 最小二乗法
http://kaiseki-web.lhd.nifs.ac.jp/documents/Python/leastmean.htm

