matlab练习程序(神经网络分类)
注:这里的练习鉴于当时理解不完全,可能会有些错误,关于神经网络的实践可以参考我的这篇博文
这里的代码只是简单的练习,不涉及代码优化,也不涉及神经网络优化,所以我用了最能体现原理的方式来写的代码。
激活函数用的是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练习程序(神经网络分类)的更多相关文章
- matlab练习程序(神经网络识别mnist手写数据集)
记得上次练习了神经网络分类,不过当时应该有些地方写的还是不对. 这次用神经网络识别mnist手写数据集,主要参考了深度学习工具包的一些代码. mnist数据集训练数据一共有28*28*60000个像素 ...
- 详细MATLAB 中BP神经网络算法的实现
MATLAB 中BP神经网络算法的实现 BP神经网络算法提供了一种普遍并且实用的方法从样例中学习值为实数.离散值或者向量的函数,这里就简单介绍一下如何用MATLAB编程实现该算法. 具体步骤 这里 ...
- matlab练习程序(SUSAN检测)
matlab练习程序(SUSAN检测) SUSAN算子既可以检测角点也可以检测边缘,不过角点似乎比不过harris,边缘似乎比不过Canny.不过思想还是有点意思的. 主要思想就是:首先做一个和原图像 ...
- sklearn神经网络分类
sklearn神经网络分类 神经网络学习能力强大,在数据量足够,隐藏层足够多的情况下,理论上可以拟合出任何方程. 理论部分 sklearn提供的神经网络算法有三个: neural_network.Be ...
- (转)matlab练习程序(HOG方向梯度直方图)
matlab练习程序(HOG方向梯度直方图)http://www.cnblogs.com/tiandsp/archive/2013/05/24/3097503.html HOG(Histogram o ...
- matlab练习程序(异或分类)
clear all; close all; clc; %生成两组已标记数据 randn(); mu1=[ ]; S1=[; 0.5]; P1=mvnrnd(mu1,S1,); mu2=[ ]; S2= ...
- Matlab的BP神经网络工具箱及其在函数逼近中的应用
1.神经网络工具箱概述 Matlab神经网络工具箱几乎包含了现有神经网络的最新成果,神经网络工具箱模型包括感知器.线性网络.BP网络.径向基函数网络.竞争型神经网络.自组织网络和学习向量量化网络.反馈 ...
- matlab任务:FCM分类
一个朋友让帮忙做图像分类,用FCM聚类算法,网上查了一下,FCM基本都是对一幅图像进行像素的分类,跟他说的任务不太一样,所要做的是将一个文件夹里的一千多幅图像进行分类.图像大概是这个样子的(是25*2 ...
- [翻译]LSP程序的分类
翻译的太垃圾,不建议其它人阅读本文. Note:LSP现在已经不推荐使用.自windows8和windows Server2012开始,使用Windows Filtering Platform. Wi ...
随机推荐
- 解决svn图标不显示(绝对有用)
经常遇到svn图标不显示的问题,然后经过长时间的查找终于找到了一个最最管用的办法,在这里分享给的大家
- (转)pycharm快捷键、常用设置、配置管理
原文: http://blog.csdn.net/pipisorry/article/details/39909057 本博客一直在同步更新中! 内容包含:pycharm学习技巧 Learning t ...
- mysql 架构篇系列 2 复制架构一主一从搭建(异步复制)
一. 环境准备 1.1 主库环境(172.168.18.201) 环境 说明 查看脚本 操作系统版本 CentOS Linux release 7.4.1708 (Core) cat /etc/red ...
- 在Mac OSX上配置Appium+Android自动化测试环境
前提准备 开始正文之前,你需要准备好一些基本条件: 1.安装好Mac OSX 操作系统的设备 2.能够访问中国局域网以外资源的方法(没有也行,但很痛苦) 3.已经安装好 homebrew 4.已经安装 ...
- Java多线程之三volatile与等待通知机制示例
原子性,可见性与有序性 在多线程中,线程同步的时候一般需要考虑原子性,可见性与有序性 原子性 原子性定义:一个操作或者多个操作在执行过程中要么全部执行完成,要么全部都不执行,不存在执行一部分的情况. ...
- 微信小程序:防止多次点击跳转(函数节流)和防止表单组件输入内容多次验证(函数防抖)
一.函数节流(throttle) **函数节流:一个函数执行一次后,只有大于设定的执行周期后才会执行第二次**.有个需要频繁触发函数,出于优化性能角度,在规定时间内,只让函数触发的第一次生效,后面不生 ...
- MySql数据库安装
MySql数据库安装 一丶数据库 什么是数据库 数据库简单连接就是存储数据的容器. 而库则是一组容器合成的东西. 也就是存储数据的.我们编程中常常会用到数据库. 什么是数据管理系统 数据库管理系统就是 ...
- Win32知识之窗口绘制.窗口第一讲
Win32知识之窗口本质 一丶摘要 在学习Win32的时候. 很多操作都是窗口进行操作的.那么今天就说一下窗口的本质是什么. 窗口的本质是不断绘制.是windows通过消息机制进行绘制的. 我们知道. ...
- Swagger中配置了@ApiModelProperty的allowableValues属性但不显示的问题
现在用Swagger来生成API文档的例子已经非常多了,今天碰到开发同事问了一个问题,帮着看了一下,主要还是配置方法的问题,所以记录一下.如果您也碰到了同样的问题,希望本文对您有用. 问题描述 @Ap ...
- C#正则表达式_简单梳理_Emoji表情字符处理
A-最近一直有接触到正则表达式,现对其做简单梳理: private const RegexOptions OPTIONS = RegexOptions.IgnoreCase | RegexOption ...