我试图理解感知器的权重是如何计算的,例如,使用这种方法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
假设在for
循环的第一次迭代中,我们有:
xi = array([5.1, 1.4])
target = int(-1)
self.eta = float(0.01)
self.w_=array([0., 0., 0.])
然后self.predict(xi)
发生,得到update
:
def predict(self,X):
return np.where(self.net_input(X) >= 0.0, 1, -1)
它调用self.net_input(X)
:
def net_input(self,X):
return np.dot(X, self.w_[1:]) + self.w_[0]
然后我们有这些计算:
np.where(X, self.w_[1:]) + self.w_[0] equals ([5.1, 1.4]*[0.,0.]) + 0 = 0
np.where(self.net_input(X) >= 0.0, 1, -1) equals 1 (because *self.net_input(X)* = 0)
update = self.eta * (target - self.predict(xi)) equals update = 0.01 * (-1-1) = -0.02
self.w_[1:] += update * xi equals [0.,0.] += -0.02 * 0.01 = [-0.0002, -0.0002]
self.w_[0] = update(-0.02)
这就是我们所拥有的:self.w_ = array([-0.02 , -0.0002, -0.0002])
然而,在断点上的第一次迭代之后,我看到的是:self.w_ = array([-0.02 , -0.102, -0.028])
我两天前开始学习ML,所以也许我错过了一些重要的东西?
- 附言代码运行良好 *
2条答案
按热度按时间ykejflvf1#
你好blowy我在这里告诉你使用sigmoid等于softmaxx**2e和like这样你就可以找到一个解决你的问题
hkmswyz62#
梯度下降的目标是使成本函数C最小化(w,x)。注意,除了x本身之外,它还由权重参数化。由于函数非常复杂,因此我们使用称为梯度下降的牛顿方法的变体,而不是简单地求解w s.t C(w,x)= 0,取C'(x),其正向最大值移动,并与之相反地移动w以使C最小化。然而,为了避免过冲,我们使用eta或学习速率一次只移动小步。通过每一步,我们得到函数的最小值,它可能不是绝对最小值或0,但它至少是函数的相对最小值。