感知机算法未按预期运行,排查Python实现代码的问题
感知机实现结果不符合预期的问题排查
代码里的明确bug点
- 阶跃函数的输出和标签取值对不上
现在的step函数吐出来的是0和1,但你做权重更新的时候靠的是y_hat - y[i]的差值判断:如果你的原始标签是常规二分类的-1/1取值,这俩的差值根本碰不上代码里写的1、-1两个更新触发阈值,等于权重更新分支根本不会正确触发,模型学不动。 - 权重更新的方向写反了
现在的逻辑是预测值比真实值大1的时候,反而往大了调权重和偏置,这和感知机的修正逻辑完全反过来:本来应该是正样本被错分成负类的时候,才抬权重把得分拉上去;负样本被错分成正类的时候,才压权重把得分降下来,你现在的写法越迭代,分割线离正确位置越远。 - 没用的代码还写错了
算维度边界那行y_min, y_max = min(x.T[1]), max(x.T[0])明显手滑,把x维度的最大值塞给y_max了,而且这行算出来的数后面压根没用到,纯纯的无效错代码。 - 偏置初始值设得不合理
现在的偏置是随机数加x方向的最大值,等于初始分割线直接怼到x轴最右端,离数据群老远,前几个epoch根本学不到东西。
改完能跑的核心逻辑
# 适配-1/1标签的阶跃函数 def step(t): return 1 if t >= 0 else -1 # 单步更新的正确写法 def perceptronstep(x, y, w, b, learning_rate): for i in range(len(x)): y_hat = prediction(x[i], w, b) # 错了才更新,不用靠差值判断 if y_hat != y[i]: for j in range(len(w)): w[j] += learning_rate * y[i] * x[i][j] b += learning_rate * y[i] return w, b
内容的提问来源于stack exchange,提问作者devanathan sabapathy
相关产品推荐
相关产品推荐

