线性可分数据上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
数据可视化

解决方法
核心问题:标签格式不匹配
Scikit-learn的Perceptron默认要求分类标签为**{-1, 1}**,当前使用的{0,1}会导致权重更新逻辑失效——模型无法正确计算损失并调整参数,最终输出随机分类结果(准确率0.5)。修复步骤
修改标签值
将数据中的标签替换为{-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})重新训练模型
运行原训练代码,此时模型会正确收敛,准确率应达到1.0。示例输出:Convergence after 3 epochs took 0.00 seconds [[-2.2 -2.9]] [41.1] 1.0可选优化:特征标准化
虽然当前数据线性可分,但标准化特征能避免因特征尺度差异导致的权重偏移,加速收敛。可使用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
相关产品推荐
相关产品推荐

