2020年数学建模竞赛题目
已知某厂家根据不同车辆属性数据,将其编织成4种队伍,另外只有一批未知编队的车辆属性数据及不同车辆的属性介绍。
问题一:根据给出的数据将附件2中的车辆数据编队。
问题二:根据问题一中的结果,对每个编队车辆进行性能评估。
问题背景
自动驾驶是一项极其复杂和困难的技术,其依靠的是人工智能、雷达探测、监控装置等多方面的协同合作。还需要大量的视频采集、数据分析和不断反馈调整,而且必须做到低时延,这就对网络通讯速度有十分高的要求,而5G技术有着更快的速度及更大的容量,所以已经开启的5G商用或将对自动驾驶技术起到推波助澜的作用。
不仅如此,现在主流的自动驾驶技术路线完全依赖车辆自身的感知能力,车上必须搭载价值数十万元的激光雷达等一系列传感器,然而探测的距离和精度依然有待提升。同时,视野盲区和其他车辆的不可预估性都意味着风险的存在。
问题分析
问题一分析
首先为了初步了解车辆数据的内容及类别属性,我们将脏数据和空数据进行处理,发现并没有脏数据和空数据;然后根据题中所讲,通过给出的附件一数据将附件二中的车辆编队。我们考虑采用分类算法对原有附件一数据进行分类模型训练,并用附件一数据训练好的模型对附件二中的数据进行分类,以此得出车辆编队结果。由于分类算法众多,我们以分类的准确率作为模型选择的重要因素。为了选择最佳符合该数据的分类模型,我们采用了多项式贝叶斯、高斯朴素贝叶斯、伯努利贝叶斯、SVM分类算法模型,发现准确度最高的为SVM算法模型。因此以SVM算法模型为最终训练模型,我们利用附件一中的标准数据进行模型训练,使用附件二中的车辆属性数据对车辆编队进行分类预测,输出预测的车辆编队结果。
问题二分析
对问题二,根据我们求得的问题一中的结果,由于不同编队的车辆性能一定有所区分,因此,在针对不同编队的车辆进行性能评估时,评估车辆属性侧重点标准也是不同的。那么为探究4个编队类别的车辆评估标准,我们对该4个车辆编队类别的所有车辆的所有对应属性计算均值并进行主因子分析,然后做出不同车辆编队的属性雷达图,结合现实依据给出4个车辆编队的性能评估。
问题一程序:
#导入模型,分别导入多项式贝叶斯模型、高斯贝叶斯模型、伯努利贝叶斯模型
from sklearn.naive_bayes import MultinomialNB,GaussianNB,BernoulliNB
#导入svm模型
from sklearn.svm import SVC
from sklearn.cross_validation import train_test_split
#导入excel文件处理库
import openpyxl
#打开附件1
wb = openpyxl.load_workbook('problemC附件1.xlsx')
ws = wb.active
#存储汽车属性数据(1-20个属性)
features = []
#存储汽车编队数据
cls = []
#遍历读入数据
for row in ws.iter_rows(min_row=2, max_row=1501,min_col=2, max_col=22):
#暂时存储读入数据
tmp = []
for cell in row:
tmp.append(float(cell.value))
#存入属性
features.append(tmp[:-1])
#存入类别
cls.append(tmp[-1])
#切分附件1数据集为训练集、测试集
x_train, x_test, y_train, y_test = train_test_split(features,cls,test_size=0.3,random_state=33)
#计数器
a,b,c,d=0,0,0,0
#初始化高斯贝叶斯模型
gnb = GaussianNB()
#模型训练
gnb.fit(x_train,y_train)
#模型预测
y_predict = gnb.predict(x_test)
for i in range(len(y_predict)):
if y_predict[i] == y_test[i]:
a += 1
print("高斯贝叶斯模型预测准确率:"+str(a/len(y_test)))
#初始化多项式贝叶斯模型
mnb = MultinomialNB()
#模型训练
mnb.fit(x_train,y_train)
#模型预测
y_predict = mnb.predict(x_test)
for i in range(len(y_predict)):
if y_predict[i] == y_test[i]:
b += 1
print("多项式贝叶斯模型预测准确率:"+str(b/len(y_test)))
bnb = BernoulliNB()
bnb.fit(x_train,y_train)
y_predict = bnb.predict(x_test)
for i in range(len(y_predict)):
if y_predict[i] == y_test[i]:
c += 1
print("伯努利贝叶斯模型预测准确率:"+str(c/len(y_test)))
svc = SVC(C=10,kernel='linear',gamma=20,decision_function_shape='ovo',cache_size=200)
#kernel='linear'为线性核,C越大分类效果越好,但可能会过拟合
#kernel='rbf'为高斯核,gramma越大,分类界面越散,分类效果越好,可能会过拟合
#decision_function_shape:ovr:一个类别与其他类别进行划分,ovo:两两之间进行划分,用二分类的方法模拟多分类结果
svc.fit(x_train,y_train)
y_predict = svc.predict(x_test)
d=0
#gnb = GaussianNB()
#gnb.fit(x_train,y_train)
#y_predict = gnb.predict(x_test)
for i in range(len(y_predict)):
if y_predict[i] == y_test[i]:
d += 1
print("SVM模型预测准确率:"+str(d/len(y_test)))