理解神经网络
一只猫大约有10亿个神经元,一只老鼠大约有7500万个神经元。
相比之下,许多人工神经网络包含的神经元要少得多,通常只有几百个。
所以我们在不久的将来随时创建一个人工大脑是没有危险的。
从生物神经元到人工神经元
使用输入的数据以获得等离子体参数的一种计算机编码或者电路,这种编码预先对一系列实例按“人脑思维过程”进行训练。
神经网络也是一种预测算法,只是不是线性的,准测率比多元线性回归高,但是消耗资源也更多
网络拓扑:描述了模型中神经元的数量以及层数和它们连接的方式。
训练算法:指定如何设置连接权重,以便抑制或增加某个神经元在输入信号中的比重。
激活函数:将神经元的净输入信号转换成单一的输出信号,以便进一步在网络中传播。
激活函数(Activation Function)
激活函数是用来加入非线性因素的,因为线性模型的表达能力不够。
目前常用
ReLU : (Rectified Linear Units) 变的越来越受欢迎
f(x)=max(0,x)
Sigmoid : 是常用的非线性的激活函数,它的数学形式如下:
Sigmoid : 是常用的非线性的激活函数,它的数学形式如下:
它能够把输入的连续实值“压缩”到0和1之间。
网络拓扑层—单层网络
求出模型也是求出其中的 w1、w2、w3
对输入的一个维度的值,当它受到另外一个因素影响时,它的输出结果是不同,这时单层网络就不行了,这时就需要增加隐藏节点
网络拓扑层—多层网络
网络拓扑层—多层网络
训练神经网络
误差值并 不是越小越好,可能会 过拟合(这个模型过于拟合这部分数据,并不适应于其他数据。)
解决办法:
增加数据、修改算法、增加训练集
增加训练集:
这时可以把将数据分为训练集、测试集
训练、测试比例 6:4、7:3、8:2都可以
归一化
减小数据值的范围,将数据离散化
这里是最大值最小值归一化,根据公式结果范围为0~1
神经网络我们一定要去做归一化!, 减少计算难度
例子:
normalize <- function(x){
return ((x - min(x)) / (max(x) - min(x)))
}
最大值最小值归一化 缺点:
容易受到异常值影响,例如大部分数据都集中在 0~100,假如这时最大值为1000,那么经过归一化后,数据会到 0~1000,反而范围扩大了
增加模型准确率:
增加隐藏节点,
但是增加节点也就意味着需要计算更多的时间和更多的计算资源
水泥例子
把数据(不同的调料配比得到的水泥强度)分成训练集和测试集
根据训练集,通过神经网络求得模型
将测试集带入模型求得强度,与测试集的强度求相关系数,得到模型正确率。
数据:
代码:
concrete <- read.csv("NeuralNetworks/data/concrete.csv")
#查看结构
str(concrete)
#定义归一化函数
#减小数据值的范围
#将数据离散化
#这里是最大值最小值归一化,根据公式结果范围为0~1
normalize <- function(x){
return ((x - min(x)) / (max(x) - min(x)))
}
#最大值最小值归一化缺点:
# 容易受到异常值影响,例如单单最大值比平均值大很多
#应用归一化,as.data.frame返回dataFrame
# lapply(数据对象,函数名)
concrete_norm <- as.data.frame(lapply(concrete, normalize))
#显示概要:对比没有归一化与归一化 值的范围
summary(concrete_norm$strength)
summary(concrete$strength)
#避免过拟合,将数据分为训练集、测试集
#训练集:取1至773行的所有列
#测试集:取774至1030行的所有列
#训练、测试比例 6:4、7:3、8:2都可以
concrete_train <- concrete_norm[1:773,]
concrete_test <- concrete_norm[774:1030,]
#用训练集用neuralnet生成模型
#neuralnet(因变量+ ~ + 作为维度的列,data=数据对象)
#需要导入neuralnet包:
# 先安装neuralnet包后
# 在右下角点Packages标签,勾选neuralnet即导入
concrete_model <- neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age, data=concrete_train)
#用模型生成神经网络图
# error带入训练集的误差值
# steps求解最优解的计算步数
plot(concrete_model)
#取测试集的1-8列带入模型进行测试,得到模型的预测结果
model_results <- compute(concrete_model, concrete_test[1:8])
#得到结果列
predicted_strength <- model_results$net.result
#计算预测值与测试集的相关系数
#即模型的预测准确率
cor(predicted_strength, concrete_test$strength)
#提高预测准确度
#增加了隐藏层的隐藏节点的个数
#指定hidden参数指定隐藏节点个数
concrete_model2 <- neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age, data=concrete_train, hidden=5)
#查看此时的网络图
plot(concrete_model2)
#查看增加节点后的预测准确度
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)
完整代码:
concrete <- read.csv("NeuralNetworks/data/concrete.csv")
#查看结构
str(concrete)
#定义归一化函数
#减小数据值的范围
#将数据离散化
#这里是最大值最小值归一化,根据公式结果范围为0~1
normalize <- function(x){
return ((x - min(x)) / (max(x) - min(x)))
}
#最大值最小值归一化缺点:
# 容易受到异常值影响,例如单单最大值比平均值大很多
#应用归一化,as.data.frame返回dataFrame
# lapply(数据对象,函数名)
concrete_norm <- as.data.frame(lapply(concrete, normalize))
#显示概要:对比没有归一化与归一化 值的范围
summary(concrete_norm$strength)
summary(concrete$strength)
#避免过拟合,将数据分为训练集、测试集
#训练集:取1至773行的所有列
#测试集:取774至1030行的所有列
#训练、测试比例 6:4、7:3、8:2都可以
concrete_train <- concrete_norm[1:773,]
concrete_test <- concrete_norm[774:1030,]
#用训练集用neuralnet生成模型
#neuralnet(因变量+ ~ + 作为维度的列,data=数据对象)
#需要导入neuralnet包:
# 先安装neuralnet包后
# 在右下角点Packages标签,勾选neuralnet即导入
concrete_model <- neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age, data=concrete_train)
#用模型生成神经网络图
# error带入训练集的误差值
# steps求解最优解的计算步数
plot(concrete_model)
#取测试集的1-8列带入模型进行测试,得到模型的预测结果
model_results <- compute(concrete_model, concrete_test[1:8])
#得到结果列
predicted_strength <- model_results$net.result
#计算预测值与测试集的相关系数
#即模型的预测准确率
cor(predicted_strength, concrete_test$strength)
#提高预测准确度
#增加了隐藏层的隐藏节点的个数
#指定hidden参数指定隐藏节点个数
concrete_model2 <- neuralnet(strength ~ cement + slag + ash + water + superplastic + coarseagg + fineagg + age, data=concrete_train, hidden=5)
#查看此时的网络图
plot(concrete_model2)
#查看增加节点后的预测准确度
model_results2 <- compute(concrete_model2, concrete_test[1:8])
predicted_strength2 <- model_results2$net.result
cor(predicted_strength2, concrete_test$strength)