-Python- 様々な回帰モデル(1 - まずは最小二乗法で)

これまでの投稿では,のクラス(線形回帰モデル)を使って学習を行ってきました.には線形回帰モデル以外にも様々な回帰モデルがあります.それらのモデルは,特に非線形回帰問題に対して使われます.
非線形回帰問題は,あるデータの集合が非線形な式に回帰することを想定する問題です.線形回帰は想定するパラメータに対して線形かそうでないかということなので,注意が必要です.これまでの投稿でもxについて線形でない2次式,3次式をパラメータの渡し方の工夫で線形回帰で解いてきています.以下では,そのような前処理をせずに非線形回帰問題として解く例を示します.

 
# Import module
import math
import numpy as np
import matplotlib.pyplot as plt
from sklearn import linear_model
 
# Generate random number
x = np.random.rand(1000, 1)     # Make 1000 random numbers from 0 to 1
x = x * 20 - 10                 # Change the value range from -10 to 10
 
# Generate random number
y = np.array([math.sin(v) for v in x]) # Sine wave curve
# Add a random number with SND(average 0, standard deviation 1)
y += np.random.randn(1000)
 
# Learning
model = linear_model.LinearRegression()
model.fit(x, y)
 
# Display results
print(model.score(x, y))
 
# Display Graph
plt.scatter(x, y, marker='+')
plt.scatter(x, model.predict(x), marker='o')
 
plt.show()
 

プログラムでは,正弦波の関係 y = sin(x) にあるデータセットを擬似的に生成しています.-10 ≦ x < 10 の場合のyをランダムで1000個作り,かつ ±0.1 の間でランダムな値のバラつきを入れています.そのデータを最小二乗法で解いています.

実行結果は以下のようになります.

0.008831624959203421
上記の例では直線で近似させているので,当然,結果は良くありません.
次回以降に,非線形回帰問題として解いてみます.scikit-learnには非線形の回帰問題を解くための様々なモデルが用意されています(クラス名の末尾に'R'や'Regressor'と付いています).