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 ...
随机推荐
- Android项目创建.prorperties配置文件和调用方法
刚接触Android开发不久,今天写项目发现里面的可变参数有点多,(主要是服务器访问路径), 如果路径改变或者改名字了的话,若都写在代码里,岂不是要炸了? 我想到了Java项目里的有个.prorper ...
- React Native IOS搭建开发环境
安装 必须的软件 Homebrew ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/mast ...
- for循环输出菱形的形状【java】
使用for循环语句输出以下“菱形”效果: * *** ***** ******* ********* ******* ***** *** * 代码 /* * *** ***** ******* *** ...
- JavaScript和Ajax部分(6)
51. 怎样给jQuery动态附加新的元素?那么怎样给新生成的元素绑定事件呢? jQuery的html()可以给现有元素附加新的元素. 直接在元素还未生成前就绑定肯定是无效的,因为所绑定的元素目前根本 ...
- leetcode — valid-number
/** * * Source : https://oj.leetcode.com/problems/valid-number/ * * * Validate if a given string is ...
- HttpServetRequest读取body只能一次的问题
HTTP请求中的是字符串数据: //字符串读取 void charReader(HttpServletRequest request) { BufferedReader br = request.ge ...
- 基于python的图片修复程序-可用于水印去除
图片修复程序-可用于水印去除 在现实的生活中,我们可能会遇到一些美好的或是珍贵的图片被噪声干扰,比如旧照片的折痕,比如镜头上的灰尘或污渍,更或者是某些我们想为我所用但有讨厌水印,那么有没有一种办法可以 ...
- spring-boot-2.0.3之quartz集成,数据源问题,源码探究
前言 开心一刻 着火了,他报警说:119吗,我家发生火灾了. 119问:在哪里? 他说:在我家. 119问:具体点. 他说:在我家的厨房里. 119问:我说你现在的位置. 他说:我趴在桌子底下. 11 ...
- 服务注册中心之ZooKeeper系列(三) 实现分布式锁
通过ZooKeeper的有序节点.节点路径不回重复.还有节点删除会触发Wathcer事件的这些特性,我们可以实现分布式锁. 一.思路 zookeeper中创建一个根节点Locks,用于后续各个客户端的 ...
- Perl模块管理
Perl模块管理 perl有自带的模块,还有第三方模块.自带的模块是随perl安装而安装好的,第三方模块需要从CPAN(Comprehensive Perl Archive Network)上下载并安 ...