了解 Python 中感知器权重的计算

Understanding the calculation of Perceptron weights in Python

提问人:sndmndss 提问时间:4/14/2023 最后编辑:Kyle F. Hartzenbergsndmndss 更新时间:4/18/2023 访问量:93

问:

例如,我试图了解感知器的权重是如何计算的,例如,使用这种方法: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])

我 2 天前开始学习 ML,所以也许我错过了一些重要的东西?

P.S. 代码运行良好

python numpy 机器学习 感知器

评论


答:

0赞 Lawrence Specter 4/14/2023 #1

梯度下降的目标是使成本函数 C(w, x) 最小化。请注意,除了 x 本身之外,它还由权重参数化。由于该函数非常复杂,我们使用牛顿方法的一种变体,称为梯度下降,而不是简单地求解 w s.t C(w, x) = 0。我们取 C'(x) 向最大值移动,并使其相反移动 w 以最小化 C。但是,为了避免超调,我们使用 eta 或学习率一次只移动小步。通过每个步骤,我们得到函数的最小值。它可能不是函数的绝对最小值或 0,但最后至少是一个相对最小的值。

0赞 Pruha 4/14/2023 #2

你好 bloowy 我在这里告诉你使用等于 softmaxx**2e 的 Sigmoid Andl ike 这个你可以找到解决你问题的方法