注:这里的练习鉴于当时理解不完全,可能会有些错误,关于神经网络的实践可以参考我的这篇博文

这里的代码只是简单的练习,不涉及代码优化,也不涉及神经网络优化,所以我用了最能体现原理的方式来写的代码。

激活函数用的是h = 1/(1+exp(-y)),其中y=sum([X Y].*w)。

代价函数用的是E = 1/2*(t-h)^2,其中t为目标值,t为1代表是该类,t为0代表不是该类。

权值更新采用BP算法。

网络1形式如下,没有隐含层,1个偏置量,输入直接连接输出:

分类结果:

代码如下:

clear all;
close all;
clc; n=;
randn('seed',);
mu1=[ ];
S1=[0.5 ;
0.5];
P1=mvnrnd(mu1,S1,n); mu2=[ ];
S2=[0.5 ;
0.5];
P2=mvnrnd(mu2,S2,n); mu3=[ ];
S3=[0.5 ;
0.5];
P3=mvnrnd(mu3,S3,n); P=[P1;P2;P3];
meanP=mean(P); P=[P(:,)-meanP() P(:,)-meanP()]; sigma = ; X=P(:,);
Y=P(:,);
B=rand(*n,); w1 = rand(*n,);
w2 = rand(*n,);
w3 = rand(*n,); w4 = rand(*n,);
w5 = rand(*n,);
w6 = rand(*n,); for i=:*n
i
while y1 = X(i)*w1(i) + Y(i)*w4(i) + B(i);
y2 = X(i)*w2(i) + Y(i)*w5(i) + B(i);
y3 = X(i)*w3(i) + Y(i)*w6(i) + B(i); h1 = /(+exp(-y1));
h2 = /(+exp(-y2));
h3 = /(+exp(-y3)); e1 = /*( - h1)^;
e2 = /*( - h2)^;
e3 = /*( - h3)^; if i<=n && e1<=0.0000001
break;
elseif i>n && i<=*n && e2<0.0000001
break;
elseif i>*n && e3<0.0000001
break;
end if i<=n
w1(i) = w1(i)-sigma*(h1-)*h1*(-h1)*X(i);
w2(i) = w2(i)-sigma*(h2-)*h2*(-h2)*X(i);
w3(i) = w3(i)-sigma*(h3-)*h3*(-h3)*X(i); w4(i) = w4(i)-sigma*(h1-)*h1*(-h1)*Y(i);
w5(i) = w5(i)-sigma*(h2-)*h2*(-h2)*Y(i);
w6(i) = w6(i)-sigma*(h3-)*h3*(-h3)*Y(i); B(i) =B(i)- sigma*((h1-)*h1*(-h1)+(h2-)*h2*(-h2)+(h3-)*h3*(-h3));
elseif i>n && i<=*n
w1(i) = w1(i)-sigma*(h1-)*h1*(-h1)*X(i);
w2(i) = w2(i)-sigma*(h2-)*h2*(-h2)*X(i);
w3(i) = w3(i)-sigma*(h3-)*h3*(-h3)*X(i); w4(i) = w4(i)-sigma*(h1-)*h1*(-h1)*Y(i);
w5(i) = w5(i)-sigma*(h2-)*h2*(-h2)*Y(i);
w6(i) = w6(i)-sigma*(h3-)*h3*(-h3)*Y(i); B(i) =B(i)- sigma*((h1-)*h1*(-h1)+(h2-)*h2*(-h2)+(h3-)*h3*(-h3));
else
w1(i) = w1(i)-sigma*(h1-)*h1*(-h1)*X(i);
w2(i) = w2(i)-sigma*(h2-)*h2*(-h2)*X(i);
w3(i) = w3(i)-sigma*(h3-)*h3*(-h3)*X(i); w4(i) = w4(i)-sigma*(h1-)*h1*(-h1)*Y(i);
w5(i) = w5(i)-sigma*(h2-)*h2*(-h2)*Y(i);
w6(i) = w6(i)-sigma*(h3-)*h3*(-h3)*Y(i); B(i) =B(i)- sigma*((h1-)*h1*(-h1)+(h2-)*h2*(-h2)+(h3-)*h3*(-h3));
end end
end plot(P(:,),P(:,),'o');
hold on; flag = ;
M=[];
for x=-:0.3:
for y=-:0.3: H=[];
for i=:*n
y1 = x*w1(i)+y*w4(i) +B(i);
y2 = x*w2(i)+y*w5(i) +B(i);
y3 = x*w3(i)+y*w6(i) +B(i);
h1=/(+exp(-y1));
h2=/(+exp(-y2));
h3=/(+exp(-y3)); H=[H;h1 h2 h3];
end
% H1 = mean(H(:n,));
% H2 = mean(H(n:*n,));
% H3 = mean(H(*n:*n,)); meanH = mean(H);
H1 = meanH();
H2 = meanH();
H3= meanH();
if H1>H2 && H1>H3
plot(x,y,'g.')
elseif H2 > H1 && H2 > H3
plot(x,y,'r.')
elseif H3 > H1 && H3 > H2
plot(x,y,'b.')
end end
end

网络2形式如下,有1个隐含层,2个偏置量:

分类结果:

代码如下:

clear all;
close all;
clc; n=;
randn('seed',);
mu1=[ ];
S1=[0.5 ;
0.5];
P1=mvnrnd(mu1,S1,n); mu2=[ ];
S2=[0.5 ;
0.5];
P2=mvnrnd(mu2,S2,n); mu3=[ ];
S3=[0.5 ;
0.5];
P3=mvnrnd(mu3,S3,n); P=[P1;P2;P3];
meanP=mean(P); P=[P(:,)-meanP() P(:,)-meanP()]; sigma = ; X=P(:,);
Y=P(:,); B1=rand(*n,);
B2=rand(*n,); w1 = rand(*n,);
w2 = rand(*n,); w3 = rand(*n,);
w4 = rand(*n,);
w5 = rand(*n,); for i=:*n
i
while y0 = X(i)*w1(i) + Y(i)*w2(i) + B1(i);
h0 = /(+exp(-y0)); y1 = h0*w3(i) + B2(i);
y2 = h0*w4(i) + B2(i);
y3 = h0*w5(i) + B2(i); h1 = /(+exp(-y1));
h2 = /(+exp(-y2));
h3 = /(+exp(-y3)); e1 = /*( - h1)^;
e2 = /*( - h2)^;
e3 = /*( - h3)^; if i<=n && e1<=0.0000001
break;
elseif i>n && i<=*n && e2<0.0000001
break;
elseif i>*n && e3<0.0000001
break;
end %e1
if i<=n w1(i) = w1(i)- sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0)*X(i) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0)*X(i) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)*X(i));
w2(i) = w2(i)- sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0)*Y(i) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0)*Y(i) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)*Y(i));
B1(i) = B1(i)- sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)); w3(i) = w3(i)-sigma*(h1-)*h1*(-h1)*h0;
w4(i) = w4(i)-sigma*(h2-)*h2*(-h2)*h0;
w5(i) = w5(i)-sigma*(h3-)*h3*(-h3)*h0;
B2(i) =B2(i)- sigma*((h1-)*h1*(-h1)+(h2-)*h2*(-h2)+(h3-)*h3*(-h3)); elseif i>n && i<=*n
w1(i) = w1(i)-sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0)*X(i) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0)*X(i) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)*X(i));
w2(i) = w2(i)-sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0)*Y(i) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0)*Y(i) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)*Y(i));
B1(i) =B1(i)- sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)); w3(i) = w3(i)-sigma*(h1-)*h1*(-h1)*h0;
w4(i) = w4(i)-sigma*(h2-)*h2*(-h2)*h0;
w5(i) = w5(i)-sigma*(h3-)*h3*(-h3)*h0;
B2(i) =B2(i)- sigma*((h1-)*h1*(-h1)+(h2-)*h2*(-h2)+(h3-)*h3*(-h3)); else
w1(i) = w1(i)-sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0)*X(i) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0)*X(i) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)*X(i));
w2(i) = w2(i)-sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0)*Y(i) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0)*Y(i) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)*Y(i));
B1(i) =B1(i)- sigma*((h1-)*h1*(-h1)*w3(i)*h0*(-h0) + (h2-)*h2*(-h2)*w4(i)*h0*(-h0) + (h3-)*h3*(-h3)*w5(i)*h0*(-h0)); w3(i) = w3(i)-sigma*(h1-)*h1*(-h1)*h0;
w4(i) = w4(i)-sigma*(h2-)*h2*(-h2)*h0;
w5(i) = w5(i)-sigma*(h3-)*h3*(-h3)*h0;
B2(i) =B2(i)- sigma*((h1-)*h1*(-h1)+(h2-)*h2*(-h2)+(h3-)*h3*(-h3)); end end
end plot(P(:,),P(:,),'o');
hold on; flag = ;
M=[];
for x=-:0.3:
for y=-:0.3: H=[];
for i=:*n
y0 = x*w1(i)+y*w2(i) +B1(i);
h0=/(+exp(-y0)); y1 = h0*w3(i) + B2(i);
y2 = h0*w4(i) + B2(i);
y3 = h0*w5(i) + B2(i); h1 =/(+exp(-y1));
h2 =/(+exp(-y2));
h3 =/(+exp(-y3)); H=[H;h1 h2 h3];
end meanH = mean(H);
H1 = meanH();
H2 = meanH();
H3= meanH();
if H1>H2 && H1>H3
plot(x,y,'g.')
elseif H2 > H1 && H2 > H3
plot(x,y,'r.')
elseif H3 > H1 && H3 > H2
plot(x,y,'b.')
end end
end

网络3形式如下,有2个隐含层,2个偏置量:

分类结果:

代码如下:

clear all;
close all;
clc; n=;
randn('seed',);
mu1=[ ];
S1=[0.5 ;
0.5];
P1=mvnrnd(mu1,S1,n); mu2=[ ];
S2=[0.5 ;
0.5];
P2=mvnrnd(mu2,S2,n); mu3=[ ];
S3=[0.5 ;
0.5];
P3=mvnrnd(mu3,S3,n); P=[P1;P2;P3];
meanP=mean(P); P=[P(:,)-meanP() P(:,)-meanP()]; sigma = ; X=P(:,);
Y=P(:,); B1=rand(*n,);
B2=rand(*n,); w1 = rand(*n,);
w2 = rand(*n,); w3 = rand(*n,);
w4 = rand(*n,); w5 = rand(*n,);
w6 = rand(*n,);
w7 = rand(*n,); w8 = rand(*n,);
w9 = rand(*n,);
w10 = rand(*n,); for i=:*n
i
while y1 = X(i)*w1(i) + Y(i)*w3(i) + B1(i);
y2 = X(i)*w2(i) + Y(i)*w4(i) + B1(i); h1 = /(+exp(-y1));
h2 = /(+exp(-y2)); dh1 = h1*(-h1);
dh2 = h2*(-h2); y3 = h1*w5(i) + h2*w8(i)+ B2(i);
y4 = h1*w6(i) + h2*w9(i)+ B2(i);
y5 = h1*w7(i) + h2*w10(i)+ B2(i); h3 = /(+exp(-y3));
h4 = /(+exp(-y4));
h5 = /(+exp(-y5)); dh3 = h3*(-h3);
dh4 = h4*(-h4);
dh5 = h5*(-h5); e1 = /*( - h3)^;
e2 = /*( - h4)^;
e3 = /*( - h5)^; if i<=n && e1<=0.0000001
break;
elseif i>n && i<=*n && e2<0.0000001
break;
elseif i>*n && e3<0.0000001
break;
end %e1
if i<=n w1(i) = w1(i) -sigma * ((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i)) * dh1*X(i);
w2(i) = w2(i) -sigma * ((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i)) * dh2*X(i); w3(i) = w3(i) -sigma * ((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i)) * dh1*Y(i);
w4(i) = w4(i) -sigma * ((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i)) * dh2*Y(i); B1(i) = B1(i)- sigma*(((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i))*dh1+((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i))*dh2); w5(i) = w5(i)-sigma*(h3-)*dh3*h1;
w6(i) = w6(i)-sigma*(h4-)*dh4*h1;
w7(i) = w7(i)-sigma*(h5-)*dh5*h1; w8(i) = w8(i)-sigma*(h3-)*dh3*h2;
w9(i) = w9(i)-sigma*(h4-)*dh4*h2;
w10(i) = w10(i)-sigma*(h5-)*dh5*h2; B2(i) =B2(i)- sigma*((h3-)*dh3+(h4-)*dh4+(h5-)*dh5); elseif i>n && i<=*n
w1(i) = w1(i) -sigma * ((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i)) * dh1*X(i);
w2(i) = w2(i) -sigma * ((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i)) * dh2*X(i); w3(i) = w3(i) -sigma * ((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i)) * dh1*Y(i);
w4(i) = w4(i) -sigma * ((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i)) * dh2*Y(i); B1(i) = B1(i)- sigma*(((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i))*dh1+((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i))*dh2); w5(i) = w5(i)-sigma*(h3-)*dh3*h1;
w6(i) = w6(i)-sigma*(h4-)*dh4*h1;
w7(i) = w7(i)-sigma*(h5-)*dh5*h1; w8(i) = w8(i)-sigma*(h3-)*dh3*h2;
w9(i) = w9(i)-sigma*(h4-)*dh4*h2;
w10(i) = w10(i)-sigma*(h5-)*dh5*h2; B2(i) =B2(i)- sigma*((h3-)*dh3+(h4-)*dh4+(h5-)*dh5); else
w1(i) = w1(i) -sigma * ((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i)) * dh1*X(i);
w2(i) = w2(i) -sigma * ((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i)) * dh2*X(i); w3(i) = w3(i) -sigma * ((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i)) * dh1*Y(i);
w4(i) = w4(i) -sigma * ((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i)) * dh2*Y(i); B1(i) = B1(i)- sigma*(((h3-)*dh3*w5(i)+(h4-)*dh4*w6(i)+(h5-)*dh5*w7(i))*dh1+((h3-)*dh3*w8(i)+(h4-)*dh4*w9(i)+(h5-)*dh5*w10(i))*dh2); w5(i) = w5(i)-sigma*(h3-)*dh3*h1;
w6(i) = w6(i)-sigma*(h4-)*dh4*h1;
w7(i) = w7(i)-sigma*(h5-)*dh5*h1; w8(i) = w8(i)-sigma*(h3-)*dh3*h2;
w9(i) = w9(i)-sigma*(h4-)*dh4*h2;
w10(i) = w10(i)-sigma*(h5-)*dh5*h2; B2(i) =B2(i)- sigma*((h3-)*dh3+(h4-)*dh4+(h5-)*dh5); end end
end plot(P(:,),P(:,),'o');
hold on; flag = ;
M=[];
for x=-:0.3:
for y=-:0.3:
% x=-;
% y=;
H=[];
for i=:*n
y1 = x*w1(i) + y*w3(i) + B1(i);
y2 = x*w2(i) + y*w4(i) + B1(i); h1 = /(+exp(-y1));
h2 = /(+exp(-y2)); dh1 = h1*(-h1);
dh2 = h2*(-h2); y3 = h1*w5(i) + h2*w8(i)+ B2(i);
y4 = h1*w6(i) + h2*w9(i)+ B2(i);
y5 = h1*w7(i) + h2*w10(i)+ B2(i); h3 = /(+exp(-y3));
h4 = /(+exp(-y4));
h5 = /(+exp(-y5)); H=[H;h3 h4 h5];
end
% H1 = mean(H(:n,));
% H2 = mean(H(n+:*n,));
% H3 = mean(H(*n+:*n,)); meanH = mean(H);
H1 = meanH();
H2 = meanH();
H3= meanH(); M=[M;H1 H2 H3 x y];
if H1>H2 && H1>H3
plot(x,y,'g.')
elseif H2 > H1 && H2 > H3
plot(x,y,'r.')
elseif H3 > H1 && H3 > H2
plot(x,y,'b.')
end end
end

后面我计划对网络分别使用softmax,权重初始化,正则化,ReLu激活函数,交叉熵代价函数与卷积的形式进行优化。

matlab练习程序(神经网络分类)的更多相关文章

  1. matlab练习程序(神经网络识别mnist手写数据集)

    记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对. 这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码. mnist数据集训练数据一共有28*28*60000个像素 ...

  2. 详细MATLAB 中BP神经网络算法的实现

    MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤   这里 ...

  3. matlab练习程序(SUSAN检测)

    matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...

  4. sklearn神经网络分类

    sklearn神经网络分类 神经网络学习能力强大,在数据量足够,隐藏层足够多的情况下,理论上可以拟合出任何方程. 理论部分 sklearn提供的神经网络算法有三个: neural_network.Be ...

  5. (转)matlab练习程序(HOG方向梯度直方图)

    matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...

  6. matlab练习程序(异或分类)

    clear all; close all; clc; %生成两组已标记数据 randn(); mu1=[ ]; S1=[; 0.5]; P1=mvnrnd(mu1,S1,); mu2=[ ]; S2= ...

  7. Matlab的BP神经网络工具箱及其在函数逼近中的应用

    1.神经网络工具箱概述 Matlab神经网络工具箱几乎包含了现有神经网络的最新成果,神经网络工具箱模型包括感知器.线性网络.BP网络.径向基函数网络.竞争型神经网络.自组织网络和学习向量量化网络.反馈 ...

  8. matlab任务:FCM分类

    一个朋友让帮忙做图像分类,用FCM聚类算法,网上查了一下,FCM基本都是对一幅图像进行像素的分类,跟他说的任务不太一样,所要做的是将一个文件夹里的一千多幅图像进行分类.图像大概是这个样子的(是25*2 ...

  9. [翻译]LSP程序的分类

    翻译的太垃圾,不建议其它人阅读本文. Note:LSP现在已经不推荐使用.自windows8和windows Server2012开始,使用Windows Filtering Platform. Wi ...

随机推荐

  1. 今日头条面试题——LRU原理和Redis实现

    很久前参加过今日头条的面试,遇到一个题,目前半部分是如何实现 LRU,后半部分是 Redis 中如何实现 LRU. 我的第一反应应该是内存不够的场景下,淘汰旧内容的策略.LRU ... Least R ...

  2. odoo开发笔记--取消正在升级中模块

    场景描述: 开发过程中,有时候会遇到,模块安装的时候,一直卡着,走不过去:或者安装报错,导致进入了系统! 这个时候,怎么处理呢? 先简单说下,odoo中模块的升级有4个状态,模块相关的安装情况记录在表 ...

  3. sql server 性能调优之 逻辑内存消耗最大资源分析1 (自sqlserver服务启动以后)

    一.概述 IO 内存是sql server最重要的资源,数据从磁盘加载到内存,再从内存中缓存,输出到应用端,在sql server 内存初探中有介绍.在明白了sqlserver内存原理后,就能更好的分 ...

  4. ACM--string常见用法

    在ACM竞赛中,常常需要将读入的数字的每位分离出来,如果采用取余的方法,花费的时间就会太长,这时候,我们可以将读入的数据当成字符串来处理,这样就方便.省时多了.下面这个程序演示了求一个整数各位的和: ...

  5. win32程序之子窗口编程

    win32程序之子窗口编程 一丶简介.什么是子窗口 在前边我们已经讲解了窗口的本质.以及如何注册窗口类跟创建窗口. 还讲了消息循环. 那么有很多窗口其实Windows已经帮我们创建出来了.我们直接使用 ...

  6. 云数据库POLARDB优势解读之①——10分钟了解

    什么是POLARDB POLARDB 是阿里云自研的下一代关系型分布式数据库,100%兼容MySQL,之前使用MySQL的应用程序不需要修改一行代码,即可使用POLARDB. POLARDB在运行形态 ...

  7. python使用多线程

    threading 模块支持守护线程, 其工作方式是:守护线程一般是一个等待客户端请求服务的服务器. 如果把一个线程设置为守护线程,进程退出时不需要等待这个线程执行完成. 如果主线程准备退出时,不需要 ...

  8. centos7安装kafka_2.11

    1.下载 官网地址:http://kafka.apache.org/downloads.html 下载:wget https://www.apache.org/dyn/closer.cgi?path= ...

  9. awk知识点总结

    find+xargs+grep+sed+awk系列文章:http://www.cnblogs.com/f-ck-need-u/p/7048359.html 0.学习资料推荐 1.awk入门:看视频.找 ...

  10. Redis基础认识及常用命令使用(一)--技术流ken

    Redis简介 redis是一个key-value存储系统.和Memcached类似,它支持存储的value类型相对更多,包括string(字符串).list(链表).set(集合)和zset(有序集 ...