感知机


文章目录

1.概述
2.损失函数定义
3.算法
4.代码实现

概述

感知机(perceptron)
感知机算法可以说是最简单的二分类模型了,属于有监督学习。
模型的输入是 x \subset R^n ,其输入为实例的特征向量,对输入样本的假设是线性可分的,即存在一个超平面可以将所有样本点分成两类,其输入为实例的特征向量,输出为实例的类别,取+1、-1。利用数学语言抽象模型可以这样描述:由输入空间到输出空间满足如下函数: f(x) = sign(w*x + b) 其中w是权重(weight),b是偏置(bias)

感知机模型

感知机学习的目标就是找到这样的一组参数 w 和 b 使得将数据的样本点全部正确分开。


损失函数的定义

符号规定
数据集 T = \{(x_1,y_1),(x_2,y_2,...,(x_n,y_n))\}
输入 x_i \in X = R^n ,y_i \in \{-1,+1\},i = 1,2,...,N
输出 f(x) = sign(w*x + b)

任一输入样本x_i到超平面S的距离:\frac{1}{||w||}|wx_i + b|
对于错误分类样本(x_i,y_i)来说到超平面距离为-\frac{1}{||w||}y_i|wx_i + b|
假设所有分类错误样本集合M,所有分类错误样本到超平面S的总面积为-\frac{1}{||w||}\sum _{x \in M}y_i|wx_i + b|
不考虑-\frac{1}{||w||},就得到感知机模型的loss function:L(w,b) =- \sum _{x \in M}y_i|wx_i + b|M是错误分类点的集合


算法

原始形式

有了损失函数,我们就要对感知机模型转化为求损失函数的最优化问题,使loss function最小,具体采用随机梯度下降(SGD),用梯度下降法不断迭代使得w和b一步步优化loss function。
(1)首先随机选择初值w0,b0。
(2)选取训练集中的一个数据(x_i,y_i)
(3)对于每一个错误分类的点,更新其权重:w \leftarrow w +\eta y_ix_i b\leftarrow b + \eta y_i
(4)回到第2步,直到达到一定次数或者全部分类正确为止

代码实现

class _Perceptron():
    def __init__(self,learning_rate = 1):
        self.learning_rate = learning_rate
        self.w = None
        self.b = 0
    
    def fit(self,x,y):
        n = 0
        self.w = np.zeros(len(x[0]))
        while True:
            n += 1
            count = 0
            for i in range(len(x)):
                if y[i]*(np.dot(self.w,x[i]) + self.b) <= 0 :
                    count += 1
                    print('w:',self.w,'  b:',self.b)
                    self.w = self.w + self.learning_rate * y[i] * x[i]
                    self.b = self.b + self.learning_rate * y[i]
            if count == 0 or n == 1000:
                print("收敛")
                print('迭代次数: ',n)
                break
    
    def predict(self,x):
        y = np.zeros(len(x))
        for i in range(len(x)):
            if np.dot(self.w ,x[i]) + self.b > 0:
                y[i] = 1
            else :
                y[i] = -1
        return y
if __name__ == 'main':
    x = np.array([[3,3],[4,3],[1,1]])
    y = np.array([1,1,-1])
    model = _Perceptron(learning_rate=0.1)
    model.fit(x,y)
    model.predict([[1,0]])

结果如下


image.png
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。