数学建模社区-数学中国
标题:
神经网络在R语言 实现
[打印本页]
作者:
haviet
时间:
2011-9-13 20:25
标题:
神经网络在R语言 实现
ti<-proc.time()
) t, U) J4 w5 B9 a8 x0 U& Z
BP_one_output<-function(input,output,m,fth,sth,w,v){
+ v, c4 o6 q% d7 I2 i; B3 ~
x<-input;#7*8
3 b$ p& {2 J/ M" W4 {& z% d
y<-output;#8*1,y为向量,每一元素为一个样本输出值
5 ]+ c8 @6 b8 i. [5 Y& ?
theta<-fth;#11*1
" v( W R7 U, n! Q+ C" X$ H! o# u
gama<-sth;#标量
# ^! E" a$ @* U6 s. m
if(m!=length(theta)) print("阈值长度错误!")
, o% m* M( j% z7 R
x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
1 w/ A8 e7 k1 k; g+ \$ Z0 [
K<-nrow(x);#8一组样本的维数
) k- V4 j) m6 K1 [$ o S
J<-ncol(x);#8一共有多少组样本
0 S4 W. T3 K! V% {5 E
w<-rbind(w,t(theta));#由7*11变为8*11
n, n0 \ r' f
v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
) |7 v) @0 Y: T& v7 \
#定义函数f
: n5 s$ y! G# h( k. K# y* r6 M
f<-function(h) 1/(1+exp(-h));
* u- r7 a( U' S+ C8 w% {
epsilon<-alpha<-0.5;
3 X# ~! q1 [6 h
N<-0;#重复学习次数的计数
7 L$ {) L1 k: V6 `5 e2 _$ u
ei<-as.numeric();#记录每次迭代的平均残差平方和
/ t- |% H5 G) e
FW<-1;
9 b' ]0 j: E, G6 M8 y7 {
while((FW/J)>=0.001){
6 |6 D0 k8 h+ ?$ Z" L
Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
+ C9 ~; @" L' d- V. L
Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
) ]8 Q1 w9 _3 `+ Y( A5 K
#2 indicates columns, c(1, 2) indicates rows and columns
* M/ `) D* B$ u4 P
Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
0 Q" w& l4 i, q, _6 w. _: ]4 ]
D<-f(Z2);#向量,每一元素为一组样本的一个输出值
6 T' B B4 v2 w6 _! g; e
b<-y-D;
7 F9 M# J6 `: V' h6 H! w+ A0 g5 _
#J组样本的学习
. j: z/ P- p' {
#向量,输出层对隐含层的权值的偏导
, `! }0 n& a$ B4 K' q* `+ d1 `
FW<-pFW2<-pFW2t_1<-0;
! A7 t% [; a! O- P# Q3 h8 ?/ g
pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
8 B0 R3 }4 |% \7 ^
for(t in 1:J){
, U& p- L" x$ J4 v& ]; c& D
B3<-b[t];
! C/ Y+ v0 N! ~7 f+ T" f
FW<-FW+B3*B3;#标量
' V- ^8 ~3 j' g# v
B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
% m3 A5 ?# ?' \) G& @0 V+ k
pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
6 Q5 S7 r& w: ]6 s1 \$ D% t
if(t==1) v<-v-0.5*epsilon*pFW2
5 Y; F; Y# V8 b# i& P# H4 ?
else{
: o# _" W" D1 ^: E5 ^) v
v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
' `4 t$ A& l& b [" x3 P7 D
pFW2t_1<-pFW2;
, |& x7 k8 |( j, m
}
u! s6 F' B; H% U7 k
B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1
length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
" X" l1 n: \5 W. k
pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
& U" |5 G7 d3 D0 Z
if(t==1) w<-w-0.5*epsilon*pFW1
3 R4 ?1 k) ?* }$ c* s! A+ \; F
else{
; h2 A$ I) s! Y
w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
8 q& F4 ]& D2 K4 |2 H$ ~
pFW1t_1<-pFW1;
5 z2 B }* V7 s% B9 q
}
2 G4 `5 n0 J n& Q8 _2 Q& |6 D9 L
}
( u* U! H" {, p5 D. \
N<-N+1;
: ~% ]1 m( J% o k
ei[N]<-FW/J;
2 o9 C- x1 ]. M, @
}
. g, E7 ^' ^ c# i w1 A4 N# V
theta<-w[nrow(w),];#隐含层阈值
; Q' `: s$ w: z) u" \2 Y
gama<-v[length(v)];#输出层阈值
1 Y: S5 K% f3 S: ?$ @, e0 g1 v
w<-w[1
nrow(w)-1),];#输入层对隐含层的权重
% @5 W/ ?. O: d, S: ?& @$ [
v<-v[1
length(v)-1)];#隐含层对输出层的权重
+ e5 n! f. K1 }6 I1 Q! M/ u
list(theta,gama,w,v,N,FW/J,ei)
- J% u3 L9 `7 K: H% \( f
}
7 S! i+ b0 Z, q, l1 g
x<-cbind(x1,x2,x3,x4,x5,x6,x7);
7 O8 y2 G$ I; C' P4 c! R. T+ j7 n
x<-t(x);
+ q6 |# f1 P1 E
hidden_threshold<-runif(11);
5 h3 \, e8 c* B' j
output_threshold<-runif(1);
3 R q. [/ |( K+ ?1 j+ S6 i5 |
w<-matrix(runif(77),7,11);
4 m0 S7 J) q- S" f; {: v7 e$ |
v<-runif(11);
2 `' g/ B, n8 l* l j. Y
result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
3 g! n5 A3 R) l5 n* H
#输出
* q, L# U& G! `7 L% U! z% }
cat("\n");
/ Q2 V2 v$ d( @0 K3 q. \
cat("隐含层阈值theta","\n",result[[1]],"\n");
: [7 ~& |3 r7 l; }5 Y% e! R
cat("输出层阈值gama","\n",result[[2]],"\n");
3 \0 j" i- f; V4 t
w<-as.matrix(result[[3]],7,11);
! d9 U* X: ?7 p0 a; j" W& o
cat("输入层对隐含层的权重w","\n");
0 D! ?+ \" s' t9 o
w;
8 J- n. v4 f/ E8 n$ v
cat("\n");
' M8 p- K9 _/ M% h
cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
+ e, b9 O' W/ r( i
cat("迭代次数N" ,"\n",result[[5]],"\n");
- ]$ H! B& d4 X" [7 A
cat("学习误差FW","\n",result[[6]],"\n");
0 o6 F5 j3 j6 U o1 |' _$ w
cat("每次迭代的误差","\n");
; I# u* ?) N1 D c$ Y) O4 E
plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
! f4 n% h, ~$ T2 x* \. I3 e' z
proc.time()-ti
H7 n& W: t% d1 t. c9 h9 I0 A! M
作者:
廷植斌_972
时间:
2011-10-30 23:44
支持~~顶顶~~~
作者:
Esmtih
时间:
2011-11-8 09:26
运行不了啊?
作者:
黄窗帘
时间:
2012-2-1 14:07
就看看,不说话。
作者:
凌chers
时间:
2012-3-22 15:08
能不能解释一下呢?
作者:
兰竹李乐
时间:
2014-9-2 12:51
这牛逼的你自己编的吗
欢迎光临 数学建模社区-数学中国 (http://www.madio.net/)
Powered by Discuz! X2.5