1 目的
在当今的科技时代,人工智能技术已经深入到各个领域,为我们的生活和工作带来了诸多便利。其中,人工神经网络作为深度学习技术的核心,具有强大的数据处理和模式识别能力,被广泛应用于各种预测和分类问题中。今天,我们将探讨如何运用人工神经网络对混凝土的强度进行建模。
2 数据来源
该演示数据来源于: 机器学习和智能系统中心
3 案例演示
3.1 探索数据
3.1.1 读取数据并查看数据类型
运行代码:
data<-read.csv("G:\\concrete.csv") #数据读取 str(data) #数据类型
结果展示:
## 'data.frame': 1030 obs. of 9 variables: ## $ cement : num 141 169 250 266 155 ... ## $ slag : num 212 42.2 0 114 183.4 ... ## $ ash : num 0 124.3 95.7 0 0 ... ## $ water : num 204 158 187 228 193 ... ## $ superplastic: num 0 10.8 5.5 0 9.1 0 0 6.4 0 9 ... ## $ coarseagg : num 972 1081 957 932 1047 ... ## $ fineagg : num 748 796 861 670 697 ... ## $ age : int 28 14 28 28 28 90 7 56 28 28 ... ## $ strength : num 29.9 23.5 29.2 45.9 18.3 ...
通过运行结果我们可以看到数据框中9个变量为数值型或整型,全部数据数值范围大概为从0到1000多,由于神经网络的运行最好将输入数据缩放到0附近的狭窄范围,这里采用极大极小值标准化的方法将数值范围缩放为0-1。
3.1.2 定义标准化函数并查看函数效果
运行代码:
normalize<-function(x){ return((x-min(x))/(max(x)-min(x))) } #极大极小值标准化函数 data1<-as.data.frame(lapply(data,normalize)) #标准化数据 summary(data$strength) #标准化前 summary(data1$strength) #标准化后
结果展示:
> summary(data$strength) #标准化前 ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 2.33 23.71 34.45 35.82 46.13 82.60 > summary(data1$strength) #标准化后 ## Min. 1st Qu. Median Mean 3rd Qu. Max. ## 0.0000 0.2664 0.4001 0.4172 0.5457 1.0000
以混凝土强度数据为例,测试函数效果,通过运行结果可以看到:混凝土强度范围由2.33-82.60缩放为0-1,说明函数测试效果是可行的。
3.2 模型的建立及优化
3.2.1 建立训练集及测试集
运行代码:
data1_train<-data1[1:773,] #训练集 data1_test<-data1[774:1030,] #测试集
根据Yeh原始文献示例,将数据划分为一个具有75%案例的训练集和一个具有25%案例的测试集。故将标准化后的数据前773行作为训练集,后257行数据作为测试集。
3.2.2 基于数据训练模型
运行代码:
library("neuralnet") data1_model<-neuralnet(strength~cement+slag +ash+water+superplastic+coarseagg+fineagg+age, data=data1_train) #训练中只有一个单一隐藏节点 plot(data1_model) #网络拓扑结构可视化
结果展示:
根据运行结果显示,模型误差平方和为5.078,经过4072次迭代。
3.2.3 评估模型性能
运行代码:
model_results<-compute(data1_model,data1_test[1:8]) predicted_strength<-model_results$net.result #预测值 cor(predicted_strength,data1_test$strength) #预测强度与真实值的相关性
结果展示:
## [,1] ## [1,] 0.8056153
经过单节点建立的神经网络模型,预测的混凝土强度与真实值之间的相关性大约为0.8057,表示具有一个相当强的线性关系,采用只有一个单一的隐藏节点,已经有个很好的预测效果。考虑到只使用了一个隐藏节点,尝试建立具有5个隐藏节点的神经网络模型进行进一步优化(相关系数每次运行结果具有一定偏差)。
3.2.4 提高模型的性能
通过修改隐藏层节点个数进行优化。
运行代码:
data1_model2<-neuralnet(strength~cement+slag+ash+water+superplastic+coarseagg+fineagg+age, data=data1_train,hidden = 5)#隐藏节点个数为5 plot(data1_model2)
结果展示:
据报告结果显示,模型的误差由之前的5.078降为1.796。此外,训练步数由4072步上升为35141步。
model_results2<-compute(data1_model2,data1_test[1:8]) predicted_strength2<-model_results2$net.result #预测值 cor(predicted_strength2,data1_test$strength) #预测强度与真实值的相关性
## [,1] ## [1,] 0.930881
利用相同步骤对预测值和真实值进行比较,这里获得的相关系数达0.9185,与之前具有的单个隐藏节点的结果0.8063相比,有了相当大的优化效果(相关系数每次运行结果具有一定偏差)。
3.2.5 模型拟合效果
运行代码:
par(mfrow = c(3,1)) #创建3×1画布 t<-c(1:257) k1<-data1_test[c(9)] #原始数据 k2<-predicted_strength #单节点 k3<-predicted_strength2 #多节点 mmm<-data.frame(t,k1,k2,k3) names(mmm)<-c("index","k1","k2","k3") mmm1<-mmm[order(mmm[,3],decreasing = F),] #按单节点升序排列 plot(mmm1$k2,type="l",col="red",lwd=2,main="单节点模型") points(mmm1$k1,type = "p",pch=8,cex=1) mmm2<-mmm[order(mmm[,4],decreasing = F),] #按多节点升序排列 plot(mmm2$k3,type="l",col="green",lwd=2,main="多节点模型") points(mmm2$k1,type = "p",pch=8,cex=1) mmm2<-mmm[order(mmm[,4],decreasing = F),] #按多节点升序排列 plot(mmm2$k3,type="l",col="blue",lwd=2,main="单节点及多节点对比") lines(mmm1$k2,col="red",lwd=2) points(mmm2$k1,type = "p",pch=4,cex=1,col="blue") points(mmm1$k1,type = "p",pch=8,cex=1,col="red") abline(h=0.6,lty=2) abline(h=0.08,lty=2) legend("topleft", legend=c("多节点","单节点"), col=c("blue","red"), lty = c(1,1), pch=c(4,8), lwd=2)
结果展示:
根据结果显示,模型拟合整体效果较好,单节点和多节点神经网络模型在标准化混凝土强度数据中,0.08-0.5之间两种模型拟合效果大致相同,超过0.5后存在一定偏差。