4.感知机

一、感知机

感知机是二分类的线性分类模型,就我的理解是,找到类似于“线性回归”的一个超平面,将所有实例划分为两类,利用梯度下降优化算法,尽量使得误分类点越少,误分类点离超平面越近,损失数值就越小

1.1 感知机模型

感知机模型
其中 s i g n sign sign符号函数,即
sign符号函数
感知机模型可以先将 w ∗ x + b w*x+b wx+b看作线性模型,其中w为权值向量,b为偏置。然后将线性模型输出的结果代入 s i g n sign sign符号函数中,输出对应的类别。

1.2 学习策略

损失函数:误分类点到超平面( w x + b = 0 wx+b=0 wx+b=0)的总距离。

那么任意一点到超平面的距离为:

在这里插入图片描述
其中 ∣ ∣ w ∣ ∣ ||w|| w w w w l 2 l_2 l2范数。

由于,对于误分类点来说:

在这里插入图片描述
因此,任意误分类点到超平面的距离为:
在这里插入图片描述
那么,所有误分类点到超平面的总距离为:

在这里插入图片描述
这里我们不考虑 1 ∣ ∣ w ∣ ∣ \frac{1}{||w||} w1,所以得到了我们需要的损失函数:
在这里插入图片描述
所以我们需要使得损失函数最小,使用梯度下降得到模型需要的最优参数。

二、感知机原始模式

梯度下降的细节就不多说了,这里我们需要使得模型的损失函数值最小,从而得到模型参数"w,b",那么只需要对损失函数公式对应求偏导,然后根据梯度下降和下面的算法求得模型的最优参数。
在这里插入图片描述

2.1 原始模式算法实现

# 感知机算法实现
import numpy as np
import time
# 定义时间装饰器
def timmer(func):
    def wrapper(*args,**kwargs):
        start_time = time.time()
        res = func(*args, **kwargs)
        stop_time = time.time()
        print('Func %s,run time :%s' %(func.__name__,stop_time-start_time))
        return res
    return wrapper

class Perceptron:
    def __init__(self):
        self.weights=None
        self.bias=None

    def sign(self,value):
        return 1 if value>=0 else -1
    @timmer
    def train(self,dataSet,labels,iter=50):
        # 学习率
        lr=0.9
        dataSet = np.array(dataSet)
        n,m = np.shape(dataSet)

        # 初始化参数
        w = np.zeros(m)
        b=0

        # 迭代
        for k in range(iter):
            print("Round{0}:{1}".format(k,iter))
            # 使用随机梯度下降
            for i in range(n):
                if (-labels[i]*self.sign(np.dot(w,dataSet[i])+b)>=0):
                    w=w+lr*labels[i]*dataSet[i]
                    b=b+lr*labels[i]
        self.weights=w
        self.bias=b

    def predict(self, data):
        if (self.weights is not None and self.bias is not None):
            return self.sign(np.dot(self.weights, data) + self.bias)
        else:
            return 0

if __name__ == '__main__':
    data_set = [[3, 3],
                [4, 3],
                [1, 1]]
    labels = [1, 1, -1]

    perceptron = Perceptron()
    perceptron.train(data_set, labels,30)
    print("weights is:", perceptron.weights)
    print("bias is:", perceptron.bias)
    result = perceptron.predict([3, 3])
    print("prediction:", result)

猜你喜欢

转载自blog.csdn.net/weixin_41044112/article/details/108513620