Гранічний графік рішення для перцептрона


11

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

Звідси мій ваговий вектор у формі: .[w1,w2]

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

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

Я дуже би вдячний навіть невеликої допомоги з цього приводу.

Відповіді:


17

Те, як перцептрон прогнозує вихід у кожній ітерації, дотримується рівняння:

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

Як ви вже говорили, ваша вага містить термін зміщення . Тому вам потрібно включити у вхід, щоб зберегти розміри у крапковому творі. w01ww01

Зазвичай ви починаєте з вектора стовпця для ваг, тобто вектора . За визначенням, точковий продукт вимагає, щоб ви перенесли цей вектор, щоб отримати ваговий вектор ваги та доповнити цей крапковий продукт вам потрібно вхідний вектор . Ось чому підкреслюється зміна між матричною нотацією та позначенням векторів у рівнянні вище, так що ви можете бачити, як нотація пропонує вам правильні розміри.1 × n n × 1n×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

Нещодавно я намагався реалізувати те саме, але занадто розгублено, як намалювати граничну рішення з трьома вагами . І грунтуючись на іншому рішенні, я написав python matplotlib код, щоб намалювати граничну лінію, яка класифікує два класи.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')

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.