感知机是二类分类的线性分类模型,其输入为实实例的特征向量,输出是实例的类别,两类分别取+1和-1。
输入空间到输出空间的函数为:f(x) = sign(w*x+b)
其中w,b感知机模型参数,w是权值(权向量),b是偏置,w*x是w和x的内积。sign是函数符号,输入为正时输出+1,输入为负时,输出为-1.
感知机是一种线性分类模型,属于判别模型。感知机模型的假设空间是定义在特征空间中的所有线性分类模型或线性分类器。
感知机的分类面: w*x+b = 0 是对应于特征空间的一个超平面S,其中W是超平面法向量,b是超平面截距,这个超平面将特征空间化为两半,每一边代表一类。
在训练感知机的时候首先初始化w,b,然后使用误分点来驱动超平面的更新
当一个x(i)被误分时,通过 w = w+L*y(i)*x(i) , b = b+L*y(i) 来更新w,b. 其中L是学习的步长(0
这里在matlab中产生两类(X和Y,各60个点)高斯分布的点,通过感知机算法来寻找一个分类面。
load gaoData2;
x1 = x; %第一类点
x2 = y; %第一类点
plot(x1(1,:),x1(2,:),'ro',x2(1,:),x2(2,:),'b*');hold on
y1 = ones(1,60);
y2 = -ones(1,60);
x = [x1 x2]; %实例输入点
y = [y1 y2]; %对应的输出
w = [0 0]; %初始化
b = 0;
itary = 0.05; %步长
cont = 0;
cont1 = 0;
cont2 = 0;
tic; %给出程序在tic,toc之间程序运行时间
for j = 1:50000 %设定循环次数,避免数据不是线性可分时陷入死循环
for i = 1:size(x,2)
panbie = y(i)*(w*x(:,i)+b);
if sign(panbie)>=1
cont = cont+1;
else w = w+itary*y(i)*x(:,i)';
b = b+itary*y(i);
cont1 = cont1+1;
end
end
if cont>=size(x,2) %全部分类正确则跳出循环
break;
end
cont = 0;
cont2 = cont2+1;
end
u1 = min(x(1,:)):max(x(1,:));
u2 = -((w(1)/w(2))*u1+b/w(2));
w %最终的权值向量
b
cont1
cont2
time1 = toc
plot(u1,u2,'g');hold off
程序运行结果: