機械学習基礎理論独習

誤りがあればご指摘いただけると幸いです。数式が整うまで少し時間かかります。リンクフリーです。

勉強ログです。リンクフリーです
目次へ戻る

【Python実装 - sklearn使用】曲線フィッティング

ソースの説明

ソースは【Python自前実装】曲線フィッティングとほぼ同じです。
違いは、LinearRegression が sklearn.linear_model.LinearRegression になっただけです。

ソース

import matplotlib.pyplot as plt
import numpy as np
from sklearn import linear_model

# 計画行列クラス(※成分が1の列は作成しない)
class DesignMatrix:

    def __init__(self, degree):
        self.degree = degree

    def transform(self, x):
        return np.hstack([x**(m+1) for m in range(self.degree)])

# 訓練データ作成のための真の関数
def true_func(x):
    return np.sin(2 * np.pi * x)
    
# ランダムシードを設定する(乱数を固定する)
np.random.seed(1)

# 訓練データ数
N = 10

# 特徴空間の次元(モデルのパラメータ数)
M = 4

# 訓練データxの列ベクトル(入力空間)
x = np.linspace(0, 1, N).reshape(-1, 1)

# 特徴空間作成のためのインスタンスを作成(※成分が1のみの列は作成しないため、M-1を渡す)
dm = DesignMatrix(M-1)

# 入力空間から特徴空間へ写す
# 行列Phi(特徴空間)を作成(※成分が1のみの列は作成していない)
Phi = dm.transform(x)

# 訓練データt=sin(x)の列ベクトルに正規分布に従うノイズを加える
t = true_func(x) + np.random.normal(0, 0.2, N).reshape(-1, 1)

# 線形回帰のモデルを作成
model = linear_model.LinearRegression()

# 学習する
model.fit(Phi, t)

# 係数、切片、決定係数を表示
print('係数', model.coef_)
print('切片', model.intercept_)

r2 = model.score(Phi, t)
print('決定係数', r2)

# 予測直線表示のためのxを作成 予測するために行列にする(reshape)
x2 = np.linspace(0, 1, 100).reshape(-1,1)

# 行列Phi2(特徴空間)を作成(※成分が1のみの列は作成していない)
Phi2 = dm.transform(x2)

# 予測する
y2 = model.predict(Phi2)

# グラフ表示
plt.scatter(x, t, marker ='+')
plt.plot(x2, y2, color='orange')
plt.show()

f:id:olj611:20210421055050p:plain:w400
f:id:olj611:20210421055037p:plain:w500

偉人の名言

f:id:olj611:20210421055400p:plain:w300
人生とは結局、ハードルの連続だ。
ひとたび飛び越えてしまえば、考えていたよりもずっと簡単に見える。
ジョセフ・グルー

参考文献

Pythonによる機械学習入門

動画

なし

目次へ戻る