回帰分析を実装する【機械学習アウトプット第1回】
初心に帰って、機械学習の全体像を勉強していきます。
1日目は回帰分析から。
今回は、2次関数
のパラメーター、を予測してみます。
まずは、データを用意してプロットしてみます。
import numpy as np import matplotlib.pyplot as plt %matplotlib inline x = np.arange(-10, 10, 0.1) y = 3 * (x ** 2) - 5 * x + 4 y += np.random.rand(200) * 10 - 5 fig = plt.figure(figsize=(8, 8)) ax = fig.add_subplot(1, 1, 1) ax.set_ylabel('y') ax.set_xlabel('x') ax.scatter(x, y) plt.show()
()とし、の誤差を加えました。
を求める実装方法は何通りかありますが、それぞれ試してみます。
1. 数式から愚直に実装
訓練データ組が以下の形式で与えられたとします。
この訓練データを次多項式で近似することを考えます。
つまり、パラメータを求めることを考えます。
の各要素をそれぞれ乗したベクトルを、
とし、
とおきます。
このとき、損失関数である二乗和誤差は、
と表せます。
二乗和誤差を偏微分してイコールとなる方程式を解くと、下記が導けます。
これでが求まります。
numpyでごり押し実装するとこんな感じです。
x = x.reshape(200,1) y = y.reshape(200,1) X = np.concatenate([x**0, x**1, x**2], 1) W = np.dot(np.dot(np.linalg.inv(np.dot(X.transpose(), X)), X.transpose()), y)
print(W) >> [[ 4.37261064] [-4.98425549] [ 2.99470365]]
正解のパラメータに近い値が出力されました。
2. numpy.polyfit()を使用
回帰分析はnumpyに元から入っています。
W = np.polyfit(x, y, 2)
print(W) >> [[ 4.37261064] [-4.98425549] [ 2.99470365]]
手計算と全く変わりません(笑)。