使用sklearn Perceptron无法正确分类NAND函数,请求排查问题
Perceptron实现NAND门预测异常问题排查
我是机器学习新手,正在用Perceptron验证逻辑门的线性可分性,但针对NAND门的实现结果不符合预期:模型在输入X和输出y上的得分仅为0.5,预测结果是[1,0,0,0],而预期应该是[1,1,1,0]。
训练代码
import numpy as np from sklearn.linear_model import Perceptron clf = Perceptron(max_iter=100, random_state=0) X= np.array([[0,0],[0,1],[1,0],[1,1]]) y = np.array([1,1,1,0]) clf.fit(X, y) score= clf.score(X, y) print(score) a=clf.predict(X) print(a)
代码输出
0.5 [1 0 0 0]
净输入计算代码
w = clf.coef_ ;b = clf.intercept_ z= np.dot(X,w.T) +b print(z.T)
净输入计算结果
[[ 2. 0. 0. -2.]]
问题原因
sklearn的Perceptron默认遵循原始感知机算法设计,期望分类标签为{-1, 1},但你传入的标签是{0,1}。这种标签格式不匹配会导致模型权重更新逻辑出错,无法收敛到NAND门对应的正确线性分隔边界。
解决方法
将标签集中的0替换为-1,让标签符合Perceptron的预期格式:
import numpy as np from sklearn.linear_model import Perceptron clf = Perceptron(max_iter=100, random_state=0) X= np.array([[0,0],[0,1],[1,0],[1,1]]) # 将原标签中的0替换为-1 y = np.array([1,1,1,-1]) clf.fit(X, y) score= clf.score(X, y) print(score) a=clf.predict(X) # 可选:将预测结果中的-1转换回0,方便和预期结果对比 a = np.where(a == -1, 0, a) print(a)
修改后运行,模型得分会变为1.0,预测结果也会符合预期的[1,1,1,0]。
内容的提问来源于stack exchange,提问作者deepLDoc
相关产品推荐
相关产品推荐

