感知机算法是一种二分类算法,使用到神经网络对数据进行一个线性分类,详细的算法原理见于博文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