感知机模型简介与Python实现

感知机模型简介与Python实现

介绍

感知机是一个线性二分类模型,该模型是SVM和神经网络的基础。假设输入空间为X特征向量,输出空间为y={+1,-1},从输入空间到输出空间函数可以表示为:
f ( x ) = s i g n ( W T + b ) f(x)=sign(W^T+b) f(x)=sign(WT+b)
对于分类错误的点 ( X e , y e ) (X_e,y_e) (Xe,ye)有:
− y e ( W T X e + b ) > 0 -y_e(W^TX_e+b)>0 ye(WTXe+b)>0
该点到分割平面的距离可以表示为:
1 ∣ ∣ ∣ W ∣ ∣ y e ( W T X e + b ) \frac{1}{|||W||}y_e(W^TX_e+b) W1ye(WTXe+b)
将所有判断错误的点到分割面距离和作为损失函数:
1 ∣ ∣ ∣ W ∣ ∣ ∑ i = 0 k y i ( W T X i + b ) \frac{1}{|||W||}\sum_{i=0}^ky_i(W^TX_i+b) W1i=0kyi(WTXi+b)
上述损失函数可以采用梯度下降法进行求解。

代码

import numpy as np
import matplotlib.pyplot as plt


def GradientMethod(ErrorList,w_t,b_t,Traing):
    b_t=b_t+Traing*(ErrorList[1])
    for k in range(X_range):
        w_t[k]=w_t[k]+Traing*((ErrorList[0][k]*ErrorList[1]))
    return w_t,b_t

   

def main(TrainNum,Test,X_range,w,b,TrainingRat):
    for z in range(TrainNum):    
        for i in Test:
            y_test=0
            sum_test=0
            for j in range(X_range):
                sum_test+=i[0][j]*w[j,0]
            y_test=sum_test+b
            if y_test*i[1]<=0:
                w,b=GradientMethod(i,w,b,TrainingRat)
    return w,b

if __name__=="__main__":
    #测试数据
    Test=[[(3,3),1],[(4,3,),1],[(1,1,),-1]]
    X_range=len(Test[0][0])

    # 初始化    
    w=np.zeros((X_range,1))
    b=0
    TrainingRat=1
    TrainNum=int(input("输入迭代次数")) 
    w,b=main(TrainNum,Test,X_range,w,b,TrainingRat)

    #结果可视化
    for i in Test: 
        if i[1]>0:
            plt.plot(i[0][0],i[0][1] ,'bo')
        elif i[1]<0:
            plt.plot(i[0][0],i[0][1], 'rx')
    x_2_max=-((w[0]*5+b)/w[1])
    x_2_min=-((w[0]*0+b)/w[1])
    plt.plot([0,5],[x_2_min,x_2_max])
    plt.axis([0, 5, -6, 6])
    plt.grid(True)  
    plt.xlabel('x_1')
    plt.ylabel('x_2')
    plt.show()

在这里插入图片描述
内容参考了《统计学习方法》

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值