質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.47%
Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

2回答

2136閲覧

Python 非線形SVM 2次元 可視化

doraemon1106

総合スコア18

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

0グッド

0クリップ

投稿2020/02/07 00:43

編集2020/02/07 01:08

Python初心者です.

2次元変数(例えばx,y)をグラフの縦軸横軸にして,0.1にクラス分けしたものをプロットしていって非線形SVMで分けたいと思っています。

1つのデータに(x座標,y座標,クラス)を所持しているとして,.txtから読みこんだ50個のデータで非線形SVMで識別した後可視化もしたいのですが、ネットに乗っている情報がすべてデータセットからでいまいち理解ができないです.

どなたか教えていただけるとありがたいです.

OSはWindows10で,PythonはAnaconda→Jupyter→Python3を使っています。

こちらのグラフのような感じにしたいです
svm境界線の可視化

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

hayataka2049

2020/02/07 13:13

.txtはどのようなフォーマットなのかを追記してください
guest

回答2

0

scikit-learnとnumpyとmatplotlibを使い慣れていることを前提に回答しています。理解できない場合は検索したりして理解を深めてからトライしてください。

データの読み込み

以下の2つのnumpy配列を作ります。どんな手段で生成するにせよ、テキストから読み込んで最終的に作れればオッケーです。

  • X:各データのx座標とy座標を格納。shape=(50, 2)
  • y:各データのクラスを格納。shape=(50, )

やり方がわかるなら自分で好きな方法で行ってください。teratailで助言を求める場合、データ形式がわからないと誰も手の出しようがないと思います。

SVMの学習

学習は普通にやります。

python

1from sklearn.svm import SVC 2clf = SVC() 3clf.fit(X, y)

トレーニングデータとテストデータを分離する、パラメータを調整するなど、工夫のしようは色々あります。必要に応じてやってください。

予測させる

この場合、まず図上の全体を予測させる必要があります。グリッド上のデータを作成し、予測を行わせます。

python

1# この2つは自由に調整可能 2gridsize = 0.1 3margin = 0.5 4 5x_min = X[:, 0].min() - margin 6x_max = X[:, 0].max() + margin 7y_min = X[:, 1].min() - margin 8y_max = X[:, 1].max() + margin 9 10xx, yy = np.meshgrid(np.arange(x_min, x_max, gridsize), 11 np.arange(y_min, y_max, gridsize)) 12 13pred = clf.predict(np.c_[xx.ravel(), yy.ravel()])

プロットする

基本的には得られた予測と元のデータを適当に重ねてプロットしてあげればそれで良いでしょう。このあたりについては添付したコードやscikit-learnのサンプルを参考にしてください。

なお、境界線のプロットにはエッジ検出する、確率を予測させて0に近いところを取り出すなど、若干の工夫が必要です。色を塗り分ける方が簡単です。

サンプル

irisの最初の2クラス、2次元でやったやつを置いておきます。

python

1import numpy as np 2import matplotlib.pyplot as plt 3from sklearn.datasets import load_iris 4from sklearn.svm import SVC 5 6iris = load_iris() 7X = iris.data[iris.target!=2][:, [0, 1]] 8y = iris.target[iris.target!=2] 9 10clf = SVC() 11clf.fit(X, y) 12 13gridsize = 0.02 14margin = 0.5 15 16x_min = X[:, 0].min() - margin 17x_max = X[:, 0].max() + margin 18y_min = X[:, 1].min() - margin 19y_max = X[:, 1].max() + margin 20 21xx, yy = np.meshgrid(np.arange(x_min, x_max, gridsize), 22 np.arange(y_min, y_max, gridsize)) 23 24Z = clf.predict(np.c_[xx.ravel(), yy.ravel()]).reshape(xx.shape) 25 26for i in range(2): 27 plt.scatter(X[y==i,0], X[y==i,1], label=iris.target_names[i], c="rb"[i]) 28 29plt.legend() 30plt.contourf(xx, yy, Z, cmap="RdBu", alpha=0.1) 31plt.savefig("result.png") 32

イメージ説明

また、以下が参考になるでしょう。scikit-learnのexampleには他にも参考になるコードがたくさんあるので、見るときっと色々なことを学べると思います。

Classifier comparison — scikit-learn 0.22.1 documentation
Plot different SVM classifiers in the iris dataset — scikit-learn 0.22.1 documentation

投稿2020/02/07 13:50

hayataka2049

総合スコア30933

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

scikit-learnには機械学習用のデーターを自動生成する
make_blobsやmake_regressionなどのクラスが用意されています。

機械学習 〜 データセット生成 〜
https://qiita.com/fujin/items/bb82d77b0b08c107f819

シンプルなデータが欲しいのであれば検討してみてはいかがでしょう。

投稿2020/02/07 02:15

technocore

総合スコア7238

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.47%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問