単回帰分析の傾きをPython(numpy)で求める

はじめに

単回帰分析をする際、重要になるのが、「傾き」と「切片」。
「切片」はセンタリングを行うことにより省略可能だが、「傾き」を計算するのは複雑な式を用いる。 難しそうなインパクトが強すぎて中身がまったく頭に入ってこない。 これをnumpyで実装する。

実装

準備

まずは定数を定義

# -*- coding: utf-8 -*-

import numpy as np
# ベクトルの定義
# numpyでは([])で括る

# 与えられたもの部屋の広さとか
x = np.array([1,3,5,10,20])
# その結果。値段など。
y = np.array([2.5,6,11,21,38])

# 全ての配列を表示
print ("全ての配列を表示")
print (x)
print (y)

描写するとこのような感じになる。 データの中心化を行う。値から、平均分を引く

## データの中心化
# 平均の算出
print x.mean()
print y.mean()

print ("中心化")
# cはcenteringの略とする
# pandsでも中心化する方法は存在する
xc = x -x.mean()
print (xc)

yc = y - y.mean()
print(yc)

描写するとこのような感じになる。
グラフの形は変わらず、全体的に中心になった。  

傾きを計算する

改めて計算式を確認。
分母、分子をそれぞれ別々に計算する。 numpyで計算する際は、このようになる

# 分母はxc * xcで、最後に足す
xcxc = xc * xc
print xcxc
print ("分母:")
print xcxc.sum()

    次に分子

xcyc = xc * yc
print ("分子:")
print xcyc.sum()

最後に分子と分母を組み合わせる

answer = xcyc.sum()/xcxc.sum()
print ("傾き:")
print (answer)

 

実施結果

$ python regression.py
全ての配列を表示
[1 2 3]
[2.  3.9 6.1]
2.0
4.0
中心化
[-1.  0.  1.]
[-2.  -0.1  2.1]
パラメータaの計算
[1. 0. 1.]
分母:
2.0
分子:
4.1
傾き:
2.05

傾きを元に実践を引いてみるとこのようになる 悪くなさそう。 実は実際はscikit-learnを使うともっと早いようだ。