Rosenblatt感知机-神经网络与机器学习笔记1

一、Rosenblatt感知机小结

感知机模型
这里写图片描述
输入向量: x(n)=[+1,x1(n),x2(n),...,xm(n)]T
权重向量: w(n)=[b,w1(n),w2(n),...wm(n)]T
当输入向量线性可分时,我们需要寻找到一个合适的w,正确地分开两类数据
wTx>0 时,x属于分类1
wTx0 时,x属于分类-1
这里写图片描述
选取符合函数sign(x)为硬限幅函数,我们的模型可以描述为

y=sign(wTx)

所以训练过程可描述如下:
x(n):输入向量
w(n): 权重向量
y(n):模型产生的响应
d(n):期望的响应
eta:学习速率

初始化w=[0; 0; ...0];
for i = 1 :N//批次循环N次
        for j = 1 : n//遍历一次样本,n为样本个数
            y(j) = sign(w * x(j));
            w = w + eta * (d(j) - y(j)) * x(j)//调整权重        
        end
        计算均方差;
end

二、代码实现

1.产生随机数

产生两类半圆形数据,参数r,dr,d如下图所示

这里写图片描述

matlab代码如下

function [x1,y1,x2,y2] = GenRandomData(r, d,dr, n1, n2)
if nargin<4
    r=1;
    d=1;
    n1=100;n2=100;
end
dr1=rand([n1,1])*dr;theta1=rand([n1,1])*pi;
dr2=rand([n2,1])*dr;theta2=-rand([n2,1])*pi;
x1=(r-dr/2+dr1).*cos(theta1);
y1=(r-dr/2+dr1).*sin(theta1);
x2=r+(r-dr/2+dr2).*cos(theta2);
y2=-d+(r-dr/2+dr2).*sin(theta2);
end

2.Rosenblatt感知机

function [w, err] = Rosenblatt(x,d,w0,etaLim,epochN)
%x: m x n, m: feature numbers, n: sample numbers
isPlotLine = 1;%是否画出拟合中曲线的变化
if isPlotLine
    figure;
    plot(x(2, d == 1),x(3, d == 1),'LineStyle','none','Marker','x','Color','r');
    hold on;
    plot(x(2, d == -1),x(3, d == -1),'LineStyle','none','Marker','o','Color','b');
end
[m,n] = size(x);    
MSEarr = [];w = w0;epochi = 0;
%训练速率eta采用线性退火
eta=linspace(etaLim(1),etaLim(2),epochN);
while epochi < epochN
    epochi=epochi + 1;
    for i=1:n
         y= sign(w'*x(:,i));
         w=w + eta(epochi)*(d(i)-y)*x(:,i);  
    end
    yarr = sign(x'*w);
    MSE = sum((d-yarr).^2);
    MSE = sqrt(MSE/n);
    MSEarr = [MSEarr MSE];
    if isPlotLine
        xx = -10:0.1:10;
        yy=-w(2,1) * xx/w(3,1)-w(1,1)/w(3,1);
        plot(xx,yy);
    end
end
yarr = sign(x'*w);
errN=sum(yarr~=d);
err=errN/n;
figure;plot(MSEarr);title('MSE');
end

3.代码测试

close all;
%产生随机数
n1=1000;n2=1000;n=n1+n2;
[x1,y1,x2,y2]=GenRandomData(8,1,3,n1,n2);
samps=[ones(n1,1),x1, y1;ones(n2,1),x2,y2];
d=[ones(n1,1);-ones(n2,1)];
%打乱顺序
randI=randperm(n);
samps(randI,:)=samps(1:n,:);
d(randI)=d(1:n);
%利用感知机进行训练
w0 = [0;0;0];etaLim = [1e-3 1e-5];x = samps';epochN = 50;
[w, err] = Rosenblatt(x,d,w0,etaLim,epochN)
%画图
figure;
plot(x1,y1,'Marker','x','Color','r','LineStyle','none');
hold on;
plot(x2,y2,'Marker','o','Color','b','LineStyle','none');
xx=[-10:0.1:10];
yy=-w(2,1)*xx/w(3,1)-w(1,1)/w(3,1);
plot(xx,yy,'k');

当两个半圆距离为4时,均方差开始就很小。
这里写图片描述
这里写图片描述

当两个半圆距离为0时,均方差震荡了一段时间开始收敛,最后结果有较小的错误率err =5.000000000000000e-04
最后分类结果
迭代过程
误差

当两个半圆距离为-4时,均方差一直震荡,最后错误率err=0.195500000000000
这里写图片描述
这里写图片描述
这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值