# 梯度下降法的算法过程

输入：\
训练数据集$$T={(x\_1, y\_1), (x\_1, y\_1), \cdots, (x\_n, y\_n)}$$，其中

$$
\begin{aligned}
x\_i \in R^n \\
y\_i \in y = {-1, +1}, \\
i = 1, 2, \cdots, n
\end{aligned}
$$

学习率为$$\eta$$\
输出：\
w, b\
感知机模型$$f(x) = sign(w \cdot x + b)$$ 过程：\
1\. 选取初值w\_0, b\_0\
2\. 在训练集中选取数据$$(x\_i, y\_i)$$ 3. 如果$$y\_i(w \cdot x\_i + b) \le 0$$，则

$$
\begin{cases}
w \leftarrow w + \eta y\_ix\_i \\
b \leftarrow b + \eta y\_i
\end{cases}
$$

1. 转至2，直至训练集中没有错误分类点 &#x20;

   直观解释：当一个实例点被误分类， 即位于超平面错误的一侧时，则调整w,b的值，使超平面向该误分类点的一侧移动，以减少该误分类点与超平面的距离，直至超平面越过该误分类点使其被正确划分

代码： <https://github.com/windmissing/LiHang-TongJiXueXiFangFa/blob/master/Chapter2/perceptron.ipynb>

```python
# 感知机原始形式
def perceptron(X, y, eta):
    w, b = np.zeros(X.shape[1]),0
    while ((y*(w.dot(X.T)+b))<=0).any():
        index = np.random.randint(X.shape[0])
        if y[index]*(w.dot(X[index])+b) <= 0:
            w = w + eta * y[index] * X[index]
            b = b + eta * y[index]
    def f(x):
        return np.sign(w.dot(x)+b)
    return w, b, f
```
