数学建模社区-数学中国
标题:
神经网络在R语言 实现
[打印本页]
作者:
haviet
时间:
2011-9-13 20:25
标题:
神经网络在R语言 实现
ti<-proc.time()
8 C4 e) X# p4 y* B/ f+ e
BP_one_output<-function(input,output,m,fth,sth,w,v){
|" p, e! P1 r# U
x<-input;#7*8
6 B, D% _/ ]2 E. f9 [
y<-output;#8*1,y为向量,每一元素为一个样本输出值
- D5 g. G4 g* C1 o, b
theta<-fth;#11*1
6 D0 B# r; j" r! p- ^! _
gama<-sth;#标量
, l0 y8 @5 L% V9 A5 E; T
if(m!=length(theta)) print("阈值长度错误!")
2 w# Y! X9 B3 W# f1 }( `
x<-rbind(x,t(rep(-1,ncol(x))));#8*8导致x的最后一列为阈值theta的权重
$ R- n3 A6 f. d5 ?0 w
K<-nrow(x);#8一组样本的维数
( i6 t) C. ?8 M: o" O* L `% e/ {
J<-ncol(x);#8一共有多少组样本
* A T' {( i6 W# K* F8 T4 g. @: x
w<-rbind(w,t(theta));#由7*11变为8*11
" r% p, G. a4 V* {
v<-c(v,gama);#由11变为12,但请记住:在隐含层增加一个值为-1的节点,但与输入层并未连接
1 W' C9 j- w3 u2 _' C" d0 W
#定义函数f
9 D: x# M9 E1 ?, Y4 g' ?! u1 s
f<-function(h) 1/(1+exp(-h));
& b U) p' q" n& u
epsilon<-alpha<-0.5;
5 [: |" K0 K2 ~: P N
N<-0;#重复学习次数的计数
5 w6 ? O$ l3 b. }
ei<-as.numeric();#记录每次迭代的平均残差平方和
5 _7 F& d0 x9 t+ z% G
FW<-1;
% o0 w* M- K) C; y
while((FW/J)>=0.001){
s7 F5 M) o. y8 m( Q
Z1<-t(w)%*%x;#11*8矩阵,每一列为一组样本
4 A( w1 K' @+ k
Y1<-apply(Z1,c(1,2),f);#11*8矩阵,每一列为一组样本在隐含层的值, a matrix 1 indicates rows,
3 P6 E" f9 d1 P
#2 indicates columns, c(1, 2) indicates rows and columns
% P0 x1 X; I0 G3 O0 L
Z2<-t(v)%*%rbind(Y1,t(rep(-1,ncol(Y1))));#8*1向量,每个元素为隐含层对输出层的加权值
) g4 O% M5 Y* a1 `
D<-f(Z2);#向量,每一元素为一组样本的一个输出值
0 k. K# X4 N {
b<-y-D;
" u6 j8 d9 P5 B0 l+ H
#J组样本的学习
. ^' w0 w. _# g
#向量,输出层对隐含层的权值的偏导
. K; R; u1 @ I J
FW<-pFW2<-pFW2t_1<-0;
5 A! F; q$ l. `" q e/ V
pFW1t_1<-matrix(0,nrow(w),ncol(w));#矩阵,隐含层对输入层权值的偏导
% P: Z2 r3 U' b- l& `1 G- Z* f( E# q
for(t in 1:J){
3 P1 ?9 X% x3 z4 s
B3<-b[t];
6 U2 q2 {- O4 O9 Y8 A( `
FW<-FW+B3*B3;#标量
( L7 F6 y; S4 G
B2<-f(Z2[t])*(1-f(Z2[t]))*B3;#标量
2 B G, X6 j% C
pFW2<--2*c(Y1[,t],-1)*B2;#12*1向量隐含层对输出层的权重偏导,此时多了一个阈值项
) C; B8 s; E9 _: F5 ^
if(t==1) v<-v-0.5*epsilon*pFW2
! p _' o4 I/ `
else{
) r- G% O( x; M/ G+ l
v<-v-0.5*epsilon*pFW2+alpha*(-0.5*epsilon*pFW2t_1);
' w* a) X" l7 v8 w" @( u4 I+ ^* {
pFW2t_1<-pFW2;
- _; j' ^ H' c! I* ~
}
0 g5 Z! U, g* m+ H! N0 ?; R6 f# C
B1<-diag(f(Z1[,t])*(1-f(Z1[,t])))%*%v[1
length(v)-1)]*B2;#11*1隐含层多出来的一个节点即阈值节点并未与输入层相连
2 i% t. u+ o3 d0 O
pFW1<--2*x[,t]%*%t(B1)#8*11输入层对隐含层的权重偏导
) s# g# K2 @; s/ |* K+ E# s
if(t==1) w<-w-0.5*epsilon*pFW1
$ q, u9 _ r& r% e: q
else{
- }: W- O8 |7 v) K0 g( K9 d: r$ {
w<-w-0.5*epsilon*pFW1+alpha*(-0.5*epsilon*pFW1t_1);
3 \# Y4 p+ o3 d8 P; B
pFW1t_1<-pFW1;
4 Y# v7 n8 `4 J/ ]- [; g
}
& M0 ]$ l+ o+ j' a" {$ M6 J
}
3 d5 ~2 K% R/ I' _
N<-N+1;
) U& d! a" Y: r, _: z# ]* l6 b6 O
ei[N]<-FW/J;
3 k8 s& { E a% K' z R/ S
}
9 y+ J* T d% `3 B: L
theta<-w[nrow(w),];#隐含层阈值
( _5 {2 q& M5 E/ n0 h, O* ]3 I
gama<-v[length(v)];#输出层阈值
, o6 M# X1 O- T
w<-w[1
nrow(w)-1),];#输入层对隐含层的权重
$ A8 E7 P# b3 x' \) w! l" _
v<-v[1
length(v)-1)];#隐含层对输出层的权重
& P; M% d I# c
list(theta,gama,w,v,N,FW/J,ei)
7 |' r0 v. h9 N9 J
}
s, y y3 |1 K" L u* v
x<-cbind(x1,x2,x3,x4,x5,x6,x7);
0 k0 } Z4 T6 ?) C) s' v
x<-t(x);
/ a8 }' `. m! C& G: n0 b3 o
hidden_threshold<-runif(11);
4 D5 D3 X. j6 K4 z6 T; Y+ t3 Y$ f
output_threshold<-runif(1);
: ?- ?% D/ o% A# U
w<-matrix(runif(77),7,11);
: o2 U4 O& C( \: [( j; v
v<-runif(11);
) Y5 ?( W0 D) b9 ?# Y) a: r6 {
result<-BP_one_output(x,y,11,hidden_threshold,output_threshold,w,v);
4 E$ i9 E* L" A& @. G6 @, X& V6 y; t" f
#输出
, y/ F" B# H. t+ v" x. ^/ `) u3 v9 a
cat("\n");
" b' k$ R5 b6 R9 [
cat("隐含层阈值theta","\n",result[[1]],"\n");
! `- }1 d. f; j7 H8 s8 ?( O* h4 Q
cat("输出层阈值gama","\n",result[[2]],"\n");
3 T: c5 B# f, |/ V( j6 G; i
w<-as.matrix(result[[3]],7,11);
3 b1 P3 {$ _" p" k) {
cat("输入层对隐含层的权重w","\n");
+ q Z3 q, i8 l$ E8 q6 M. t' Z: [* \
w;
3 B% p5 s$ Z/ ~
cat("\n");
! y9 S/ y9 r5 e- i
cat("隐含层对输出层的权重v","\n",result[[4]],"\n");
( M& d6 ]2 p. l2 V5 k# S b* S' n
cat("迭代次数N" ,"\n",result[[5]],"\n");
% m1 ^/ T7 p9 j% _ w8 s u, C
cat("学习误差FW","\n",result[[6]],"\n");
) _( c1 s: M$ i, ~6 V; D) B
cat("每次迭代的误差","\n");
1 q9 W# o- \9 a; n- i3 ]7 \/ D1 ^
plot(result[[7]],type="l",ylab="每次学习误差",xlab="反复学习的次数");
/ H9 f+ P7 O9 C5 A T" A }" c
proc.time()-ti
; w) ?. l3 u, y* G! g- B
作者:
廷植斌_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