我们在上篇笔记中介绍了感知机的理论知识,讨论了感知机的由来、工作原理、求解策略、收敛性。这篇笔记中,我们亲自动手写代码,使用感知机算法解决实际问题。
先从一个最简单的问题开始,用感知机算法解决OR逻辑的分类。
import numpy as np
import matplotlib.pyplot as plt
x = [0,0,1,1]
y = [0,1,0,1]
plt.scatter(x[0],y[0], color="red",label="negative")
plt.scatter(x[1:],y[1:], color="green",label="positive")
plt.legend(loc="best")
plt.show()
下面我们来定义一个函数,用来判定一个样本点是否被正确分类了。由于此例中样本点是二维的,因此权重向量也相应的为二维,可以定义为$w = (w_1, w_2)$,在Python中可以使用列表来表达,例如`w = [0, 0]`,而样本到超平面的距离自然就是`w[0] * x[0] + w[1] * x[1] +b`。下面给出完整的函数。
def decide(data,label,w,b):
result = w[0] * data[0] + w[1] * data[1] - b
print("result = ",result)
if np.sign(result) * label <= 0:
w[0] += 1 * (label - result) * data[0]
w[1] += 1 * (label - result) * data[1]
b += 1 * (label - result)*(-1)
return w,b
写完核心函数后,我们还需要写一个调度函数,这个函数提供遍历每一个样本点的功能。
def run(data, label):
w,b = [0,0],0
for epoch in range(10):
for item in zip(data, label):
dataset,labelset = item[0],item[1]
w,b = decide(dataset, labelset, w, b)
print("dataset = ",dataset, ",", "w = ",w,",","b = ",b)
print(w,b)
data = [(0,0),(0,1),(1,0),(1,1)]
label = [0,1,1,1]
run(data,label)result = 0
dataset = (0, 0) , w = [0, 0] , b = 0
result = 0
dataset = (0, 1) , w = [0, 1] , b = -1
result = 1
dataset = (1, 0) , w = [0,