在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的感知机模型允许你在训练前直接手动修改权重参数,具体步骤如下:
- 先初始化感知机模型,确定好基础参数:
from sklearn.linear_model import Perceptron import numpy as np # 初始化模型,可提前设置迭代次数、学习率等参数 clf = Perceptron(max_iter=100, eta0=0.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,))
- 最后用训练数据拟合模型即可:
# 示例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
相关产品推荐
相关产品推荐

