感知机
本篇是对李航的统计学习方法的第二章感知机的学习之后的练习,练习和代码如下
1. 写python程序,输出书里的表2.1,绘制每一步的样本和超平面
输入为一个csv文件
导入需要的库
import numpy as np
import matplotlib.pyplot as plt
输入数据采用读取csv文件的方式,内容如上所示
x=[]
y=[]
f = open('example2.1.csv', 'r')
for line in f.readlines():
curLine = line.strip().split(',')
x.append([int(curLine[0]),int(curLine[1])])
y.append(int(curLine[2]))
x=np.array(x)
y=np.array(y)
def perceptron(x,y):
w = np.zeros(x.shape[1])
b = 0
n = 1
flag=0
num=0
while flag == 0:
flag=1
for i in range(len(y)):
if y[i]*(np.dot(w,x[i])+b)<=0:
w = w + n * y[i] * x[i]
b = b + n * y[i]
flag=0
num+=1
print(num,'x'+str(i+1),w,b,f'{int(w[0])}x(1)+{int(w[1])}x(2)+({b})')
show(x,w,b)
def show(x,w,b):
plt.xlim(0, np.max(x.T[0]) + 1)
plt.ylim(0, np.max(x.T[1]) + 1)
plt.scatter(x[:,0], x[:,1])
if w.all()==0:
plt.plot([0, b], [b, 0])
elif w[0]==0:
plt.plot([0, 0], [-b / w[1], 0])
elif w[1]==0:
plt.plot([0, -b / w[0]], [0, 0])
else:
plt.plot([0,-b/w[0]],[-b/w[1],0])
plt.show()
//对每次迭代的结果进行可视化输出
perceptron(x,y)
2. 编程求表2.2,输出每一步的中间结果
导入需要的库
import numpy as np
输入数据采用读取csv文件的方式
x=[]
y=[]
f = open('example2.1.csv', 'r')
for line in f.readlines():
curLine = line.strip().split(',')
x.append([int(curLine[0]),int(curLine[1])])
y.append(int(curLine[2]))
x=np.array(x)
y=np.array(y)
def perceptron(x,y):
a = np.zeros(x.shape[0]).T
g = np.dot(x,x.T)
b = 0
n = 1
flag=1
while flag == 1:
flag=0
for i in range(len(y)):
if y[i]*((a*y@g[i])+b)<=0:
b = b + n * y[i]
a[i] = a[i] + n
flag=1
print('x'+str(i+1),a,b)
perceptron(x,y)