繁体   English   中英

感知器 - 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()

截图在这里

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


sklearn 文档参考英文 wiki 文章,该文章使用以下感知器定义:

在此处输入图像描述

由于只有 class 1 label 是点(1,1) ,所以右上角我们可以选择 ie w = [2,2]b=-2来正确分类(1,1) as 1(0,0), (0,1), (1,0) as 0

由于2*0+2*1-2 =0 ,点 (1,0) 和 (0,1) 将位于决策边界上。 然而,我们也可以选择b=-3 ,我们的分类问题仍然可以正确解决。 不同之处在于点 (1,0) 和 (0,1) 不再直接位于边界处,因为2*0+2*1-3 <0

让我们看看我们训练有素的感知器学习了哪些参数! 要访问它们,您可以从sklearn 文档中看到

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 截距的线?

决策边界计算正确,但我预计它会有所不同。 这在@v.tralala 对这个问题的回答中得到了彻底的解释。 同时我发现,如果random_state被赋予非零值(例如random_state = 100 ),将计算不同的截距和权重值,因此决策边界将更接近点 (1,1)。 在此处输入图像描述

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM