提问人:deepLDoc 提问时间:8/18/2023 最后编辑:desertnautdeepLDoc 更新时间:8/18/2023 访问量:34
sklearn 感知器无法对 NAND 函数进行分类
sklearn Perceptron not able to classify NAND function
问:
我是机器学习的新手。我正在实现一个感知器,以查看哪些逻辑门功能是线性可分离的。对于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.]]
答:
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.where
manual_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)
*2
X
y
max_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,是正确的。*2
1 1 1 0 1 1 1 0
00 01 10 11 00 01 10 11
评论