最近看了台湾大学林轩田老师的公开课视频,作为机器学习的入门者,记录下来以供查阅。
问题模型
threshold表示界限值。
sign(x)根据x大于0和小于0分别取+1和-1。
将-threshold作为w0 也就是作为
因此我们需要求出
PLA算法
错误分为两种。
wTtxn(t)>0 但yn(t)=−1 ,如下图, 更新wt+1=wt−x
wTtxn(t)<0 但yn(t)=1 ,如下图,更新wt+1=wt+x
总结情况如下图
以上算法在数据线性可分时必收敛。
matlab程序
先随机数据
x0 = ones(20, 1);
x1 = rand(20, 2)*10;
x = [x0, x1];
test = rand(20, 1);
y = ones(20, 1);
for i=1:20
if x1(i, 1)>6
y(i) = -1;
end
end
j=1;
for i=1:20
if y(i)==-1
u(j) = x1(i, 1);
v(j) = x1(i, 2);
j = j+1;
end
end
scatter(u, v, 'or');
hold on;
j=1;
u=[];
v=[];
for i=1:20
if y(i)==1
u(j) = x1(i, 1);
v(j) = x1(i, 2);
j = j+1;
end
end
scatter(u, v, 'xk');
hold on;
通过改错更新
w = [0, 0, 0];
while true
pd = false;
for i=1:20
t = x(i, :);
if w*t'*y(i)<=0
w = w + y(i)*t;
pd = true;
break;
end
end
if pd == false
break;
end
end
w
v = linspace(0, 10, 100);
u = -w(3)/w(2)*v - w(1)/w(2);
plot(u, v, '.');
matlab神经网络工具箱使用
以上的算法也可通过神经网络工具箱中单层感知元建立来完成。
net = newp(P, T);//创建一个感知器
其中P是一个R*2矩阵,其中R为感知器网络中输入向量的维数。
矩阵的每一行代表输入向量没个分量取值范围。
T是输出节点个数。
net = train(net, P, T);//训练感知器网络
P是R*Q矩阵,每一列是一个输入向量。
T是网络期望输出,S*Q矩阵,每一列是一个输出向量。
具体程序如下。
t = 1;
y(y==-1)=0;
net = newp([0, 10; 0, 10], t);
net = train(net, x1', y');
newt = sim(net, x1');
iw = net.iw;
b = net.b;
ww = [b{1}, iw{1}];
vv = linspace(0, 10, 100);
uu = -ww(3)/ww(2)*v - ww(1)/ww(2);
plot(uu, vv, '.k');
黑色的线为第二次画的线,可以看出这两条线都将圆圈和叉分开了