You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

在scikit-learn感知机中实现AND函数及两类训练相关问题咨询

嘿,刚入门机器学习和scikit-learn就动手实现AND函数,这很棒!让我来帮你理清这两个问题:

问题1:为什么感知机经过100次迭代后仍未完成训练?

AND函数是典型的线性可分问题,理论上感知机一定能收敛,没完成训练大概率是这些原因:

  • 学习率设置过大:scikit-learn的Perceptron默认学习率eta0=1.0,对于AND这种超简单的问题,太大的学习率会让权重更新时在最优解附近反复横跳,没法稳定收敛。你可以试试把eta0调小到0.1甚至0.01,收敛速度会快很多。
  • 未设置收敛停止条件:默认情况下,Perceptron的tol参数是None,也就是说不管模型有没有学会,它都会老老实实跑完你设置的100次迭代。你可以加个tol=1e-3,这样当损失值的变化小于这个阈值时,训练会提前停止,你也能立刻知道模型已经收敛了。
  • 标签格式的潜在影响:感知机的核心逻辑是基于-1和1的二元标签,虽然scikit-learn能兼容0和1的标签,但偶尔会影响收敛效率。你可以试试把标签里的0换成-1,说不定能更快收敛。
  • 极端初始权重(概率较低):虽然线性可分问题下感知机不管初始权重如何最终都会收敛,但极端离谱的初始权重可能会让迭代次数变多。不过这个情况概率很低,优先排查前面几个原因。
问题2:如何为特征随机分配0到1范围内的权重?

scikit-learn的感知机模型允许你在训练前直接手动修改权重参数,具体步骤如下:

  1. 先初始化感知机模型,确定好基础参数:
from sklearn.linear_model import Perceptron
import numpy as np

# 初始化模型,可提前设置迭代次数、学习率等参数
clf = Perceptron(max_iter=100, eta0=0.1)
  1. 用numpy生成0到1之间的随机数,覆盖模型默认的初始权重。注意coef_是特征权重,二元分类下形状为(1, 特征数);intercept_是偏置项,形状为(1,):
# 生成2个特征的随机权重(范围0到1)
clf.coef_ = np.random.uniform(low=0.0, high=1.0, size=(1, 2))
# 偏置项也可以设置为0到1的随机值
clf.intercept_ = np.random.uniform(low=0.0, high=1.0, size=(1,))
  1. 最后用训练数据拟合模型即可:
# 示例AND训练数据
X = np.array([[0,0], [0,1], [1,0], [1,1]])
y = np.array([0, 0, 0, 1])
clf.fit(X, y)

这样模型就会从你设置的0-1范围内的随机权重开始训练,而不是使用默认的初始值。

内容的提问来源于stack exchange,提问作者jrk

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 08:59:42