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。正确的计算步骤应该是:
- 计算net_input:
([5.1,1.4]·[0.,0.])+0=0,predict结果为1,这部分是对的。 - update计算正确:
0.01*(-1-1)=-0.02。 - 权重更新部分:
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
相关产品推荐
相关产品推荐

