偏ったデータでの関数フィッティングを試す

偏ったデータの作成(トレーニング用)

In [1]:
import numpy as np
import random
import sklearn.linear_model as lm
import matplotlib.pyplot as plt

def clustered_x():
    # データ数
    n_tr1 = 10
    n_tr2 = 5
    x_max = 5.0 # xの範囲 [0, x_max]
    x = np.random.randn(n_tr1)*0.3
    x1 = np.random.randn(n_tr2)*0.8 + 1.8
    return np.hstack([x,x1])
    
x = clustered_x()
f_cos = lambda x: np.cos(2.0*x) # サンプルデータを作るためのベース関数
y = f_cos(x) + np.random.randn(len(x))*0.3
# データの描画
plt.plot(x, y, "ob", ms=8)
Out[1]:
[<matplotlib.lines.Line2D at 0x7fbe6b0af280>]

SVRのテスト

In [2]:
from sklearn import svm

# svrの利用
svr = svm.SVR(kernel='rbf')
X = x[:, np.newaxis]
svr.fit(X, y)

# 回帰曲線用データ
x_plot = np.linspace(-0.5, np.pi, 1000)
y_plot = svr.predict(x_plot[:, np.newaxis])
    
#グラフにプロットする。
plt.scatter(x, y)
plt.plot(x_plot, y_plot, label="SVR prediction")
x_curve = np.linspace(-0.3, np.pi, 100)
plt.plot(x_curve, f_cos(x_curve), label="cos(x)")
# サポートベクトルのプロット
plt.scatter(X[svr.support_], y[svr.support_], c="red", label="support vectors")

plt.legend()
plt.show()
In [5]:
# RVRの利用
# データは前のを利用!

from sklearn_rvm import EMRVR
x_max = 4.  # 予測の範囲の上限

# 学習を行う
rvr = EMRVR(kernel='rbf', gamma="scale")
rvr.fit(X, y)
  
# テスト
x_test = np.linspace(0, x_max, 1000)
y_test, y_std = rvr.predict(x_test[:, np.newaxis], return_std=True) # standard dev. can be also obtained if "return_std" is set to be True
    
# plot prediction and the the width of std. dev.
plt.scatter(x, y)
plt.plot(x_test, y_test)
plt.fill_between(x_test, y_test - y_std, y_test + y_std, color="darkorange", alpha=0.2)


# show relevance vectors by red circles
relevance_vectors_idx = rvr.relevance_
plt.scatter(X[relevance_vectors_idx], y[relevance_vectors_idx], s=80, facecolors="none", edgecolors="r",
            label="relevance vectors")

# cos(x)
x_curve = np.linspace(-0.3, np.pi, 100)
plt.plot(x_curve, f_cos(x_curve), label="cos(x)")

plt.show()
In [ ]: