感知器代码
程序说明
sign_p.m文件实现sign函数,输入小于等于0,输出-1,输入大于0,输出1。
perceptron.m为主函数,实现感知器。学习速率还未使用。
程序思想见台大机器学习基石第二周课程的笔记。
perceptron.m
%perceptron感知器的代码实现
n=0.2 %学习速率
p=[-9,1,-12,-4,0,5;15,8,4,5,11,9] %输入向量x1,x2
p=[ones(1,6);p]%加上x0=1后的输入向量
y=[-1,1,-1,-1,-1,1]%期望的分类结果,即真实的分类结果,正样本+1,负样本-1
%初始点的分类情况图像
figure;
plot([-9,-12,-4,0],[15,4,5,11],'o')%第一类用o表示
hold on;
plot([1,5],[8,9],'*')%第二类用*表示
axis([-13,6,-10,16])
legend('第一类','第二类')%图例
w0=[0,0,0]%初始权值向量
%由于[0,0,0]不代表任何直线
%用[0,0,0]加上第一个点的标签*第一个点的向量,代表w1
w1=w0+(y(1)*p(:,1))'
w=w1
flag=1
while(flag)
flag=0
for i=1:6
%如果实际预测值和真实值不同,就修正w
%只要修正过w,就要重设flag=1,表示还要重头再循环一次
if y(i)~=sign_p(w*p(:,i));
w=w+(y(i)*p(:,i))'
%每次修正画个图(如果w(3)=0,该条分隔线画图会出错,
%但不影响以后的分隔线,只要最终结果的w(3)不为0,就没事)
x1=-13:0.2:6
x2=(-w(2)*x1)/w(3)-w(1)/w(3)
b=plot(x1,x2)%保存为图形句柄,以后可以删除
pause;
delete(b)%删除前面一条分隔线的图形句柄
flag=1
end
end
end
%画出最终的分隔线
x1=-13:0.2:6
%由w(1)*1+w(2)*x1+w(3)*x2=0解出x2
x2=(-w(2)*x1)/w(3)-w(1)/w(3)
plot(x1,x2)
sign_p.m
%sign函数的实现:
%输入大于0 y=1,输入小于等于0,y=-1
function y=sign_p(x)
if(x>0)
y=1
else
y=-1
end