感知机理论用于线性可分数据集分类+例题计算+编程实现

一、感知机原理
简单来说就是给定一组数据集(以二维为例),在二维平面上求出一根直线将标记好的数据集分为两类,直线一边为一类,另一边为另一类。
感知机模型
例如给定一个数据集:
在这里插入图片描述
其中:
在这里插入图片描述
此时假设分类直线的函数为:
在这里插入图片描述
如果分类正确,那么对于所有y=1的实例i,有:
在这里插入图片描述
对于所有y=-1的实例i,有:
在这里插入图片描述
那么误分类就是:
在这里插入图片描述
这个数据集中某个实例到分类超平面的距离为:
在这里插入图片描述
误分类点到分类超平面的总距离为:
在这里插入图片描述
故感知机的损失函数为:
在这里插入图片描述
求参数w,b,使其为以下损失函数极小化问题的解:
在这里插入图片描述
采用梯度下降法来求解:
在这里插入图片描述
随机选择误分类点对w和b进行更新(梯度的反方向就是下降最快的方向):
在这里插入图片描述
在这里插入图片描述

(二)例题计算
例题:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
(三)编程计算

import numpy as np

import matplotlib.pyplot as plt


#将数据保存成字典的形式
train_data_set = {-1:np.array([[1,1]]),
                 1:np.array([[3,3],
                             [4,3]])}
data_color={-1:'r',1:'b'}




def train(data):
    rate=1  #学习速率
    w=np.array([0,0]) #斜率
    b=0  #截距
    optimize1=True
    while optimize1:
        a=0
        exit_flag1=True
        for i in data:           #i=1或-1
            for j in data[i]:
                if  i*(np.dot(j,w)+b) <=0:
                    w=w+rate*j*i
                    b=b+rate*i
                    
                    exit_flag1=False
                    break   #跳出内层for循环
                else:
                    a=a+1
            if not exit_flag1:
                break       #跳出外层for循环,进入内层的while循环
        
        if a==3:   #样本的容量,代表所需循环的次数,意思是只有当不再出现分类错误的现象才能退出while
            break

   
            
            
    
    return w,b


w_t,b_t=train(train_data_set)
print("w0=",w_t[0])
print("w1=",w_t[1])
print("b=",b_t)

运行结果:
w0= 1
w1= 1
b= -3

发布了26 篇原创文章 · 获赞 11 · 访问量 1541

猜你喜欢

转载自blog.csdn.net/comli_cn/article/details/101639573