Граница принятия решения для персептрона

11

Я пытаюсь построить границу решения алгоритма персептрона, и я действительно запутался в нескольких вещах. Мои входные экземпляры имеют форму , в основном это двумерный входной экземпляр ( x 1 и x 2 ) и целевое значение двоичного класса ( y ) [1 или 0].[(x1,x2),y]x1x2y

Следовательно, мой весовой вектор имеет вид: .[w1,w2]

Теперь я должен включить дополнительный параметр смещения и, следовательно, мой весовой вектор становится вектором 3 × 1 ? это 1 × 3 вектор? Я думаю, что это должно быть 1 × 3, так как вектор имеет только 1 строку и n столбцов.w03×11×31×3

Теперь давайте предположим, что я создаю экземпляр для случайных значений, как я могу построить границу решения для этого? Имеется в виду, что здесь означает w 0 ? Является ли w 0 / n o r m ( w ) расстоянием между областью принятия решения и началом координат? Если да, то как мне это перехватить и построить на Python, используя matplotlib.pyplot или его эквивалент Matlab?[w0,w1,w2]w0w0/norm(w)

Я был бы очень признателен за небольшую помощь по этому вопросу.

user2502020
источник

Ответы:

16

Способ, которым персептрон предсказывает результат на каждой итерации, заключается в следующем:

yj=f[wTx]=f[wx]=f[w0+w1x1+w2x2+...+wnxn]

ww01

n×11×nn×1

Помните, что это делается для каждого входа, который вы имеете в тренировочном наборе. После этого обновите вектор весов, чтобы исправить ошибку между прогнозируемым выходным значением и реальным выходным значением.

Что касается границы решения, вот модификация кода обучения scikit, который я нашел здесь :

import numpy as np
from sklearn.linear_model import Perceptron
import matplotlib.pyplot as plt

X = np.array([[2,1],[3,4],[4,2],[3,1]])
Y = np.array([0,0,1,1])
h = .02  # step size in the mesh


# we create an instance of SVM and fit our data. We do not scale our
# data since we want to plot the support vectors

clf = Perceptron(n_iter=100).fit(X, Y)

# create a mesh to plot in
x_min, x_max = X[:, 0].min() - 1, X[:, 0].max() + 1
y_min, y_max = X[:, 1].min() - 1, X[:, 1].max() + 1
xx, yy = np.meshgrid(np.arange(x_min, x_max, h),
                     np.arange(y_min, y_max, h))

# Plot the decision boundary. For that, we will assign a color to each
# point in the mesh [x_min, m_max]x[y_min, y_max].
fig, ax = plt.subplots()
Z = clf.predict(np.c_[xx.ravel(), yy.ravel()])

# Put the result into a color plot
Z = Z.reshape(xx.shape)
ax.contourf(xx, yy, Z, cmap=plt.cm.Paired)
ax.axis('off')

# Plot also the training points
ax.scatter(X[:, 0], X[:, 1], c=Y, cmap=plt.cm.Paired)

ax.set_title('Perceptron')

который производит следующий участок:

введите описание изображения здесь

По сути, идея состоит в том, чтобы предсказать значение для каждой точки в сетке, которая покрывает каждую точку, и построить каждый прогноз с использованием соответствующего цвета, используя contourf.

Роберт Смит
источник
0

w0,w1,w2

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')

простой персептрон классифицирует два разных класса

Рубанрай Равичандран
источник