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

Python中感知机权重计算疑问:手动推导与实际结果不符

感知机权重计算逻辑解惑

相关代码实现

fit方法

def fit(self, X,y):
       
        self.w_ = np.zeros(1 + X.shape[1])
        self.errors_ = []
        for _ in range(self.n_iter):
            errors = 0
            for xi, target in zip(X, y):
                update = self.eta * (target - self.predict(xi))
                self.w_[1:] += update * xi
                self.w_[0] += update
                errors += int(update !=0.0)
            self.errors_.append(errors)
        return self

predict与net_input方法

def predict(self,X):
        return np.where(self.net_input(X) >= 0.0, 1, -1)
def net_input(self,X):
        return np.dot(X, self.w_[1:]) + self.w_[0]

第一次迭代参数假设

xi = array([5.1, 1.4])
target = int(-1)
self.eta = float(0.01)
self.w_=array([0., 0., 0.])

手动推导过程(存在错误)

np.dot(X, self.w_[1:]) + self.w_[0] = ([5.1, 1.4]·[0.,0.]) + 0 = 0

np.where(self.net_input(X) >= 0.0, 1, -1) 结果为1(因net_input(X)=0)

update = self.eta * (target - self.predict(xi)) = 0.01 * (-1-1) = -0.02

# 此处错误:错误地再次乘以eta
self.w_[1:] += update * xi = [0.,0.] += -0.02 * 0.01 = [-0.0002, -0.0002]

self.w_[0] = -0.02

预期权重:self.w_ = array([-0.02 , -0.0002, -0.0002])

实际运行结果

第一次迭代后的实际权重:self.w_ = array([-0.02 , -0.102, -0.028])

错误解析

你在计算update * xi时犯了一个关键错误:update已经是eta*(target-predict(xi))的结果,不需要再额外乘以eta。正确的计算步骤应该是:

  1. 计算net_input:([5.1,1.4]·[0.,0.])+0=0,predict结果为1,这部分是对的。
  2. update计算正确:0.01*(-1-1)=-0.02。
  3. 权重更新部分:
    • self.w_[1:] += update * xi 即 [0.,0.] += (-0.02)*[5.1,1.4]
    • 计算得:0 + (-0.02*5.1) = -0.102,0 + (-0.02*1.4) = -0.028
    • self.w_[0] += update 即 0 + (-0.02) = -0.02

最终得到的权重就是array([-0.02 , -0.102, -0.028]),和实际运行结果一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.24 16:52:45