PLA算法matlab程序 & 神经网络工具箱的使用

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_27008079/article/details/68938859

最近看了台湾大学林轩田老师的公开课视频,作为机器学习的入门者,记录下来以供查阅。

问题模型

这里写图片描述
threshold表示界限值。
sign(x)根据x大于0和小于0分别取+1和-1。

这里写图片描述
将-threshold作为w0 也就是作为 w⃗  的第一个分量。

因此我们需要求出 w⃗  通过给定的训练值 x⃗ 

PLA算法

这里写图片描述
错误分为两种。

  1. wTtxn(t)>0 yn(t)=1 ,如下图, 更新 wt+1=wtx
    这里写图片描述

  2. wTtxn(t)<0 yn(t)=1 ,如下图,更新 wt+1=wt+x
    这里写图片描述

总结情况如下图
这里写图片描述

以上算法在数据线性可分时必收敛。

matlab程序

先随机数据 ϵ[0,10] ,随机y为{1, -1}控制点为圆圈或叉。

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

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');

这里写图片描述

黑色的线为第二次画的线,可以看出这两条线都将圆圈和叉分开了

猜你喜欢

转载自blog.csdn.net/qq_27008079/article/details/68938859