感知器 - AND 运算符

Perceptron - AND operator

我使用这段代码实现了 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()

Screenshot here

决策边界是正确的,因为所有 > 都被 class 化为 class 1,所有 <= 都被化为 class 0。 但是,您将 classifier 预测结果的绝对值可视化的方式可能会产生误导?


sklearn 文档参考了英语维基文章,其中对感知器使用了以下定义:

因为唯一的 class 1 标签是点 (1,1),我们可以选择右上角即 w = [2,2]b=-2 来正确 class 化 (1,1) as 1(0,0), (0,1), (1,0) as 0

点 (1,0) 和 (0,1) 将位于决策边界上,因为 2*0+2*1-2 =0。然而,我们也可以选择 b=-3 并且我们的 classification 问题仍然可以正确解决。区别在于点 (1,0) 和 (0,1) 不再直接位于边界,因为 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 的边缘情况并求解 x。您将获得:

所以策划这将导致这样的事情:

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

这就是您在图片中看到的深蓝色山谷。我们的点 (1,0) 和 (0,1) 也位于边界上。您可以使用 b=-3 玩弄,在那里您可以获得一条具有更高 y-intercept 的线,这可能是您期望的?

决策边界计算正确,但我预计它会有所不同。 @v.tralala 对此问题的回答对此进行了详尽的解释。同时我发现,如果 random_state 给定非零值(例如 random_state = 100),将计算不同的截距和权重值,因此决策边界将更接近点(1 ,1).enter image description here