【R语言实战】——多模型预测及评价

news2024/9/24 13:17:12

🍉CSDN小墨&晓末:https://blog.csdn.net/jd1813346972

   个人介绍: 研一|统计学|干货分享
         擅长Python、Matlab、R等主流编程软件
         累计十余项国家级比赛奖项,参与研究经费10w、40w级横向

文章目录

  • 1 项目任务
  • 2 数据集介绍
  • 3 加载相关包并读取数据
  • 4 探索和准备数据
  • 5 划分训练集和测试集
  • 6 拟合最小二乘线性回归模型
  • 7 拟合岭回归模型
  • 8 拟合LASSO模型
  • 9 拟合 PCR 模型
  • 10 拟合PLS模型
  • 11 模型评估
  • 12 完整代码

该篇文章主要展示了利用R语言建立最小二乘线性回归、岭回归、LASSO、PCR、PLS五种模型对“College”数据集中的申请数量进行预测,并进行模型评估。

1 项目任务

  使用“College”数据集中的其他变量预测收到的申请数量。

   (a)将数据集分成训练集和测试集。

   (b)在训练集上使用最小二乘法拟合线性模型,并报告所获得的测试误差。

   ©在训练集上拟合岭回归模型,通过交叉验证选择 λ。报告获得的测试误差。

   (d)在训练集上拟合 LASSO 模型,通过交叉验证选择 λ。报告获得的测试误 差,以及非零系数估计值的数量。

   (e)在训练集上拟合 PCR 模型,通过交叉验证选择 M。报告获得的测试误差, 以及通过交叉验证选择的 M 值。

   (f)在训练集上拟合 PLS 模型,通过交叉验证选择 M。报告获得的测试误差, 以及通过交叉验证选择的 M 值。

   (g)对获得的结果进行评论。我们能多准确地预测收到的大学申请数量?这 五种方法产生的测试误差有很大差别吗?

2 数据集介绍

  这个数据集包含了大量关于不同学校的详细数据,主要变量包括: 1.Private:是否为私立学校。 2.Apps:申请人数。 3.Accept:被录取人数。 4.Enroll:注册人数。 5.Top10perc:排名前 10%的新生比例。 6.Top25perc:排名前 25%的新生比例。 7.F.Undergrad:全职本科生人数。 8.P.Undergrad:兼职本科生人数。 9.Outstate:州外学费。 10.Room.Board:房间和伙食费用。 11.Books:书籍费用。 12.Personal:个人费用。 13.PhD:拥有博士学位的教师比例。 14.Terminal:教师拥有终极学位的比例。 15.S.F.Ratio:学生与教师的比例。 16.perc.alumn:捐赠的校友比例。 17.Expend:学生教育支出。 18.Grad.Rate:毕业率。 此外,该数据集还公布了学校名称。

3 加载相关包并读取数据

  运行程序:

library("class")  
library("caret") 
library("gmodels") 
library('pls')
data<- read.csv("D:\\机器学习与R语言\\College.csv",header = T)
head(data)     #查看前六行

  运行结果:

4 探索和准备数据

  1)使用 str()发现,该数据集共有 777 个观测值,19 个属性,同时,其涉及 的数据类型有字符型(int)和整型(int),其中“Apps”为目标变量。

  运行程序:

str(data)                       #查看数据类型

  运行结果:

  2)使用 table()函数输出数据集中“Private”变量分布情况,同时利用 ifelse ()函数将其转化为 0-1 变量,其中“Yes”转化为 1,“No”转化为 0。该数据 集中,私立学校和公立学校数量分别为 565、212。

  运行程序:

table(data$Private)
data$Private_Yes=ifelse(data$Private=="Yes",1,0) #将分类变量Private转化为0-1变量,保存为Private_Yes
data=data[c(1,3:20)]                            ##剔除字符变量Private

  运行结果:

  3)利用 summary()查看各变量数据特征情况,见运行结果,包括每个特 征的最小值,1/4 分位数,中位数,均值,3/4 分位数,最大值。其中“Apps”数 量分布在 81-48094 之间。

  运行程序:

data<-data[c('Apps','Accept','Enroll',
             'Top10perc','Top25perc','F.Undergrad','P.Undergrad',
             'Outstate','Room.Board','Books','Personal',
             'PhD','Terminal','S.F.Ratio','perc.alumni','Expend','Grad.Rate',
             'Private_Yes')]

summary(data)

  运行结果:

5 划分训练集和测试集

  运行程序:

set.seed(123) #设置随机种子以保证结果可重复
trainIndex=createDataPartition(data$Apps,p=0.8,
                               list=FALSE,
                               times=1)


data_train<-data[trainIndex, ] #创建训练集
data_test<-data[-trainIndex, ] #创建测试集

6 拟合最小二乘线性回归模型

  1)模型总结。训练集中,根据运行结果显示,线性回归方程 F 值为 537.3, p 值远小于 0.05,说明拟合的回归方程在 0.05 的显著性水平上显著成立。拟合优 度 R 2 为 0.9378,说明申请数量有 93.78%的信息可以用模型中的自变量来解释, 模型效果较好。其中,变量“Accept”、“Enroll”、“Top10perc”、“Top25perc”、 “F.Undergrad”、“Outstate”、“Expend”、“Grad.Rate”、“Private_Yes”在 0.05 的显著性水平下,对因变量“Apps”存在显著影响。

  运行程序:

lm_model=lm(Apps~.,data=data_train) #拟合线性回归模型
summary(lm_model)

  运行结果:

  2)测试误差。根据运行结果显示,最小二乘线性回归模型,在测试集表现 中,RMSE 为 1106.46,MAE 为 609.14。

  运行程序:

lm_pred=predict(lm_model,newdata=data_test) #对测试集进行预测
lm_error_RMSE=sqrt(mean((lm_pred-data_test$Apps)^2)) #计算均方根误差
lm_error_MAE=mean(abs(lm_pred-data_test$Apps)) #计算绝对平均误差

print(paste("线性模型测试误差RMSE:",lm_error_RMSE))
print(paste("线性模型测试误差MAE:",lm_error_MAE))

  运行结果:

7 拟合岭回归模型

  1)模型总结。训练集中,在拟合岭回归模型过程中,利用交叉验证的方式 选择最优正则化λ,根据结果运行显示,对应最小 MSE 的λ值为 388.9,MSE 为1785806,在该 λ 值下,模型中非零系数的数量为 17(不包含截距项),且在最小 MSE 的一个标准误差内的最大 λ 值为 1430.4,MSE 为 2405994,该 λ 值 下,模型中非零系数的数量为 17(不包含截距项)。

  运行程序:

ridge_model=cv.glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps,alpha=0) #交叉验证拟合岭回归模型
print(ridge_model) #输出模型

  运行结果:

  2)测试误差。根据运行结果显示,交叉验证的岭回归模型,在测试集表现 中,RMSE 为 1108.10,MAE 为 605.30。

  运行程序:

ridge_model <- glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps, alpha = 0, lambda = best_lambda)

ridge_pred <- predict(ridge_model, newx = as.matrix(data_test[,-c(1)]), s = best_lambda)  

ridge_error_RMSE=sqrt(mean((ridge_pred-data_test$Apps)^2)) #计算均方根误差
ridge_error_MAE=mean(abs(ridge_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证岭回归测试误差RMSE:",ridge_error_RMSE))
print(paste("交叉验证岭回归测试误差MAE:",ridge_error_MAE))

  运行结果:

8 拟合LASSO模型

  1)模型总结。训练集中,在拟合 LASSO 回归模型过程中,利用交叉验证 的方式选择最优正则化λ,根据结果运行显示,对应最小 MSE 的λ值为 2.1,MSE 为 1346355,在该 λ 值下,模型中非零系数的数量为 17(不包含截距 项),且在最小 MSE 的一个标准误差内的最大 λ 值为 346.2,MSE 为 1587747,该 λ 值下,模型中非零系数的数量为 2(不包含截距项)。

  运行程序:

lasso_model=cv.glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps,alpha=1) #交叉验证拟合lasso回归模型
print(lasso_model) #输出模型

  运行结果:

  2)测试误差。根据运行结果显示,交叉验证的 LASSO 回归模型,在测试 集表现中,RMSE 为 1099.85,MAE 为 604.00。

  运行程序:

best_lambda <- lasso_model$lambda.min 
print(paste("最优lambda:",best_lambda))

# 使用最佳λ在训练集上重新拟合模型  
lasso_model <- glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps, alpha = 1, lambda = best_lambda)
lasso_pred=predict(lasso_model,newx = as.matrix(data_test[,-c(1)]), s = best_lambda) #对测试集进行预测
lasso_error_RMSE=sqrt(mean((lasso_pred-data_test$Apps)^2)) #计算均方根误差
lasso_error_MAE=mean(abs(lasso_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证LASSO回归测试误差RMSE:",lasso_error_RMSE))
print(paste("交叉验证LASSO回归测试误差MAE:",lasso_error_MAE))

  运行结果:

9 拟合 PCR 模型

  1)模型总结。训练集中,在拟合 PCR 模型过程中,利用交叉验证的方式 选择最优主成分数量 M 为 10,当使用 10 个主成分时,可以解释原始数据中 85.87%的方差,解释能力较强。

  运行程序:

##拟合PCR模型
pcr_model=train(Apps~.,data=data_train,method="pcr",
                preProcess=c("center","scale"),tuneLength=10) #交叉验证拟合主成分回归模型

##选定的主成分数M
print(paste("选定的主成分数 (M):",pcr_model$bestTune))
print(summary(pcr_model))

  运行结果:

  2)测试误差。根据运行结果显示,交叉验证的 PCR 模型,在测试集表现 中,RMSE 为 1021.33,MAE 为 707.41。

  运行程序:

pcr_pred=predict(pcr_model,newdata=data_test)

pcr_error_RMSE=sqrt(mean((pcr_pred-data_test$Apps)^2)) #计算均方根误差
pcr_error_MAE=mean(abs(pcr_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证PCR模型测试误差RMSE:",pcr_error_RMSE))
print(paste("交叉验证PCR模型测试误差MAE:",pcr_error_MAE))

  运行结果:

10 拟合PLS模型

  1)模型总结。训练集中,在拟合 PLS 回归模型过程中,利用交叉验证的 方式选择最优主成分数量 M 为 10,当使用 10 个主成分时,可以解释原始数据 中 93.73%的方差,解释能力较强。

  运行程序:

pls_model=train(Apps~.,data=data_train,method="pls",
                preProcess=c("center","scale"),tuneLength=10) #交叉验证拟合偏最小二乘回归

##选定的主成分数M
print(paste("选定的主成分数 (M):",pls_model$bestTune))
print(summary(pls_model))

  运行结果:

  2)测试误差。根据运行结果显示,交叉验证的 PCR 模型,在测试集表现 中,RMSE 为 1095.97,MAE 为 607.09。

  运行程序:

pls_pred=predict(pls_model,newdata=data_test)

pls_error_RMSE=sqrt(mean((pls_pred-data_test$Apps)^2)) #计算均方根误差
pls_error_MAE=mean(abs(pls_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证PLS模型测试误差RMSE:",pls_error_RMSE))
print(paste("交叉验证PLS模型测试误差MAE:",pls_error_MAE))

  运行结果:

11 模型评估

  本实验在训练集过程中,利用训练集分别拟合了最小二乘线性回归模型、交 叉验证的岭回归模型、交叉验证的 LASSO 模型、PCR 模型、PLS 回归模型五 个模型,并在测试集进行测试,以 RMSE、MAE 指标评估模型。结果见表 1 所 示。

  根据表 1 可以看出,五种模型在测试集表现中,RMSE 集中在 1100 附近, 其中 PCR 模型的 RMSE 指标最低,MAE 大多集中在 600 附近,PCR 为 707,五 种模型总体上性能相似。

12 完整代码

##加载相关包并读取数据
library("class")  
library("caret") 
library("gmodels") 
library('pls')
data<- read.csv("D:\\机器学习与R语言\\College.csv",header = T)
head(data)     #查看前六行

str(data)                       #查看数据类型


table(data$Private)
data$Private_Yes=ifelse(data$Private=="Yes",1,0) #将分类变量Private转化为0-1变量,保存为Private_Yes
data=data[c(1,3:20)]                            ##剔除字符变量Private



data<-data[c('Apps','Accept','Enroll',
             'Top10perc','Top25perc','F.Undergrad','P.Undergrad',
             'Outstate','Room.Board','Books','Personal',
             'PhD','Terminal','S.F.Ratio','perc.alumni','Expend','Grad.Rate',
             'Private_Yes')]

summary(data)


set.seed(123) #设置随机种子以保证结果可重复
trainIndex=createDataPartition(data$Apps,p=0.8,
                               list=FALSE,
                               times=1)


data_train<-data[trainIndex, ] #创建训练集
data_test<-data[-trainIndex, ] #创建测试集


##最小二乘线性回归
lm_model=lm(Apps~.,data=data_train) #拟合线性回归模型
summary(lm_model)


lm_pred=predict(lm_model,newdata=data_test) #对测试集进行预测
lm_error_RMSE=sqrt(mean((lm_pred-data_test$Apps)^2)) #计算均方根误差
lm_error_MAE=mean(abs(lm_pred-data_test$Apps)) #计算绝对平均误差

print(paste("线性模型测试误差RMSE:",lm_error_RMSE))
print(paste("线性模型测试误差MAE:",lm_error_MAE))



##拟合岭回归模型
ridge_model=cv.glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps,alpha=0) #交叉验证拟合岭回归模型
print(ridge_model) #输出模型


# 使用最佳λ在训练集上重新拟合模型  
ridge_model <- glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps, alpha = 0, lambda = best_lambda)

ridge_pred <- predict(ridge_model, newx = as.matrix(data_test[,-c(1)]), s = best_lambda)  

ridge_error_RMSE=sqrt(mean((ridge_pred-data_test$Apps)^2)) #计算均方根误差
ridge_error_MAE=mean(abs(ridge_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证岭回归测试误差RMSE:",ridge_error_RMSE))
print(paste("交叉验证岭回归测试误差MAE:",ridge_error_MAE))

##LASSO回归
lasso_model=cv.glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps,alpha=1) #交叉验证拟合lasso回归模型
print(lasso_model) #输出模型


# 选择最佳λ(最小交叉验证误差的λ)  
best_lambda <- lasso_model$lambda.min 
print(paste("最优lambda:",best_lambda))

# 使用最佳λ在训练集上重新拟合模型  
lasso_model <- glmnet(as.matrix(data_train[,-c(1)]),data_train$Apps, alpha = 1, lambda = best_lambda)
lasso_pred=predict(lasso_model,newx = as.matrix(data_test[,-c(1)]), s = best_lambda) #对测试集进行预测
lasso_error_RMSE=sqrt(mean((lasso_pred-data_test$Apps)^2)) #计算均方根误差
lasso_error_MAE=mean(abs(lasso_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证LASSO回归测试误差RMSE:",lasso_error_RMSE))
print(paste("交叉验证LASSO回归测试误差MAE:",lasso_error_MAE))


##拟合PCR模型
pcr_model=train(Apps~.,data=data_train,method="pcr",
                preProcess=c("center","scale"),tuneLength=10) #交叉验证拟合主成分回归模型

##选定的主成分数M
print(paste("选定的主成分数 (M):",pcr_model$bestTune))
print(summary(pcr_model))


pcr_pred=predict(pcr_model,newdata=data_test)

pcr_error_RMSE=sqrt(mean((pcr_pred-data_test$Apps)^2)) #计算均方根误差
pcr_error_MAE=mean(abs(pcr_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证PCR模型测试误差RMSE:",pcr_error_RMSE))
print(paste("交叉验证PCR模型测试误差MAE:",pcr_error_MAE))


##拟合PLS回归模型
pls_model=train(Apps~.,data=data_train,method="pls",
                preProcess=c("center","scale"),tuneLength=10) #交叉验证拟合偏最小二乘回归

##选定的主成分数M
print(paste("选定的主成分数 (M):",pls_model$bestTune))
print(summary(pls_model))

pls_pred=predict(pls_model,newdata=data_test)

pls_error_RMSE=sqrt(mean((pls_pred-data_test$Apps)^2)) #计算均方根误差
pls_error_MAE=mean(abs(pls_pred-data_test$Apps)) #计算绝对平均误差

print(paste("交叉验证PLS模型测试误差RMSE:",pls_error_RMSE))
print(paste("交叉验证PLS模型测试误差MAE:",pls_error_MAE))

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2078113.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

langchain入门系列之六 使用langchain构建PDF解析助手

本文将介绍如何使用langchain构建一个pdf解析助手&#xff0c;在此文中你将学习到langchain如何与web应用(fastapi)相结合&#xff0c;向量持久化等知识&#xff0c;话不多说&#xff0c;现在开始。 安装环境 pip install fastapi pip install python-dotenv pip install uv…

文件和注册表关联

注册表是Windows操作系统的信息存储中心&#xff0c;存放着包括计算机硬件配置、已安装软件的设置信息、当前用户的环境设置及某些文件类型与对其进行访问和操作的应用程序之间的联系等重要信息。Windows操作系统早期版本中存放在初始化文件(.ini)中的许多信息现在都存放在注册…

【STM32单片机_(HAL库)】3-4-3【中断EXTI】【智能排队控制系统】排队系统代码框架搭建

3-4-2系统框图及硬件接线 3.软件 beep、exti、gate、LCD1602、led、tasks驱动文件添加GPIO常用函数中断配置流程main.c程序 #include "sys.h" #include "delay.h" #include "led.h" #include "tasks.h" #include "gate.h"…

联华证券-股票冲高回落的意义:上方抛压恢复

“股票冲高回落”是指股票价格在一段时期内迅速上涨至较高水平后&#xff0c;随后又下跌的现象。这种情况通常表明市场对股票的短期上涨缺乏持续的支撑。以下是冲高回落的主要意义和原因&#xff1a; 1.上方抛压较重 抛压是指大量的卖出订单&#xff0c;这些订单可能在股价达到…

刘海屏的优雅回归?华为Mate 70 Pro定义新美学

在智能手机的发展历程中&#xff0c;华为Mate系列一直是高端旗舰的代表。而今&#xff0c;华为Mate 70 Pro的神秘面纱终于揭开&#xff0c;其回归的刘海屏设计和独特的寰宇舷窗设计&#xff0c;再次将华为的设计理念推向了新的高度。 刘海屏的回归&#xff1a;经典与创新的融合…

用于低质量蒙面人脸识别的一致子决策网络

Consistent Sub-Decision Network for Low-Quality Masked Face Recognition 摘要 提出了一种利用由多个dropout块组成的在线一致性评估结构来获得对应于人脸不同区域的子决策网络&#xff0c;以获得对应于不同面部区域的子决策&#xff0c;并通过加权双向KL散度来约束子决策&…

Transformer模型-5-Multi-Head Attention

上图红色圈中的部分为 Multi-Head Attention&#xff0c;是由多个Self-Attention组成的&#xff0c;虽然Encoder与Decoder中都有Multi-Head Attention&#xff0c;但他们略有区别。Encoder block包含一个 Multi-Head Attention&#xff0c; 而Decoder block包含两个 Multi-Head…

从聊天机器人到智能算法:Facebook AI技术的最新应用

人工智能&#xff08;AI&#xff09;技术的飞速发展正推动社交网络进入一个全新的智能化时代。作为全球领先的社交平台之一&#xff0c;Facebook&#xff08;现已改名为Meta&#xff09;在AI技术应用方面不断创新&#xff0c;推动了从聊天机器人到智能算法的诸多突破。本文将探…

C++第十三弹 -- STL之stack深度剖析与模拟实现

文章索引 前言1. stack的介绍2. stack的使用3. stack的模拟实现4. stackOJ题目4.1 最小栈4.2 栈的压入弹出序列4.3 用栈实现队列 总结 前言 在现代C编程中&#xff0c;STL&#xff08;标准模板库&#xff09;是一个不可或缺的工具。它提供了一套通用的模板类和算法&#xff0c…

Vue 2.x时间转换为北京时间(+8)

文章目录 当前时间格式效果图理想时间格式效果图转换方法总结 当前时间格式效果图 非中国常用时间格式&#xff0c;在上图中给可以看到&#xff0c;选择的时间为&#xff1a;2024-8-26 ~ 2024-8-27&#xff0c;返回结果却是&#xff1a;2024-08-25TXX:XX:XXZ&#xff0c;明显不…

C/C++开发神器CLion全新发布v2024.2——更适用于嵌入式开发

CLion是一款专为开发C及C所设计的跨平台IDE。它是以IntelliJ为基础设计的&#xff0c;包含了许多智能功能来提高开发人员的生产力。这种强大的IDE帮助开发人员在Linux、OS X和Windows上来开发C/C&#xff0c;同时它还使用智能编辑器来提高代码质量、自动代码重构并且深度整合CM…

教你识别原装与翻新芯片IC

在IC采购中&#xff0c;鉴别芯片真伪至关重要。原装芯片经过严格测试&#xff0c;而散新、翻新芯片可能存在质量和稳定性问题。市面上的IC芯片林林总总、各式各样&#xff0c;如果不注意区分&#xff0c;有时很难看出各种料有何不同。 假芯片制作手段包括翻新、打磨等&#xf…

2024年小红书图文制作超火爆风格,1单19.9!趣味性插画AI表情包项目思路

今天我想跟大家分享一个每天只需花20分钟就能轻松赚钱的AI表情包项目。 这个项目在小红书上非常受欢迎&#xff0c;因为它符合小红书的用户习惯&#xff0c;而且操作简单。下面我来详细讲讲如何利用软件快速创作有趣的插画&#xff01; 项目简介 这个项目的原理很简单&#x…

自助共享空间小程序怎么做 共享空间小程序系统开发制作方法

最近很多老板想要做一个自己公司的自助共享空间小程序系统&#xff0c;但是不知道该怎么做&#xff0c;本次瀚林就为大家详细介绍一下各种自助共享空间小程序系统的开发制作方法为大家做参考。 目前市面上的自助共享空间有很多类型例如常见的&#xff1a; 娱乐空间、棋牌室、共…

SpringBoot中MyBatis使用自定义TypeHandler

&#x1f604; 19年之后由于某些原因断更了三年&#xff0c;23年重新扬帆起航&#xff0c;推出更多优质博文&#xff0c;希望大家多多支持&#xff5e; &#x1f337; 古之立大事者&#xff0c;不惟有超世之才&#xff0c;亦必有坚忍不拔之志 &#x1f390; 个人CSND主页——Mi…

2-77 基于matlab-GUI的图像分割程序

基于matlab-GUI的图像分割程序&#xff0c;分别包括超像素 (superpixels)分割 SLIC算法&#xff0c;mean shift 图像分割&#xff0c;H算法&#xff08;Felzenszwalb和Huttenloch提出的图像分割算法&#xff09;&#xff0c;SEEDS&#xff08;Superpixels Extracted via Energy…

docker-compose单机部署rocketmq集群(双主双从,同步双写)

1.本文以RocketMQ 5.3.0 版本的镜像为例。 2.首先先更新docker&#xff0c;之前旧版docker&#xff0c;导致rocketmq一直起不来&#xff0c;一直报错。 3.安装docker-compose。 服务器环境&#xff08;目前只用192.168.25.135后期改ip地址即可&#xff09; | 1 | 192.168.…

ArcGIS图斑导出CAD后变成三维多段线?

欢迎关注同名微信公众号&#xff0c;更多文章推送&#xff1a; 正常情况下&#xff0c;将ArcGIS中的图层导出为CAD&#xff0c;生成的是闭合多段线&#xff1a; 导出的CAD&#xff1a; 但是有时候导出的CAD变成三维多段线&#xff1a; 三维多段线有多麻烦用过CAD画图的人应该都…

【GD32 MUC 移植教程】从 GD32F10x 移植到 GD32F30x

1. 前言 对于使用 GD32 系列微控制器进行产品开发的设计人员来说&#xff0c;因产品及功能升级&#xff0c;往往需要将一种微控制器替换成另一种微控制器&#xff0c;在保留既有功能的情况下增加新功能。为了更快地推出新产品&#xff0c;设计人员经常要将应用程序移植到新的…

【数据分享】1999—2022年地级市各类交通工具的客货运量和拥有量数据(Shp/Excel格式)

在之前的文章中&#xff0c;我们分享过基于2000-2023年《中国城市统计年鉴》整理的1999-2022年地级市的人口相关数据、各类用地面积数据、污染物排放和环境治理相关数据、房地产投资情况和商品房销售面积、社会消费品零售总额和年末金融机构存贷款余额、一般公共预算收支状况、…