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

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

新規登録して質問してみよう
ただいま回答率
85.50%
機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

Q&A

解決済

1回答

1968閲覧

[機械学習]パーセプトロンの分類直線について

ebiebi5563

総合スコア16

機械学習

機械学習は、データからパターンを自動的に発見し、そこから知能的な判断を下すためのコンピューターアルゴリズムを指します。人工知能における課題のひとつです。

Python

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

0グッド

0クリップ

投稿2018/11/24 09:04

編集2018/11/24 09:06

###聞きたいこと
現在、機械学習の基礎を学んでいる最中なのですが、パーセプトロンの部分で詰まってしまいました...。以下の①不安な点と②理解できない点について、それぞれ回答いただきたいです。

###不安な点
**1.**パーセプトロンは、重みベクトルを法線とする直線をもとに分類しているのか

**2.**重みを更新するか否かは、重みベクトルと各データの内積での正負、そして正解ラベルと照らし合わせることで決まる
###理解できない点
1.「重みベクトルを法線とする直線の方程式は内積をとって0になるxの集まりで、式の形を整えると、
wx = w1x1 + w2x2 = 0
x2 = -w1/w2
x1
となり、分類直線をプロットできる」
と書籍に書いてあったのですが、x1を変数とするx2の式にしなければいけないのでしょうか。
実際にプロットしてみたのですが、若干違いはあるものの、どちらも分類できているように思えます。

**2.**学習し終わったあとの重みをプロットしてみたのですが(★マーク)、これが重みベクトルなのでしょうか。
###左画像(x2の式) 右画像(x1の式)
x(width)の方が大きい = More Width = 1(正解ラベル)
y(height)の方が大きい = More Height = -1(正解ラベル)
パーセプトロン

###コード

Python

1import pandas as pd 2import numpy as np 3import matplotlib.pyplot as plt 4import seaborn as sns 5import os 6os.chdir("data") 7 8data = pd.read_csv("images1.csv") 9 10features = data.iloc[:, 0:2].copy() 11target = data.iloc[:, 2].copy() 12 13"""可視化 14fig, axes = plt.subplots(figsize=(10, 10)) 15axes.scatter(features.ix[target == 1, 0], features.ix[target == 1, 1], label="More Width", marker="o", s=80, color="red", alpha=0.6) 16axes.scatter(features.ix[target == -1, 0], features.ix[target == -1, 1], label="More Heght", marker="x", s=80, color="blue", alpha=0.6) 17axes.set_title("Scatter of matplotlib") 18axes.set_xlabel("x1") 19axes.set_ylabel("x2") 20axes.legend(loc="best") 21#sns.lmplot(x="x1", y="x2", hue="y", data=data, fit_reg=False) 22plt.show() 23""" 24 25print("説明変数") 26print(features) 27print("-"*77) 28print("目的変数") 29print(target) 30print("-"*77) 31print() 32 33#重みの初期化 34#2変数のため2つ生成 35w = np.random.rand(2) 36 37flag = False 38#識別関数 39def predict_f(x): 40 if flag: 41 print("w={}, x={}".format(w, x)) 42 result = np.dot(w, x) 43 print(result) 44 if np.dot(w, x) >= 0: 45 return 1 46 else: 47 return -1 48 49#繰り返し回数 50epoch = 10 51 52#更新回数 53count = 0 54 55#重みの更新式 56for _ in range(epoch): 57 for x, y in zip(features.values, target.values): 58 if predict_f(x) != y: 59 print("予測結果 = ", predict_f(x)) 60 print("正解データ = ", y) 61 print("現在の重み = ", w) 62 print("正解データ({}) × 各データ({}) = {}".format(y, x, (y * x))) 63 print("現在の重みを更新\n{} + {} = {}".format(w, (y * x), (w + (y * x)))) 64 w = w + y * x 65 count += 1 66 print("{}回目: w = {}".format(count, w)) 67 print() 68 69#どっち? 70x_ = np.arange(0, 500) 71y_1 = -w[0] / w[1] * x_ 72y_2 = -w[1] / w[0] * x_ 73 74#分類できるか確認 75flag = True 76t1 = [200, 100] 77t2 = [100, 200] 78p1 = predict_f(t1) 79p2 = predict_f(t2) 80 81fig, axes = plt.subplots(1, 2, figsize=(10, 10)) 82axes[0].scatter(features.ix[target == 1, 0], features.ix[target == 1, 1], label="More Width", marker="o", s=80, color="red", alpha=0.6) 83axes[0].scatter(features.ix[target == -1, 0], features.ix[target == -1, 1], label="More Heght", marker="x", s=80, color="blue", alpha=0.6) 84axes[0].scatter(t1[0], t1[1], label="Predict...{}".format(p1), color="red", s=150) 85axes[0].scatter(t2[0], t2[1], label="Predict...{}".format(p2), color="blue", s=150, marker="x") 86axes[0].scatter(w[0]/10, w[1]/10, color="gold", marker="*", edgecolor="k", s=150, label="Weight Vector?") 87axes[0].plot(x_, y_1, linestyle="dashed", color="indianred") 88axes[0].set_title("Perceptron Plot(x2 = -w[0] / w[1] * x1)") 89axes[0].set_xlabel("x1") 90axes[0].set_ylabel("x2") 91axes[0].legend(loc="best") 92#sns.lmplot(x="x1", y="x2", hue="y", data=data, fit_reg=False) 93 94axes[1].scatter(features.ix[target == 1, 0], features.ix[target == 1, 1], label="More Width", marker="o", s=80, color="red", alpha=0.6) 95axes[1].scatter(features.ix[target == -1, 0], features.ix[target == -1, 1], label="More Heght", marker="x", s=80, color="blue", alpha=0.6) 96axes[1].scatter(t1[0], t1[1], label="Predict...{}".format(p1), color="red", s=150) 97axes[1].scatter(t2[0], t2[1], label="Predict...{}".format(p2), color="blue", s=150, marker="x") 98axes[1].scatter(w[0]/10, w[1]/10, color="gold", marker="*", edgecolor="k", s=150, label="Weight Vector?") 99axes[1].plot(x_, y_2, linestyle="dashed", color="indianred") 100axes[1].set_title("Perceptron Plot(x1 = -w[1] / w[0] * x2)") 101axes[1].set_xlabel("x1") 102axes[1].set_ylabel("x2") 103axes[1].legend(loc="best") 104 105plt.show()

何卒ご回答の程よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

式自体は式変形しているだけなので、どちらでも良いと言えます。

ただし、x1とx2の式なので、逆で求めたのならplotするときも逆転させてください。plotされているのはあくまでもx1とx2の空間なので、その点は注意する必要があります。

下のようにすれば同じ結果になると思います。

python

1axes[1].plot(y_2, x_, linestyle="dashed", color="indianred")

どちらにせよ「同じ式」なので、分類境界は1つです。変化してはいけません。今回はx1とx2が同じようなスケールで、斜めの線を引くだけなので、変えてしまっても違和感のない結果になっていますが。

投稿2018/11/24 11:33

hayataka2049

総合スコア30933

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

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

ebiebi5563

2018/11/26 06:37

ありがとうございます。 参考になりました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問