Перцептрон - оператор И - PullRequest
       24

Перцептрон - оператор И

1 голос
/ 18 апреля 2020

Я использовал этот код для реализации оператора AND, но строка, которая разделяет регионы, не рассчитана должным образом. Проходит точки [1, 0] и [0, 1]. Что делать, чтобы правильно разделить регионы?

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

data = [[0,0],[1,0],[0,1],[1,1]]
labels_and = [0, 0, 0, 1]

x = [points[0] for points in data]
y = [points[1] for points in data]

plt.scatter(x, y, c = labels_and)
plt.show()

classifier = Perceptron()
classifier.fit(data, labels_and)

print(classifier.score(data, labels_and))

result = classifier.decision_function([[0, 0], [1, 1], [0.5, 0.5]])
print(result)

x_values = y_values = np.linspace(0, 1, 100)
point_grid = list(product(x_values, y_values))
distances = classifier.decision_function(point_grid)
abs_distance = [abs(x) for x in distances]

distance_matrix = np.reshape(abs_distance, (100, 100))

heatmap = plt.pcolormesh(x_values, y_values, distance_matrix)
plt.colorbar(heatmap)
plt.show()

Скриншот здесь

Ответы [ 2 ]

0 голосов
/ 18 апреля 2020

Граница решения была рассчитана правильно, но я ожидал, что она будет другой. Это подробно объясняется в @ v.tralala ответе на этот вопрос. Тем временем я обнаружил, что если random_state задано значение, отличное от нуля (например, random_state = 100), будут вычислены различные значения перехвата и весов, поэтому граница решения будет ближе к точке (1,1). введите описание изображения здесь

0 голосов
/ 18 апреля 2020

Граница принятия решения верна, потому что все > классифицируется как класс 1, а все <= как класс 0. Однако ваш способ визуализации абсолютного значения исхода прогноза классификатора, возможно, вводит в заблуждение?


Документы sklearn относятся к вики-статье Engli sh, в которой для персептрона используется следующее определение:

enter image description here

С единственная метка класса 1 - это точка (1,1), верхний правый угол, который мы можем выбрать, например w = [2,2] и b=-2, чтобы правильно классифицировать (1,1) as 1 и (0,0), (0,1), (1,0) as 0.

Точки (1,0) и (0,1) будут l ie на границе принятия решения с 2*0+2*1-2 =0. Однако мы также могли бы выбрать b=-3, и наша проблема классификации все равно будет решена правильно. Разница в том, что точки (1,0) и (0,1) больше не * ie непосредственно на границе с 2*0+2*1-3 <0.

Давайте посмотрим, какие параметры изучил наш обученный персептрон! Чтобы получить к ним доступ, вы можете посмотреть из sklearn docs

w = classifier.coef_[0]  
b = classifier.intercept_   

Если вы напечатаете их, вы, вероятно, получите w=[2,2] и b=-2. Чтобы вывести линию, представляющую соответствующую границу решения, вы можете рассмотреть крайние случаи, где w0*x + w1*y + b == 0, и решить для х. Вы получите:

enter image description here

Таким образом, построение графика приведет к чему-то вроде этого:

m = -weight[0]/weight[1]   
n = -b/weight[1]    
plt.plot(x_values, m*x_values+n)   

enter image description here

- темно-синяя долина, которую вы видите на своей картинке. Также наши точки (1,0) и (0,1) l ie на границе. Вы можете поиграть с b=-3, где вы получите линию с более высоким y-перехватом, который вы, вероятно, ожидаете?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...