Perceptron感知机

感知机算法是一种二分类算法,使用到神经网络对数据进行一个线性分类,详细的算法原理见于博文http://www.cnblogs.com/kaituorensheng/p/3561091.html  ,以下是感知机算法的函数代码

%===============函数1,生成数据

function [data,weight,mu,sigma]=CreateSample(dim,M,N)
% % % 此代码用来生成满足高斯分布的样本数据
%输入:
%   dim :每个样本用一列表示,每一列有dim维,比如我们想要一个2维的样本,可以写成(3,4)';
%   M    :  代码生成的所有样本均来自M个高斯分布函数
%   N    :   所有样本的数量
%输出
%   data     : 大小为dim*N, 表示总共生成了N列样本,每个样本为一列中的dim个数字
%   weight :大小为1*M, 表示用来生成所有样本的M个高斯分布,每个高斯分布的权重,权重值越大生成的样本数越多
%   mu       :大小为dim*M, 这M个高斯分布的均值
%   sigma :大小为1:M ,这M个高斯分布的均方差

%首先,按照随机方式生成M个高斯分布的权重、方差、均值
weight=rand(1,M);
weight=weight/norm(weight,1);                  %对权重进行归一化,保证权重之和等于1
sigma=double(randi(10,1,M));                    %高斯分布的均方差在(1,10)之间选取
mu=double(round(randn(dim,M)*100));    %高斯分布的均值,正数或负数
%然后,按照上面权重weight的大小,确定这M个高斯分布包含的样本数量
n=zeros(1,M); 
for i=1:1:M
    if(i~=M)
        n(i)=floor(N*weight(i));
    else
        n(i)=N-sum(n);
    end
end
%最后,逐步构造每个高斯分布的n(i)个样本
data=[];
for i=1:1:M
    X=randn(dim,n(i));
    X=X.*sigma(i)+repmat(mu(:,i),1,n(i));
    data=[X,data];
end


%===============函数2,感知机函数

function [w,b]=Percep(data,rate)
% % 该算法的思路依照李航《统计学习机》中第2张内容编写
%-----输入:
%              data ,N*(dim+1),代表N个样本,每个样本的前dim维是特征向量,最后一维是类别
%-----输出:
%              w,b用于分类的神经网络的权重和偏移量

[N,M]=size(data);
dim=M-1;
% Step one: 初始化w  b
w=rand(dim,1);
b=0;
X=data(:,1:dim);
Y=data(:,M);
% 在当前初始化的w b情况下,对样本进行分类,并找出误分类的样本集合E
E=[];
for i=1:1:N
    x=X(i,:);
    y_real=Y(i);
    y_pred=Sig(x*w+b);
    if y_real*y_pred<0
        E=[E;x,y_real];
    end
end

while ~isempty(E)  %当误分类集合不为空
    [row,col]=size(E);
    X_E=E(:,1:(col-1));
    Y_E=E(:,col);
    % 从误分类集合中随机选取一个样本
    chos=randi([1,row],1);
    L=Y_E(chos)*Sig(X_E(chos,:)*w+b);%计算损失函数
    if L<0   %更新 w b
        w=w+rate*Y_E(chos)*X_E(chos,:)';
        b=b+rate*Y_E(chos);
    end
    
    %然后更新误分类样本集合E
    E=[];
    for i=1:1:N
        x=X(i,:);
        y_real=Y(i);
        y_pred=Sig(x*w+b);
        if y_real*y_pred<0
            E=[x,y_real];
        end
    end
end
    

%===============函数3,符号函数

function out=Sig(in)
% % 符号函数
% if in>=0,out=1  else out=-1;
if in>-0
    out=1;
else
    out=-1;
end


%===============函数4,演示函数

function Percep_demo
%用figure(1)绘制原始样本,绿色圆圈表示正样本,红色圆圈表示负样本
%用figure(2)绘制感知机的分类结果,绿色圆圈表示正样本,红色圆圈表示负样本
%首先,生成二维数据,对应于坐标系中的(x,y)
[data_org,weight,mu,sigma]=CreateSample(2,1,100);
data=zeros(100,3);
data(:,1:2)=data_org';
for i=1:1:100
    if data(i,1)>mu(1,1) %按照x轴数据的大小将样本分为正负两类
        data(i,3)=1;
    else
        data(i,3)=-1;
    end
end

[row,col]=size(data);
figure(1);clf
for r=1:1:row
    x=data(r,1:(col-1));
    y=data(r,col);
    if y==1
        plot(x(1),x(2),'go');hold on
    else
        plot(x(1),x(2),'ro');hold on
    end
end
hold off

[w,b]=Percep(data,0.1);
figure(2);clf
for r=1:1:row
    x=data(r,1:(col-1));
    y_p=Sig(x*w+b);
    if y_p==1
        plot(x(1),x(2),'go');hold on
    else
        plot(x(1),x(2),'ro');hold on
    end
end
hold off

    

扫描二维码关注公众号,回复: 637254 查看本文章

猜你喜欢

转载自blog.csdn.net/cutelily2014/article/details/52848542