参考自11行python
以及吴恩达老师的机器学习
http://blog.csdn.net/sadfasdgaaaasdfa/article/details/47185199
还是有些地方有些疑惑。例如误差反向传递回去的推倒还不太明白。
x <- data.frame(c(0,0,1),c(0,1,1),c(1,0,1),c(1,1,1))
y <- c(0,1,1,0)
x <- as.matrix(t(x))
syn0 <- matrix(rnorm(3 * col ),ncol=3,nrow=3)
syn1 <- matrix(rnorm(3 * 1 ),ncol=3,nrow=1)
for (i in 1:10000){
l1 <- 1/(1+exp(-(x %*% t(syn0) )))
l2 <- 1/(1+exp(-(l1) %*% t(syn1) ))
errorOutput <- l2 - y
errorHidder <- errorOutput %*% syn1 * l1 * (1-l1 )
syn1 <- syn1 - t(0.01 * t(l1) %*% errorOutput )
syn0 <- syn0 - t(0.01 * t(x) %*% errorHidder)
}
运行结果
#
nnetOneLayer <- function(x,y,numberofUnits = 3,alpha = 0.01,iter=10000){
x <- as.matrix(t(x))
# x的特征数量
col <- ncol(x)
#0-1的权重初始化 nrow 表示特征数
syn0 <- matrix(rnorm(numberofUnits * col ),ncol=col,nrow=numberofUnits)
#1-2的权重初始化
syn1 <- matrix(rnorm(numberofUnits * 1 ),ncol=(numberofUnits),nrow=1)
cost <- c(NA)
length(cost) <- iter
for (i in 1:iter){
#输入层到隐层的值
l1 <- 1/(1+exp(-(x %*% t(syn0) )))
#隐层到输出层的值
l2 <- 1/(1+exp(-(l1) %*% t(syn1) ))
#输出层误差
errorOutput <- l2 - y
#隐层误差
errorHidder <- errorOutput %*% syn1 * l1 * (1-l1 )
#
syn1 <- syn1 - t(alpha * t(l1) %*% errorOutput )
syn0 <- syn0 - t(alpha * t(x) %*% errorHidder)
cost[i] <- errorOutput
}
plot(cost)
cbind(y,l2)
}
x <- data.frame(c(0,0,1),c(0,1,1),c(1,0,1),c(1,1,1))
y <- c(0,1,1,0)
nnetOneLayer(x,y)
l2
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
真实结果与预测结果
0 0.01942965
1 0.95005097
1 0.96147338
0 0.06028846
cost函数随着迭代的变化
|