感知机

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


从最简单的感知机开始,感知机说来菜鸡,但在我看来却是集大成的体现(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(* ̄▽ ̄*)ブ

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值