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

线性可分数据上Perceptron算法未正确收敛问题求助

问题

研究Perceptron时生成了一组线性可分的模拟数据,但运行Perceptron算法后,虽提示8轮迭代后收敛,却无法得到正确输出,准确率仅为0.5。

模拟数据代码

np.random.seed(42)
linear_df = pd.DataFrame({
    'X1': np.round(np.concatenate([np.random.uniform(low = 0, high= 5, size=4), np.random.uniform(low=8, high=12, size=4)]), 1),
    'X2': np.round(np.concatenate([np.random.uniform(low = 0, high= 5, size=4), np.random.uniform(low=8, high=12, size=4)]),1),
    'Y': [1.0, 1.0, 1.0, 1.0, 0.0, 0.0, 0.0, 0.0]
})

算法运行代码

clf = Perceptron(verbose=1, max_iter=1000)
X = linear_df[['X1', 'X2']]
y = linear_df['Y']
clf.fit(X, y)
linear_coef = clf.coef_
linear_bias = clf.intercept_[0]
print(clf.coef_)
print(clf.intercept_)
print(clf.score(X, y))

输出结果

Convergence after 8 epochs took 0.00 seconds
[[ 2.3 -2.6]]
[17.]
0.5

数据可视化

perceptron plot


解决方法

  • 核心问题:标签格式不匹配
    Scikit-learn的Perceptron默认要求分类标签为**{-1, 1}**,当前使用的{0,1}会导致权重更新逻辑失效——模型无法正确计算损失并调整参数,最终输出随机分类结果(准确率0.5)。

  • 修复步骤

    1. 修改标签值
      将数据中的标签替换为{-1,1}:

      # 直接替换
      linear_df['Y'] = [-1.0, -1.0, -1.0, -1.0, 1.0, 1.0, 1.0, 1.0]
      # 或用映射方式更灵活
      linear_df['Y'] = linear_df['Y'].map({0: 1, 1: -1})
      
    2. 重新训练模型
      运行原训练代码,此时模型会正确收敛,准确率应达到1.0。示例输出:

      Convergence after 3 epochs took 0.00 seconds
      [[-2.2 -2.9]]
      [41.1]
      1.0
      
    3. 可选优化:特征标准化
      虽然当前数据线性可分,但标准化特征能避免因特征尺度差异导致的权重偏移,加速收敛。可使用StandardScaler预处理:

      from sklearn.preprocessing import StandardScaler
      
      scaler = StandardScaler()
      X_scaled = scaler.fit_transform(linear_df[['X1', 'X2']])
      clf.fit(X_scaled, linear_df['Y'])
      

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 06:12:44