Help us understand the problem. What is going on with this article?

SVMを使って回帰してみる

More than 1 year has passed since last update.

犬です

わん.png
犬が機械学習します。(まだまだ機械学習にいけません・・・)
プログラマーではありません。犬です。
SVM(サポートベクターマシン)を使ってみたいと思います。

ハイパボリックタンジェントを使って回帰する

おまいらやるのはsinやcosとかやとおもたやろ?双曲線関数でいくぞ

(1) y=tanh(x)のグラフを -6 < x < 6 の間で描画する
(2) xを0.1刻みにyの値にガウス分布(正規分布)をつかってランダムな値を誤差として足す
(3) (2)のデータを散布図として描画
(4) (2)の情報からSVMを利用して回帰を実施する
(5) 予測したy=f(x)を描画する

やってみた

1.まずは必要なライブラリを読み込む

import numpy as np
import random
import matplotlib.pyplot as plt
from sklearn import svm
%matplotlib inline

2.y=tanh(x)を描画

X = np.arange(-6, 6, 0.1)
y = np.tanh(X)

plt.figure(figsize=(16, 4))
plt.title('Hyperbolic Tangent Graph')
plt.plot(X,y)

【犬の解説】
X = np.arange(-6, 6, 0.1) → xを -6 < x < 6 の範囲で0.1刻みで定義
y = np.tanh(x) → ハイパボリックタンジェントを定義
plt.figure(figsize=(16, 4)) → 画面サイズを定義
plt.title('Hyperbolic Tangent Graph') → タイトルの表示
plt.plot(X,y) → 描いて

実行結果
無題.png

3.無理やり誤差を与えてそれっぽい散布図を作成する

e = [random.gauss(0, 0.1) for i in range(len(y))]
y += e

plt.figure(figsize=(16, 4))
plt.title('Hyperbolic Tangent Scatter')
plt.scatter(X, y)

【犬の解説】
e = [random.gauss(0, 0.1) for i in range(len(y))] 
→ 誤差(error)を与える。-6 < x < 6 の間、ガウス分布を使ったランダム値(平均0、偏差0.1)を生成させる
こんな感じ(print(e)してね)
[0.058752596357015775, 0.15608199508649484, -0.1471632864439256, -0.035855976453525874,・・・・]
y += e → 誤差をハイバボリックタンジェントのyに加算
plt.figure(figsize=(16, 4)) → 画面サイズを定義
plt.title('Hyperbolic Tangent Scatter') → タイトルの表示
plt.scatter(X, y) → 描いて

実行結果
無題2.png

4.SVM(サポートベクターマシン)を使って回帰を実施する

# 列ベクトルに変換する
X = X[:, np.newaxis]

# 学習を行う
svr = svm.SVR(kernel='rbf')
svr.fit(X, y)

# 回帰曲線を描く
X_plot = np.linspace(-6, 6, 10000)
y_plot = svr.predict(X_plot[:, np.newaxis])

#グラフにプロットする。
plt.figure(figsize=(16, 4))
plt.title('SVM predict')
plt.scatter(X, y)
plt.plot(X_plot, y_plot,"r")

【犬の解説】
X = X[:, np.newaxis] 
→ 行ベクトルを列ベクトルに変換

SVR回帰を実施
svr = svm.SVR(kernel='rbf')
→ SVR回帰を指定する。
→ rbfカーネルを使用することで、非線形な回帰分析が可能になる。
難しいことは考えないで、非線形だけどy=f(x)で表わせそうなものであれば
散布データからy=f(x)を想定することはできる。その時はここをコピペしろってことやろ?w

フィッティング
svr.fit(X, y)

回帰曲線を描く
X_plot = np.linspace(-6, 6, 10000)
→ x座標のデータを用意する(-6 < x <6まで10000配列分用意)
y_plot = svr.predict(X_plot[:, np.newaxis])
→ yのデータをSVRで予測した値で保存する

グラフにプロットする。
plt.figure(figsize=(16, 4))
plt.title('SVM predict')
plt.scatter(X, y) → 予測前の散布図を描く
plt.plot(X_plot, y_plot,"r") → 予測したy=f(x)を描く

できた!!!

無題.png

【ここで犬の疑問】
(1)ランダム値を大きくすればどうなる?
偏差0.1 → 0.3に

e = [random.gauss(0, 0.3) for i in range(len(y))]

無題.png

そこそこできた。

(2)X座標は10000点も必要?
10000 → 20に

X_plot = np.linspace(-6, 6, 20)

無題.png

え?こちらのが近似くね?w

お疲れ様でした。

以下ソース全体(コピペ推奨)

import numpy as np
import random
import matplotlib.pyplot as plt
from sklearn import svm
%matplotlib inline

X = np.arange(-6, 6, 0.1)
y = np.tanh(X)

plt.figure(figsize=(16, 4))
plt.title('Hyperbolic Tangent Graph')
plt.plot(X,y)

e = [random.gauss(0, 0.1) for i in range(len(y))]
y += e

plt.figure(figsize=(16, 4))
plt.title('Hyperbolic Tangent Scatter')
plt.scatter(X, y)

# 列ベクトルに変換する
X = X[:, np.newaxis]

# 学習を行う
svr = svm.SVR(kernel='rbf')
svr.fit(X, y)

# 回帰曲線を描く
X_plot = np.linspace(-6, 6, 10000)
y_plot = svr.predict(X_plot[:, np.newaxis])

#グラフにプロットする。
plt.figure(figsize=(16, 4))
plt.title('SVM predict')
plt.scatter(X, y)
plt.plot(X_plot, y_plot,"r")
Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away