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)
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()
# 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()