sklearn 感知器无法对 NAND 函数进行分类

sklearn Perceptron not able to classify NAND function

提问人:deepLDoc 提问时间:8/18/2023 最后编辑:desertnautdeepLDoc 更新时间:8/18/2023 访问量:34

问:

我是机器学习的新手。我正在实现一个感知器,以查看哪些逻辑门功能是线性可分离的。对于NAND门,我得到了意想不到的结果。对于输入 X 和输出 y,模型给出的分数为 0.5,y 预测为 [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]

我尝试从模型的权重和偏差中计算 z(净输入),如下所示:

w = clf.coef_ ;b = clf.intercept_
z= np.dot(X,w.T) +b
print(z.T)

这给了我以下结果:

[[ 2.  0.  0. -2.]]
python 机器学习 scikit-learn 感知器

评论


答:

1赞 some3128 8/18/2023 #1

它将迭代收敛,因此精度低可能是因为它没有获得足够的样本。您可以举出更多示例,如下所示:

X= np.array([[0,0],[0,1],[1,0],[1,1]] * 2)
y = np.array([1,1,1,0] * 2)

这将复制您的原始示例两次。

关于你关于矩阵运算的第二点 - 感知器在最后有一个阶跃函数,将负数映射到 0,将正数映射到 1。执行矩阵运算后,通过步进函数( helps),您应该会得到与感知器相同的分类输出: 。np.wheremanual_predict = np.where(X @ w.T + b < 0, 0, 1)

评论

0赞 deepLDoc 8/18/2023
我什至使用了 max_iter=10,000 .分数仍然是 0.5 .对于其他函数,如 AND (y= [0,0,0,1] ) 和 OR (y=[0,1,1,1] ),该函数仅 100 次迭代给出 1 分(100% 准确率)
0赞 some3128 8/18/2023
尝试和 .请注意,我在 和 中都添加了 a。这为它提供了更多的训练示例(在这种情况下是两倍)。我得到了 100% 的准确性。 只需设置允许的最大迭代次数(而不是实际迭代次数)。X= np.array([[0,0],[0,1],[1,0],[1,1]] * 2)y = np.array([1,1,1,0] * 2)*2Xymax_iter
0赞 deepLDoc 8/19/2023
我尝试使用 X= np.array([[0,0],[0,1],[1,0],[1,1]] * 2) 和 y = np.array([1,1,1,0] * 2)。我得到 score=1。但是 clf.predict(X) 给出 [1 1 1 0 1 1 1 0]。问题没有改变吗?因为输出数组大小不同 (4 vs 8 )
0赞 some3128 8/19/2023
重复输入列表 - 输入现在是 8。这就是为什么输出是 8。输出在我看来是正确的。 对于 的 NAND,是正确的。*21 1 1 0 1 1 1 000 01 10 11 00 01 10 11