数学建模社区-数学中国
标题:
神经网络在R语言 实现
[打印本页]
作者:
haviet
时间:
2011-9-13 20:25
标题:
神经网络在R语言 实现
ti<-proc.time()
4 [ e% h$ Q0 W5 x
BP_one_output<-function(input,output,m,fth,sth,w,v){
) d. h H: _# H0 h& G; `, O
x<-input;#7*8
6 g' u% S3 o- B9 T9 u4 i' r
y<-output;#8*1,y为向量,每一元素为一个样本输出值
. A! l; h# ^$ c- l, g$ S
theta<-fth;#11*1
" i7 r( U6 q/ ]
gama<-sth;#标量
6 o7 e' G O% z
if(m!=length(theta)) print("阈值长度错误!")
8 F/ s: E2 ^) |
x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
~4 `" Q5 k2 n
K<-nrow(x);#8一组样本的维数
2 g$ D# i5 m7 |
J<-ncol(x);#8一共有多少组样本
6 P+ U8 d6 ~6 ?' W! `" {+ j
w<-rbind(w,t(theta));#由7*11变为8*11
; [8 |# A9 _; t' Y/ {" X
v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
3 K {- w6 B) Z- ~
#定义函数f
h( Q1 j8 R& W: y3 j# Q
f<-function(h) 1/(1+exp(-h));
$ {! D- Q: b6 p9 h" _
epsilon<-alpha<-0.5;
% m8 |5 d2 v7 ?9 o3 l( u0 v
N<-0;#重复学习次数的计数
! e7 D6 e8 u$ k
ei<-as.numeric();#记录每次迭代的平均残差平方和
5 g+ @# \0 _$ \. W6 p3 Y" n
FW<-1;
! V, C! }, [: g8 O0 W+ ^
while((FW/J)>=0.001){
/ [) k% q6 b* k9 o$ l6 ~) v/ |! q$ `5 c2 Z
Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
6 q+ ]- E( F2 J- m: d( M6 b @
Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
# c! ^9 ~ d6 s5 R
#2 indicates columns, c(1, 2) indicates rows and columns
/ S* ]. u( Q7 L8 l3 O9 x
Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
( v# M# w1 `1 f& }/ C0 _
D<-f(Z2);#向量,每一元素为一组样本的一个输出值
' e* W2 y+ S; f# U3 D" X! A) p
b<-y-D;
T0 [1 j# b3 N' _; k
#J组样本的学习
/ z ~$ s4 T& W' {0 L
#向量,输出层对隐含层的权值的偏导
( t6 k1 J4 f9 ?: O$ O8 S
FW<-pFW2<-pFW2t_1<-0;
5 e2 j; k3 I6 v% q5 Q8 K
pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
) K" z& U8 I8 p3 U
for(t in 1:J){
! H- m/ f$ d/ B3 g7 S+ I
B3<-b[t];
( D9 u9 o; E( C, a, \0 e" [9 q
FW<-FW+B3*B3;#标量
5 h7 w8 E, i6 a5 v6 X
B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
9 V8 l2 u+ x% j. E( K
pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
( ~# p% P6 l! U5 I3 h; @, Q7 O8 I) f
if(t==1) v<-v-0.5*epsilon*pFW2
, c5 K8 L5 f7 N5 A( x- o8 t- |! \
else{
, u7 ?) e \% t* K2 N" ?( z* C2 w
v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
" k: D8 Y, \# z, S [
pFW2t_1<-pFW2;
: a8 q& ?2 n0 P
}
# B( D5 m9 @4 j1 b6 R
B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1
length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
2 M C6 A3 f- i; d2 l8 {
pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
' s. C/ S) p. h$ U( a
if(t==1) w<-w-0.5*epsilon*pFW1
5 j1 w; I) t6 D' N$ F3 W
else{
/ x: P+ N; R, ^9 W; @. W
w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
) k5 l9 p7 [ t( ]$ t
pFW1t_1<-pFW1;
8 z: G r2 K- ~2 @' E7 p" K8 D4 M z
}
' d k" |1 j L( i% e* x1 h) ?/ }
}
6 H @1 p: ~- P: c7 E
N<-N+1;
9 f7 `2 R. Z7 V% I: {( ~
ei[N]<-FW/J;
" Z' u+ \; q2 c$ F4 ]
}
( z) ~( D# c( E, G
theta<-w[nrow(w),];#隐含层阈值
* s3 q4 O& z/ x
gama<-v[length(v)];#输出层阈值
/ I# N" l' ^$ g2 k' z, F7 a; k
w<-w[1
nrow(w)-1),];#输入层对隐含层的权重
6 R& N+ }- L8 A7 s5 r1 I$ d
v<-v[1
length(v)-1)];#隐含层对输出层的权重
# ]- K( Y% E% [9 R J; A* I
list(theta,gama,w,v,N,FW/J,ei)
# f9 x/ k# k" Y5 u4 G
}
# _6 i( H% u& V4 c! N# ~0 u/ d
x<-cbind(x1,x2,x3,x4,x5,x6,x7);
5 g" ]/ T; m* `7 E( @
x<-t(x);
/ X8 @9 L, l, r5 T5 d3 {2 o
hidden_threshold<-runif(11);
1 m* U' u. o6 ^! r) g! H
output_threshold<-runif(1);
% B; N5 z( f$ x q2 ]0 u. N
w<-matrix(runif(77),7,11);
3 b* N6 E; _8 ?, S% Z6 e5 q0 ?- F1 E$ U% n
v<-runif(11);
6 z) E, c( t" P4 D, h9 l K. |
result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
* a( L# W9 @( L7 S3 l/ _9 O/ L2 D
#输出
! p n( S+ G$ {+ O, y
cat("\n");
, N" ~. X0 l; O7 G
cat("隐含层阈值theta","\n",result[[1]],"\n");
- v& d' n$ u! \* X" k$ A
cat("输出层阈值gama","\n",result[[2]],"\n");
& N- z5 z3 m; d" z. Q
w<-as.matrix(result[[3]],7,11);
4 B7 m- o, O& e8 M {% s* W8 u) N
cat("输入层对隐含层的权重w","\n");
2 h0 O4 R5 C' x s; O( A t
w;
' A2 K" Q, w3 A( a: @
cat("\n");
* \1 ~( Q; ?8 ^7 Z
cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
# [/ x& G' d5 w0 F7 g
cat("迭代次数N" ,"\n",result[[5]],"\n");
, G+ X: n" F4 i+ M$ ^& l! L! \) I
cat("学习误差FW","\n",result[[6]],"\n");
! R h) |0 ~9 i7 N
cat("每次迭代的误差","\n");
. e7 d+ [. W: e6 y8 H* T: q; I( a
plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
) t! e# M) j. A' W6 L
proc.time()-ti
; |3 G. f+ C' a- Z* M0 S* Z/ }" v6 _
作者:
廷植斌_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