私は次のことを理解しています。
2D空間では、各データポイントにはxとyの2つの特徴があります。 2D空間の重みベクトルには、[w0、w1、w2]と書き換えることができる3つの値[bias、w0、w1]が含まれています。各データポイントは、データポイントと重みベクトルの間の内積を計算するために、人工座標[1、x、y]を必要とします。
誤分類された各点の重みベクトルを更新するために使用される学習ルールは、w:= w + yn * xnです。
私の質問は、決定境界をグラフ化するために、重みベクトルw = [A、B、C]から2つの点をどのように導出するかです。
A + Bx + Cy = 0は一般的な形式の一次方程式(A、B、Cは重みベクトルから取得できます)であることは理解していますが、それをプロットする方法がわかりません。
前もって感謝します。
重みを一般的な形式(w0 + w1x + w2y = 0)に接続し、x、x = 0、y、y = 0について解きます。
x = -(w0 - w2y)/w1
x = 0 when y = -w0/w2
y = -(w0 - w1x)/w2
y = 0 when x = -w0/w1
これで、線上に2つの点があります:(0、-w0/w2)と(-w0/w1、0)
slope = -(w0/w2)/(w0/w1)
intercept = -w0/w2
最近、私は同じことを実装しようとしましたが、3つの重み$ w_0、w_1、w_2 $を使用して決定境界プロットを描画する方法があまりにも混乱していました。そして、上記の@Joshuソリューションに基づいて、境界線を描画するmatplotlibコードを記述しました。
def plot_data(self,inputs,targets,weights):
# fig config
plt.figure(figsize=(10,6))
plt.grid(True)
#plot input samples(2D data points) and i have two classes.
#one is +1 and second one is -1, so it red color for +1 and blue color for -1
for input,target in Zip(inputs,targets):
plt.plot(input[0],input[1],'ro' if (target == 1.0) else 'bo')
# Here i am calculating slope and intercept with given three weights
for i in np.linspace(np.amin(inputs[:,:1]),np.amax(inputs[:,:1])):
slope = -(weights[0]/weights[2])/(weights[0]/weights[1])
intercept = -weights[0]/weights[2]
#y =mx+c, m is slope and c is intercept
y = (slope*i) + intercept
plt.plot(i, y,'ko')
線を引く最良の方法は、表示軸上の最小x値と最大x値を見つけることです。既知の一次方程式(-(A + BX)/ C)を使用してy値を計算します。この結果、2つのポイントで組み込みのplotコマンドを使用して線を描画します。