神经网络(R语言)

作者:于英富
本文将借助R语言为工具,进一步了解神经网络的原理与运用.

神经网络工作的主要原理

第一步 . 创建网络结构

第二步. 初始化参数

第三步. 前向传播

第四步. 计算误差

Mean Squared Error = \frac{1}{m}\sum_{i=1}^{m}(output - target)^2

第五步. 逆向反馈 / 梯度下降

重复 3-5步

第一步.

下面将构造一个2个输入节点,2个隐藏层,1一个输出节点的神经网络

先定义神经元的激活函数
f(x)=\frac{1}{1+e^{-x}}

sigmoid = function(x) {
   1 / (1 + exp(-x))
}

XOR

X <- data.frame(A = c(0,0,1,1), B = c(0,1,1,0))
Y <- data.frame(Y = c(0,1,0,1))
b <- data.frame(b = c(1,1))
X
Y
b

神经网络结构如下

wts.in <- c(1,1,1,1,1,1,1,1,1)
struct <- c(2,2,1) #two inputs, two hidden, one output 
plot.nnet(wts.in,struct=struct)
weights <- plot.nnet(wts.in,struct=struct, wts.only=T)
weights
image.png

第二步.

随机函数初始化参数

set.seed(342)
wts.in <- round(runif(9, 0, 1), digits = 2)
plot.nnet(wts.in,struct=struct)
weights <- plot.nnet(wts.in,struct=struct, wts.only=T)
weights

第三步. 前向传播: 隐藏层

#利用权重和输入节点 计算隐藏节点值
第一个隐藏节点值
H1_a <- weights$`hidden 1 1` * I[1,]
#求和
H1_b <- sum(H1_a)
# 激活参数输出
H1_c <- sigmoid(H1_b)

#第二个隐藏节点值
H2_a <- weights$`hidden 1 2` * I[1,]
#求和
H2_b <- sum(H2_a)
#激活函数输出
H2_c <- sigmoid(H2_b)

隐藏层的值

H <- data.frame(b = 1, H1 = H1_c, H2 = H2_c)
H

第三步. 前向传播之: 输出层

#利用权重和隐藏层的值  计算输出层的值
O1_a <- weights$`out 1` * H
#求和
O1_b <- sum(O1_a)
#运用激活函数输出
O1_c <- sigmoid(O1_b)
print(O1_c)

第四步. 计算残差

Mean Squared Error = \frac{1}{m}\sum_{i=1}^{m}(output - target)^2


MSE <- 0.5*(O1_c - Y[1,])^2
MSE

第五步. 逆向反馈: 输出层 反馈到隐藏层

# 更新权重
weights$`out 1`
# 提升模型
wOb <- weights$`out 1`[1]
wOH1 <- weights$`out 1`[2]
wOH2 <- weights$`out 1`[3]

计算残差对三个权重的偏导
\frac{\partial MSE}{\partial wOb} .

梯度下降

根据\frac{\partial MSE}{\partial wOb} 能够计算出学习率 \alpha. 下面令 \alpha = 0.3

((O1_c - Y[1,]) + O1_c*(1-O1_c) + H[1,1])*0.3



$wOB^+ = 0.43 - 0.5888215623 =  -0.1588215623$  

重复反馈 ,梯度下降学习 wOH1 和 wOH2.

借用R语言包 进行神经网络模型训练

利用iris数据集 进行训练模型

head(iris)
Sepal.Length Sepal.Width Petal.Length Petal.Width Species
1 5.1 3.5 1.4 0.2 setosa
2 4.9 3.0 1.4 0.2 setosa
3 4.7 3.2 1.3 0.2 setosa
4 4.6 3.1 1.5 0.2 setosa
5 5.0 3.6 1.4 0.2 setosa
6 5.4 3.9 1.7 0.4 setosa

输入节点为:Sepal.Length Sepal.Width Petal.Length Petal.Width 四个节点
隐藏层:这里设置为3
输出层:为3 (setosa versicolor virginica 三种花的品类)

image.png

训练模型

X=data.frame(iris[,-5])
Y=data.frame(iris[,5])
b=data.frame(b=c(1,1,1,1))

test=sample(length(Y[,1]), length(Y[,1])*0.2, replace = FALSE, prob =NULL)
nnetGrid <-  expand.grid(size = seq(from = 3, to = 3, by = 1),
                        decay = seq(from = 0.1, to = 0.3, by = 0.1))
Y=as.factor(as.matrix(make.names(Y[,1])))

nnetFit <- train(x=X[-c(test),],
                 y=Y[-c(test)],
                 method = "nnet",
                 metric = "LogLoss",
                 maximize = FALSE,
                 trControl = ctrl,
                 type = "Classification",
                 tuneGrid = nnetGrid,
                 verbose = FALSE)

输出模型的结果:27个权重值

nnetFitfinalModelwts
[1] 0.20758258 0.37641741 1.17133396 -1.93620236 -0.88095565 2.20289698 1.81073473 2.08188073
[9] -2.90472414 -3.20650526 -0.20834478 -0.32335381 -0.94003857 1.37434281 0.73064675 -0.04939097
[17] 3.20299969 1.01741494 -2.94838942 -1.41771866 -2.94171307 3.86796547 0.82027531 1.46689381
[25] -0.26129214 -4.88532282 2.12818341

模型检验

library(RSNNS)
plot(nnetFit$results$LogLoss,type='l')
par(mar=c(0.1,0.1,1,0.1),mfrow=c(2,2))
par(mar=c(0.1,0.1,1,0.1),mfrow=c(2,2))
irisTargets<- decodeClassLabels(Y[test])
prediction_nn <- predict(nnetFit, newdata = X[test,],type="prob")
for(i in 1:3)
{

 
  k=roc(irisTargets[,i],as.numeric(prediction_nn[[i]]),plot=T,col=i);
  title(main=paste("roc",colnames(irisTargets)[i],collapse =" "))
}



#loss


prediction_nn <- predict(nnetFit, newdata = X[test,])

table(prediction_nn,  Y[test])

ROC曲线

image.png

混淆矩阵

table(prediction_nn, Y[test])
prediction_nn setosa versicolor virginica
setosa 9 0 0
versicolor 0 11 0
virginica 0 1 9

结束

神经网络,是由多个神经元组成的一个具有某种分类 回归的功能的黑箱。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359