称为感知机。其中,参数w叫做权值向量weight,b称为偏置bias。w⋅x表示w和x的点积
sign为符号函数,即
中间的直线即w⋅x+b=0这条直线。
感知机学习算法={原始形式和对偶形式}
1,1,-1
0,1,-1
3,3,1
4,3,1
2,0.5,-1
3,2,1
4,4,1
1,2,-1
"""
# -*- coding: utf-8 -*-
"""
Created on Fri Dec 8 14:24:10 2017
@author: jasonhaven
"""
import numpy as np
import matplotlib.pyplot as plt
def sign(x,w,b):
'''
x:特征向量
y:标记
w:权值向量
b:偏置
功能:计算 y=w*x+b
'''
y=np.dot(x,w)+b#返回只有一个元素的ndarray
return int(y)
def train(X,Y,w,b,yita):
'''
X:n维特征向量
y:n维标记向量
w:权值向量初始
b:偏置初始
yita:学习率
功能:训练模型,计算优化模型参数(感知机算法的原始形式)
'''
flag = False #损失函数是否最小
while not flag:
count_error=0
for i,xi in enumerate(X):
yi=Y[i]
signy=sign(xi,w,b)
if signy*yi<=0:
w+=(yita*yi*xi).reshape(w.shape)
b+=yita*yi
count_error+=1
if count_error==0:
flag=True
return w,b
def draw(train_datas,sign_of_train_datas,w,b):
plt.figure('percetron')
#设置横坐标
x=np.linspace(0,6,100)
#w[0]*x[0]+w[1]*x[1]+b=0
#计算函数值
y=-(w[0]*x+b)/w[1]
#绘制函数
plt.plot(x,y,color='r')
#绘制数据集
for i in range(len(train_datas)):
if(sign_of_train_datas[i]==1):
plt.scatter(train_datas[i][0],train_datas[i][1],s=100)
else:
plt.scatter(train_datas[i][0],train_datas[i][1],marker='x',s=100)
plt.title('percetron')
plt.xlabel('x')
plt.ylabel('y')
plt.show()
def read_from_csv():
file='./data.csv'
content=np.loadtxt(file,delimiter=',')
train_datas=[]
sign_of_train_datas=[]
for line in content:
train_datas.append(line[0:2])
sign_of_train_datas.append(line[-1:])
return train_datas,sign_of_train_datas
if __name__=='__main__':
#数据集
#train_datas=[[3,3],[4,3],[1,1],[2,3],[4,5],[1,2]]
#ign_of_train_datas=[1,1,-1,1,1,-1]
train_datas,sign_of_train_datas=read_from_csv()
#构造输入实例
X=np.array(train_datas)
Y=np.array(sign_of_train_datas)
#设置初始w0,b0
w0=np.zeros((X.shape[1],1))
b0=0
#设置学习率
yita=1
#训练模型
w,b=train(X,Y,w0,b0,yita)
print(w,b)
draw(train_datas,sign_of_train_datas,w,b)