感知机 (Perceptron) 是二分类的线性分类模型;感知机学习旨在求出将训练数据进行线性划分的分离超平面。
1、感知机模型:
f(x)=sign(θ∗x+b) , 其中, sign(z)={+1−1z >= 0z<0
其中:
θ
和
b
是感知机参数模型,
2、损失函数
选择依据:误分类点到分类超平面 S 的总距离。
样本点
对于误分类的点 (xi, yi) , 有当 θ∗xi+b>0 时, yi<0 ; 当 θ∗xi+b<0 时, yi>0 ,所以有:
−yi(θ∗xi+b)>0
误分类点到分离超平面的
S
的距离是:
针对所有的样本,所有的误分类点到分类超平面的
S
的总距离是:
当不考虑 1||θ|| 时,可得感知机学习的损失函数是:
L(θ,b)=−∑xi∈Nyi(θ∗xi+b)
3、参数优化
感知机学习算法是误分类驱动的,采用梯度下降法进行参数优化, α 为学习率。
∂L(θ,b)∂θ=−∑xi∈Nyixi
∂L(θ,b)∂b=−∑xi∈Nyi
随机选取一个误分类样本点 (xi yi) ,对 θ b 进行优化:
θ=θ+αyixi
b=b+αyi .
代码测试:数据集
# -*- coding:utf-8 -*-
from numpy import *
import numpy as np
import pandas as pd
import matplotlib as mpl
import matplotlib.pyplot as plt
if __name__=="__main__":
print "hello world"
data = pd.read_csv("testSet.txt",delimiter='\t',header=None)
m,n = shape(data) # m 样本数目
x = mat(ones((m,n)))
for i in range(n-1):
x[:,i+1] = mat(data[i]).T
y = mat(data[[n-1]])
theta = mat(zeros((1,n)))
a = 0.001
for k in range(m):
if y[k] == 0: # 将 0 标签改为 -1
y[k] = -1
for i in range(1000):
for j in range(int(m)):
if y[j]*(theta*x[j].T)<=0:
theta = theta + a*y[j]*x[j]
print"theta\n", theta
x1_record = []; y1_record =[]
x2_record = []; y2_record =[]
for i in range(m):
if y[i] == 1:
x1_record.append(x[i,1])
y1_record.append(x[i,2])
else:
x2_record.append(x[i,1])
y2_record.append(x[i,2])
xc = arange(-4,4,0.1)
y_hat = (-theta[0,0]-theta[0,1]*xc)/theta[0,2]
mpl.rcParams['font.sans-serif'] = [u'SimHei'] # 这两行保证在图中可以加入汉字
mpl.rcParams['axes.unicode_minus'] = False
plt.figure()
plt.scatter(x1_record,y1_record,s=25,c='red')
plt.scatter(x2_record,y2_record,s=30,c='blue')
plt.plot(xc,y_hat)
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.title(u'感知机学习算法分类',fontsize =18)
plt.show()
注:在代码中 θ∗x+b=ω∗X , 其中 ω 是 n+1 维向量, X0=1 。
参考:
《统计学习方法》 李航