感知机思维导图如下:
感知机学习算法的对偶形式的实现:
import numpy as np
# 采用感知机学习算法的对偶形式实现
class PerceptronDual:
def __init__(self): #初始化函数,初始化w,b
self.weights = None
self.bias = None
def sign(self, x): # sign function 判断正负的函数
return 1 if x >= 0 else -1
def train(self, data_set, labels): #训练函数,求w和b
lr = 1
n = np.array(data_set).shape[0] #n means rows行数,即有几个数据
#print("n=",n)
#print(data_set)
data_set = np.mat(data_set) #mat函数将数组转换为矩阵,
#print("data_set=",data_set)
alpha = np.zeros(n) #alpha means the total iteration of wrong point 构造[0,0,0]
#print("alpha=",alpha)
bias = 0
i = 0
#print(data_set[1])
#print(data_set[1].T)
while i < n:
#in this step, we elide gram matrix
#T函数是将矩阵进行转置
if (labels[i] * self.sign(sum(alpha * labels * data_set * data_set[i].T)+bias) == -1):
alpha[i] = alpha[i] + lr #更新a
bias = bias + lr * labels[i] #更新b
i = 0
else:
i += 1
self.weights = sum(alpha * labels * data_set)
#print(self.weights)
self.bias = bias
#print(self.bias)
def predict(self, data): # 判断W*x+b的正负
data = np.array([data])
if (self.weights is not None and self.bias is not None):
return self.sign((self.weights * data.T) + self.bias)
else:
return 0
if __name__ == '__main__':
data_set = [[3, 3],
[4, 3],
[1, 1]]
labels = [1, 1, -1]
perceptron = PerceptronDual()
perceptron.train(data_set, labels)
print("w=",perceptron.weights)
print("b=",perceptron.bias)
result = perceptron.predict([3, 3])
print("判断结果:",result)
算法运行结果:
w= [[1. 1.]]
b= -3
判断结果: 1
本人水平有限,本博客只是个人学习的记录。其中,不免有许多不足和错误遗漏之处。希望读者在阅读学习的过程中有任何疑问或者希望本人改善的地方,请留言告知。谢谢!