感知机

来源:互联网 发布:采购平台软件 编辑:程序博客网 时间:2024/05/01 19:23

考虑到还有一个月要找工作了,所以决定写个博客来抢救一下自己(梳理一下所学的东西)


从最简单的感知机开始,感知机说来菜鸡,但在我看来却是集大成的体现(o゜▽゜)o☆

(我的理解线性SVM就是它的进化版)


先来看看感知机的基础面板:

1)目的:分类,二分类;

2)损失函数:

3)方法:梯度下降,每次找分错的样本点根据梯度修改权重w


至于它的对偶问题,我们假设对于权重w和偏置b初始化为0,那么最后的w和b就变成了这个样子:


其中N表示样本的个数,αi实质表示所对应第i个样本在训练过程中误分类的次数(也是根据该样本调整w、b的次数)

(上面那个w是不是和SVM里头那个w对偶形式一毛一样o(* ̄▽ ̄*)ブ)


理论部分结束,我们开始撕代码= =

class Perceptron:    def __init__(self):        self._w = self._b = None    def fit(self, x, y, lr=0.01, epoch=1000):        x, y = np.asarray(x, np.float32), np.asarray(y, np.float32)        self._w = np.zeros(x.shape[1])        self._b = 0.        for _ in range(epoch):            err = -y * self.predict(x, True)            idx = np.argmax(err)            if err[idx] < 0:                break            delta = lr * y[idx]            self._w += delta * x[idx]            self._b += delta    def predict(self, x, raw=False):        x = np.asarray(x, np.float32)        y_pred = x.dot(self._w) + self._b        if raw:            return y_pred        return np.sign(y_pred).astype(np.float32)

我们初始化权重w和b为0,学习率(lr)为0.01迭代次数为1000(你问我为啥要有迭代次数的限制?万一数据集有异常点怎么办,万一线性不可分怎么办,不可分我也很绝望啊(;′⌒`))

每一次我们选择下降步子最大的那个样本进行下降,当然这里你可以进行修改,取一个batch计算它梯度,然后取平均下降


我们可以看下效果



效果还不错,收工o(* ̄▽ ̄*)ブ

原创粉丝点击