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)