感知机是二类分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1 二值。感知机对应输入空间中将实例划分为正负两类的分离超平面,属于判别模型。感知机学习旨在求出将训练数据进行线性划分的分离超平面。为此,导入基于误分类的损失函数,利用梯度下降法对损失函数进行极小化,求得感知机模型。感知机是神经网络和支持向量机的基础。
import numpy as np
"""感知机学习算法的原始形式"""
def Perceptron(x, y, delta = 1, maxIter=100):
w = np.zeros(x.shape[1])
b = 0
iter = 0
while (iter<maxIter):
flag = True
for i in range(len(x)):
if y[i]*(np.dot(w, x[i]) +b)<=0:
flag = False
w = w + delta*y[i]*x[i]
b = b + delta*y[i]
if flag == True:
break
print("iteration number %d" % iter)
iter += 1
return w, b
w, b =Perceptron(np.array([[3,3],[4,3],[1,1], [3,4]]), np.array([1,1,-1,-1]), delta=1)
print(w,b)
"""感知机学习算法的对偶形式"""
def Perceptron1(x, y, delta = 1, maxIter=100):
alpha = np.zeros(x.shape[0])
b = 0
iter = 0
while (iter<maxIter):
flag = True
for i in range(len(x)):
w = np.sum((alpha*y*x.T).T, axis=0)
if y[i]*(np.dot(w, x[i])+b)<=0:
flag = False
alpha[i] = alpha[i] + delta
b = b + delta*y[i]
if flag == True:
break
print("iteration number %d" % iter, alpha, b)
iter += 1
return alpha, b
x = np.array([[3,3],[4,3],[1,1]])
y = np.array([1,1,-1])
alpha, b =Perceptron1(x, y, delta=1)
print(np.sum((alpha*y*x.T).T, axis=0),b)