全部版块 我的主页
论坛 数据科学与人工智能 IT基础
69 0
2025-11-12

一、引言:

在人工智能探索领域,主要存在两大流派并行推进发展:
符号主义
通过严谨的逻辑框架构建智能世界,采用明确规则与公理系统编码知识,形成易于理解的符号结构;而
连接主义
则另辟蹊径,效仿生物神经元的互联模式,让机器能够在大量数据中自主调节网络权重,进而生成隐含的知识表示。过去文章介绍的决策树、逻辑回归等基于符号主义的方法虽然具备推理透明的优势,在处理高维非线性信息时却表现出局限。
本期我们将关注更具有模仿生物特性的
连接主义方法论
。这种方法从大脑神经元运作中获得灵感,通过建立大规模并行互联的网络架构,使机器具备了从数据中自主提取知识的能力。作为连接主义的典型代表,
前馈神经网络(FNN)
显示出强大的模式识别能力。为了快速掌握其核心理念,我们借助三幅示意图阐述仿生智慧的核心:

图1展示的是自然界最基本的智能单元——生物神经元。其中树突负责接收信号,细胞体完成信息整合,轴突则将处理后的电信号传送出去。这种“接收-整合-发送”的模式构成了所有智能活动的生物学基础。

图2是把生物过程转化为数学语言的抽象表达。输入信号(向量x)经过权重矩阵W的加权处理,加上偏置项b,再通过激活函数f(·)的非线性转换,最终产生输出y。这个过程将突触强度转变为权重参数,生物开关抽象为数学公式。

图3则展示了由代码构建的“数字神经元群体”。信息从输入层进入,经过隐藏层的一系列抽象(隐藏层可以是单一层次也可以是多层。当神经网络的隐藏层数量较多时,则称为深度学习),最终在输出层形成预测结果。通过这种单向流动的信息处理模式,构成了前馈神经网络的基础架构。
网络的学习流程可概括为“预测—计算误差—反向传播—更新权重”的循环过程,类似于学生通过练习和改正错误不断提升成绩。R的neuralnet包已内置这一机制,只需设置网络结构即可自动完成。
本次文章将逐步演示如何使用neuralnet在十分钟内完成一个完整的神经网络建模。

二、基于R的神经网络二分类模型实例:

2.1加载R包与数据预处理
本例继续采用分类随机森林模型中使用的Sonar声呐数据集。该数据集包含208个观测值和61个变量。其中,响应变量为因子Class,表示声呐回波源自“金属”(记作M)或“岩石”(记作R);特征变量共60个(V1-V60),代表从不同角度与频段下声呐反射信号的能量。接下来我们将依据这60种不同的特征信号,通过神经网络模型来识别这些声呐信号是源自金属还是岩石。

library(mlbench)    # 包含Sonar数据集
library(neuralnet)  # 神经网络建模
library(caret)      # 数据分割、预处理和评估
library(pROC)

# 数据准备
data(Sonar)
dim(Sonar)  # 检查数据维度

# 数据清洗:处理缺失值(本例无缺失值)
if(sum(is.na(Sonar)) > 0) Sonar <- na.omit(Sonar)

# 设置随机种子确保可重复性
set.seed(1)

# 划分训练集和测试集 (7/3)
train_index <- createDataPartition(Sonar$Class, p = 0.7, list = FALSE)
train_data <- Sonar[train_index, ]
test_data <- Sonar[-train_index, ]

# 数据归一化 (只对特征变量,不包括标签)
normalize <- function(x) {
  (x - min(x)) / (max(x) - min(x))
}
features_norm <- as.data.frame(lapply(Sonar[, -61], normalize))

# 将类别标签转换为0-1变量(R=1, M=0)
class_numeric <- ifelse(Sonar$Class == "R", 1, 0)
Sonar_norm <- cbind(features_norm, Class = class_numeric)

在建立神经网络模型之前,需要对数据进行“预处理”,即对数据实施“归一化”,确保每个变量的最小值变为0,最大值变为1。

2.2初始模型构建:单隐藏层神经网络
接下来,我们来创建一个单隐藏层的神经网络模型。

set.seed(123)
nn_single <- neuralnet(
  Class ~ .,
  data = Sonar_norm[train_index, ],
  hidden = 10,            # 初始隐藏层神经元数
  linear.output = FALSE,  # 分类问题使用非线性输出
  act.fct = "logistic"   
)

# 初始模型评估
prob_single <- predict(nn_single, Sonar_norm[-train_index, ])
pred_single <- ifelse(prob_single > 0.5, "R", "M")  # 转换为类别标签
pred_single <- factor(pred_single, levels = c("M", "R"))  # 转换为因子

# 使用confusionMatrix计算详细指标 (正类为"M")
test_conf_single <- confusionMatrix(pred_single, test_data$Class, positive = "M")
cat("单隐藏层模型 (10神经元) 性能:\n")
print(test_conf_single)

参数“hidden=10”表示单一隐藏层包含10个神经元;参数“act.fct="logistic"”指定使用logistic函数作为激活函数(这是默认配置);参数“linear.output = FALSE”意味着对输出层也应用logistic激活函数。

2.3双隐藏层模型构建与评估
接下来尝试创建一个具有两个隐藏层的神经网络模型,通过参数“hidden = c(4,4)”我们可以将第一个和第二个隐藏层分别设定为包含4个神经元。

set.seed(123)
nn_double <- neuralnet(
  Class ~ .,
  data = Sonar_norm[train_index, ],
  hidden = c(4, 4),      # 双隐藏层结构
  linear.output = FALSE,
  act.fct = "logistic"
)

# 双层模型评估
prob_double <- predict(nn_double, Sonar_norm[-train_index, ])
pred_double <- ifelse(prob_double > 0.5, "R", "M")
pred_double <- factor(pred_double, levels = c("M", "R"))

# 使用confusionMatrix计算详细指标
test_conf_double <- confusionMatrix(pred_double, test_data$Class, positive = "M")
cat("\n双隐藏层模型 (4-4神经元) 性能:\n")
print(test_conf_double)

对比单隐藏层与双隐藏层的结果。可以看出,这个双隐藏层模型(4-4神经元)的准确性比上述单隐藏层模型(10神经元)更高。接下来,我们将继续探讨不同数量的双隐藏层神经元如何影响模型性能。

2.4参数调整确定最佳双隐藏层结构
这里仅简单展示参数配置过程,有兴趣的朋友可以自行尝试其他设置。

best_accuracy <- 0
best_config <- c(0, 0)
accuracy_matrix <- matrix(NA, nrow = 10, ncol = 10)

for(i in 1:10) {
  for(j in 1:10) {
    set.seed(123)
    model <- neuralnet(
      Class ~ .,
      data = Sonar_norm[train_index, ],
      hidden = c(i, j),
      linear.output = FALSE,
      act.fct = "logistic"
    )
    prob <- predict(model, Sonar_norm[-train_index, ])
    pred <- ifelse(prob > 0.5, "R", "M")
    pred <- factor(pred, levels = c("M", "R"))

    # 使用confusionMatrix计算准确率
    conf_matrix <- confusionMatrix(pred, test_data$Class, positive = "M")
    current_accuracy <- conf_matrix$overall['Accuracy']
    accuracy_matrix[i, j] <- current_accuracy

    if(current_accuracy > best_accuracy) {
      best_accuracy <- current_accuracy
      best_config <- c(i, j)
    }
  }
}

# 输出最优参数
cat("\n===== 最优参数结果 =====\n")
cat("最佳隐藏层配置:", best_config[1], "-", best_config[2], "神经元\n")
cat("最高准确率:", best_accuracy, "\n")
print("准确率矩阵:")
print(accuracy_matrix)

从上述结果可以看出,在这个10*10的矩阵中,7-5双层神经元的准确性最高。

2.5最终模型拟合与评估
接下来,我们将对7-5的双隐藏层模型进行评估并绘制其神经网络图。

set.seed(123)
final_nn <- neuralnet(
  Class ~ .,
  data = Sonar_norm[train_index, ],
  hidden = best_config,
  linear.output = FALSE,
  act.fct = "logistic"
)

# 最终模型评估
prob_final <- predict(final_nn, Sonar_norm[-train_index, ])
pred_final <- ifelse(prob_final > 0.5, "R", "M")
pred_final <- factor(pred_final, levels = c("M", "R"))

# 使用confusionMatrix计算详细指标 (正类为"M")
test_conf_final <- confusionMatrix(pred_final, test_data$Class, positive = "M")
cat("\n最终模型性能:\n")
print(test_conf_final)

这是最佳模型的混淆矩阵结果。接下来,我们继续可视化神经网络:

plot(final_nn, rep = "best", 
     col.entry = "skyblue", 
     col.hidden = "lightgreen",
     col.out = "salmon",
     main = "最优神经网络结构")

2.6与逻辑回归对比
最后,我们将简单地将该模型的预测结果与逻辑回归的预测效果进行比较:

logit_model <- glm(Class ~ ., 
                   data = train_data, 
                   family = binomial(link = "logit"))
prob_logit <- predict(logit_model, test_data, type = "response")
pred_logit <- ifelse(prob_logit > 0.5, "R", "M")
pred_logit <- factor(pred_logit, levels = c("M", "R"))

# 使用confusionMatrix计算详细指标
logit_conf <- confusionMatrix(pred_logit, test_data$Class, positive = "M")
cat("\n逻辑回归性能:\n")
print(logit_conf)

可以看出,神经网络模型的表现明显优于逻辑回归模型。
简要查看这两个模型的预测结果(受篇幅限制,仅展示前20个)。

# 模型预测结果
results <- data.frame(
  Actual = test_data$Class,
  NN_Probability = prob_final,
  NN_Prediction = pred_final,
  Logit_Probability = prob_logit,
  Logit_Prediction = pred_logit
)

# 查看前20个样本的预测结果
print(head(results, 20))

最后,绘制ROC曲线评估两个模型的表现。

roc_nn <- roc(response = test_data$Class, predictor = as.numeric(prob_final))
roc_logit <- roc(response = test_data$Class, predictor = prob_logit)

plot(roc_nn, col = "blue", main = "ROC曲线比较")
lines(roc_logit, col = "red")
legend("bottomright", legend = c(paste("神经网络 (AUC =", round(auc(roc_nn), 3)), 
                                 paste("逻辑回归 (AUC =", round(auc(roc_logit), 3))), 
       col = c("blue", "red"), lwd = 2)

三、总结:

本次实践展示了神经网络在声呐数据分类中的应用,突显了其处理复杂模式识别任务时的优势。通过R语言的neuralnet包,我们迅速构建并优化了神经网络模型,最终达到了超越传统方法的分类效果。
如何学习大规模模型?
学习AI大型模型是一个系统化的过程,需要从基础知识开始,逐步深入到更高级的技术领域。

这里为大家仔细筛选了一份详尽的AI大模型学习资料,涵盖:从基础到实践的完整学习路径、精选的大模型学习书籍与手册、视频教程、实战练习以及面试题目等,这些资源均免费提供!这是一份适合零起点至进阶阶段的学习路线概览,建议大家收藏起来。

100个AI大模型商业化实施方案

大模型完整视频教程集锦

200册大模型PDF图书

????掌握后的成果:???? ? 基于大模型的全栈开发实现(包括前端、后端、产品经理、设计和数据分析等),学习本课程将有助于提升多种技能; ? 能够利用大模型解决实际项目中的需求:在大数据背景下,众多企业和机构面临大量数据处理的需求,使用大模型技术能够更高效地处理这些信息,增强数据分析与决策的精确度。因此,掌握大模型应用开发技巧,可以使开发者更好地满足真实项目的挑战; ? 基于企业级数据AI应用的开发,达成大模型理论的理解、掌握GPU运算能力、硬件知识以及LangChain开发框架和项目实战技能,学会垂直领域的细调训练(包括数据准备、数据提炼及大模型部署)一应俱全的学习; ? 能够完成当前热门的大模型特定领域模型训练任务,提高开发者的编程技巧:学习大模型应用开发涉及掌握机器学习算法、深度学习平台等技术,这些技能的获取可以增强开发者的编码与分析能力,使其能够更熟练地编写高质量代码。 LLM面试题目汇总

大模型产品经理资料集锦

大模型项目实战资源合辑

????有兴趣的朋友,可以通过扫描下方二维码免费获取【确保100%无费用】????

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群