numpy实现单层感知机

感知机原理:利用超平面对数据进行二分类。

损失函数:y*(wx+b)。大于0则判断成功否则判断失败。

通过梯度下降法优化损失函数。

机器学习就是分析数据,找到一种能解决你需求的函数关系。

目标感知机:x1+2*x2+3*x3+4*x4+5

代码部分:

引入numpy库:

import numpy as np   

构建数据:

train=np.random.randint(-300,300,(128,4))//生成范围在-300到300,128个4维度数据。
test=np.random.randint(-300,300,(30,4))
w=[1,2,3,4]//目标感知机权值
train_lable=np.dot(train,w)+5//求标签
test_lable=np.dot(test,w)+5
train_lable=train_lable>0//判断结果是否在超平面上,如果在上边为真
train_lable=train_lable.astype(int)//将布尔型变为0和1,真变为1,假变为0
train_lable=train_lable*2-1//乘2-1后1*2-1=1.0*2-1=-1
test_lable=test_lable>0
test_lable=test_lable.astype(int)
test_lable=test_lable*2-1
train=train.astype(float)//变为浮点型便于归一化
test=test.astype(float)
for i in range(4):
    train[:,i]=(train[:,i]-train[:,i].mean())/train[:,i].std()//进行归一化处理,否则数据影响参数学习
for i in range(4):
    test[:,i]=(test[:,i]-test[:,i].mean())/test[:,i].std()
进行训练:
for i in range(30):
    sum=0
    for j in range(128):
        out=np.dot(train[j],w1)+b1
        if out*train_lable[j]<=0://如果输出和标签不是同号表示输出错误,进行梯度下降法
            w1[0]=w1[0]+x*train_lable[j]*train[j,0]
            w1[1]=w1[1]+x*train_lable[j]*train[j,1]
            w1[2]=w1[2]+x*train_lable[j]*train[j,2]
            w1[3]=w1[3]+x*train_lable[j]*train[j,3]
            b1=b1+x*train_lable[j]
            sum=sum-out*train_lable[j]//记录损失值
    print("损失函数值:",sum)
进行测试:
sum=0
for i in range(30):
    out=np.dot(test[i],w1)+b1
    if out*test_lable[i]<0:
        sum=sum+1
print(sum)
print(w1,b1)
posted @ 2021-07-28 22:52  祥瑞哈哈哈  阅读(134)  评论(0编辑  收藏  举报