R语言 多层神经网络
一系列或一组试图通过模仿人脑操作的明确过程来识别数据集中的潜在关系的算法被称为神经网络。因此,神经网络可以指人类的神经元,无论是人工的还是有机的性质。一个神经网络可以很容易地适应不断变化的输入,以实现或产生网络的最佳结果,不需要重新设计输出标准。
神经网络的类型
神经网络可以根据其层数和深度激活过滤器、结构、使用的神经元、神经元密度、数据流等分为多种类型。神经网络的类型如下。
- 感知器
- 多层感知器或多层神经网络
- 前馈神经网络
- 卷积神经网络
- 径向基函数神经网络
- 递归神经网络
- 序列到序列模型
- 模块化神经网络
多层神经网络
准确地说,一个完全连接的多层神经网络被称为多层感知器。多层神经网络由多层的人工神经元或节点组成。与单层神经网络不同,近来大多数网络都有多层神经网络。下图是一个多层神经网络的可视化图示。
解释: 这里标记为 “1 “的节点被称为 偏置单元。 最左层或第1层是 输入层 ,中间层或第2层是 隐藏层 ,最右层或第3层是 输出层。 可以说,上图有 3个输入单元 (离开偏置单元), 1个输出单元,和4个隐藏单元(不包括1个偏置单元)。
多层神经网络是 前馈神经网络 的一个典型例子 。 神经元的数量和层数是神经网络的超参数,需要进行调整。为了找到超参数的理想值,我们必须使用一些交叉验证技术。使用反向传播技术,进行重量调整训练。
多层神经网络的公式
假设我们有xn 个输入(x1 , x2 ….xn )和一个偏置单元。假设应用的权重是w1 , w2 …..wn。 然后找到输入和权重之间进行点乘的总和和偏置单元为。
r = Σmi=1 wixi + bias
在将r送入激活函数F(r)时,我们发现隐藏层的输出。对于第一个隐藏层h1 ,神经元可以被计算为。
h11 = F(r)
对于所有其他的隐藏层,重复同样的程序。不断重复这个过程,直到达到最后的权重设置。
R语言 实现多层神经网络
在R语言中,安装 neuralnet 包来研究神经网络的概念。 neuralnet 包需要一个全数字的矩阵或数据框。通过对 neuralnet() 函数的隐藏参数提到数值来控制隐藏层,对于许多隐藏层来说可以是一个向量。每次都使用 set.seed() 函数来生成随机数。
例子: 使用 neuralnet 包来拟合一个线性模型。让我们看看在R中拟合多层神经网络的步骤。
第 1步: 第1步是选择数据集。在这个例子中,让我们在 MASS 包的 波士顿 数据集上工作。这个数据集通常涉及波士顿边缘地区或郊区的住房价值。我们的目标是通过使用所有其他可用的连续变量,找到房主所住房屋的medv或中位数值。使用 set.seed() 函数来生成随机数。
set.seed(500)
library(MASS)
data <- Boston
第2步: 然后 检查数据 集中的 缺失值或数据点 。如果有,则修复缺失的数据点。
apply(data, 2, function(x) sum(is.na(x)))
输出
crim zn indus chas nox rm age dis rad tax ptratio black lstat medv
0 0 0 0 0 0 0 0 0 0 0 0 0 0
第3步: 由于没有数据点丢失,所以继续 准备数据集。 现在,随机地将数据分成两组,训练组和测试组。在准备数据时,尝试 用线性回归模型来拟合数据 ,然后在测试集上进行 测试 。
index <- sample(1 : nrow(data),
round(0.75 * nrow(data)))
train <- data[index, ]
test <- data[-index, ]
lm.fit <- glm(medv~., data = train)
summary(lm.fit)
pr.lm <- predict(lm.fit, test)
MSE.lm <- sum((pr.lm - test$medv)^2) / nrow(test)
输出
Deviance Residuals:
Min 1Q Median 3Q Max
-14.9143 -2.8607 -0.5244 1.5242 25.0004
Coefficients:
Estimate Std. Error t value Pr(>|t|)
(Intercept) 43.469681 6.099347 7.127 5.50e-12 ***
crim -0.105439 0.057095 -1.847 0.065596 .
zn 0.044347 0.015974 2.776 0.005782 **
indus 0.024034 0.071107 0.338 0.735556
chas 2.596028 1.089369 2.383 0.017679 *
nox -22.336623 4.572254 -4.885 1.55e-06 ***
rm 3.538957 0.472374 7.492 5.15e-13 ***
age 0.016976 0.015088 1.125 0.261291
dis -1.570970 0.235280 -6.677 9.07e-11 ***
rad 0.400502 0.085475 4.686 3.94e-06 ***
tax -0.015165 0.004599 -3.297 0.001072 **
ptratio -1.147046 0.155702 -7.367 1.17e-12 ***
black 0.010338 0.003077 3.360 0.000862 ***
lstat -0.524957 0.056899 -9.226 < 2e-16 ***
---
Signif. codes: 0 ‘***’ 0.001 ‘**’ 0.01 ‘*’ 0.05 ‘.’ 0.1 ‘ ’ 1
(Dispersion parameter for gaussian family taken to be 23.26491)
Null deviance: 33642 on 379 degrees of freedom
Residual deviance: 8515 on 366 degrees of freedom
AIC: 2290
Number of Fisher Scoring iterations: 2
第4步: 现在,在训练神经网络之前 对数据集进行规范化处理 。因此,对数据进行缩放和分割。 scale() 函数返回一个矩阵,需要在数据框架中强制执行。
maxs <- apply(data, 2, max)
mins <- apply(data, 2, min)
scaled <- as.data.frame(scale(data,
center = mins,
scale = maxs - mins))
train_ <- scaled[index, ]
test_ <- scaled[-index, ]
第5步: 现在 将数据装入神经网络。 使用 neuralnet 包。
library(neuralnet)
n <- names(train_)
f <- as.formula(paste("medv ~",
paste(n[!n %in% "medv"],
collapse = " + ")))
nn <- neuralnet(f,
data = train_,
hidden = c(4, 2),
linear.output = T)
现在,我们的模型被拟合到多层次神经网络中。现在,结合所有的步骤,同时绘制神经网络,使输出可视化。使用 plot() 函数来做。
# R program to illustrate
# Multi Layered Neural Networks
# Use the set.seed() function
# To generate random numbers
set.seed(500)
# Import required library
library(MASS)
# Working on the Boston dataset
data <- Boston
apply(data, 2, function(x) sum(is.na(x)))
index <- sample(1 : nrow(data),
round(0.75 * nrow(data)))
train <- data[index, ]
test <- data[-index, ]
lm.fit <- glm(medv~., data = train)
summary(lm.fit)
pr.lm <- predict(lm.fit, test)
MSE.lm <- sum((pr.lm - test$medv)^2) / nrow(test)
maxs <- apply(data, 2, max)
mins <- apply(data, 2, min)
scaled <- as.data.frame(scale(data,
center = mins,
scale = maxs - mins))
train_ <- scaled[index, ]
test_ <- scaled[-index, ]
# Applying Neural network concepts
library(neuralnet)
n <- names(train_)
f <- as.formula(paste("medv ~",
paste(n[!n %in% "medv"],
collapse = " + ")))
nn <- neuralnet(f, data = train_,
hidden = c(4, 2),
linear.output = T)
# Plotting the graph
plot(nn)
输出