本系列赛题、数据获取:
2021年暑假数学建模模拟赛(赛题+数据+分析)
不直接提供论文等资料,分析已经很详细了
整理不易,欢迎点赞+关注+收藏
赛题
分析
这次的赛题完全可以全用SPSS来实现,以前一直目光狭隘,盯着MATLAB和python,经过这次训练赛,笔者意识到了SPSS的重要性
本次赛题简单,所以要写的精彩就有难度了,笔者本次建模做了比较详尽的分析,可以看看哦
读者可以拿它来练手,统计一直是数学建模里很重要的一个部分,但一直受到了忽视
使用SPSS也应该是一项必会的技能
另外笔者发现一个宝藏网站SPSSAU,为了避免广告嫌疑就不放链接了
可以去淘宝搜一个一两天的会员在建模的时候使用,他可以给出详细的分析报表,适合非统计专业的小白做分析使用
求解
直接上论文里的分析啦,主要是使用的SPSS软件,只有一两个代码,附在下一节
都看到这里了,点个赞再走呀
代码
K-means聚类簇个数确定
import numpy as np
import pandas as pd
import matplotlib
import matplotlib.pyplot as plt
from scipy.spatial.distance import pdist,squareform
from scipy.cluster.hierarchy import dendrogram, linkage,fcluster
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans
from sklearn import metrics
from mpl_toolkits.mplot3d import *
#数据的读取与标准化
data = pd.read_excel('data.xlsx',index_col = 0)
datanp = np.asarray(data)
std = StandardScaler()
datastd = std.fit_transform(datanp)
#计算各类指标
SSE = []
CH = []
SC = []
for k in range(2,31):
km = KMeans(k)
pred = km.fit_predict(datastd)
SSE.append(km.inertia_)
CH.append(metrics.calinski_harabasz_score(datastd, pred))
SC.append(metrics.silhouette_score(datastd, pred, metric='euclidean'))
#各类指标的可视化
X = range(2,31)
plt.xlabel('k')
plt.ylabel('SSE')
plt.plot(X,SSE,'o-')
plt.savefig('1bSSE.png')
plt.show()
X = range(2,31)
plt.xlabel('k')
plt.ylabel('CH')
plt.plot(X,CH,'o-')
plt.show()
X = range(2,31)
plt.xlabel('k')
plt.ylabel('SC')
plt.plot(X,SC,'o-')
plt.show()
#打印出具体类别
ind = np.arange(31)
km = KMeans(6)
pred = km.fit_predict(datastd)
for i in range(6):
print('第',i + 1,'类包含有',ind[pred == i])
#绘制聚类3D图
from sklearn.manifold import TSNE
X = TSNE(n_components=3).fit_transform(datastd)
fig = plt.figure(1, figsize=(8, 6))
ax = Axes3D(fig, elev=-150, azim=110)
ax.scatter(X[:, 0], X[:, 1], X[:, 2], c=pred,cmap=plt.cm.Set1, edgecolor='k', s=40)
plt.savefig('1b.png')
组合预测模型系数确定
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import gurobipy as gp
from gurobipy import GRB
from sklearn.metrics import mean_squared_error
def RMSE(a,b):
return np.sqrt((a-b)**2)
gm = pd.read_csv('GM.csv')
gmnp = np.asarray(gm)
arima = pd.read_csv('ARIMA.csv')
arimanp = np.asarray(arima)
gme = np.zeros(16)
arimae = np.zeros(16)
#Compute RMSE
for i in range(4,20):
gme[i-4] = RMSE(gmnp[i,0],gmnp[i,1])
arimae[i-4] = RMSE(arimanp[i,0],arimanp[i,1])
# Create a new model
m = gp. Model (" p5 ")
# Create variables
w1 = m. addVar ( name ="w1")
w2 = m. addVar ( name ="w2")
# Set objective
m. setObjective (gp.quick_sum(w1 * gme[i] for i in range(16)) + gp.quick_sum(w2 * arimae[i] for i in range(16)), GRB. MINIMIZE )
# Add constraint : w1 + w2 == 1
m. addConstr (w1 + w2 == 1, "c")
# Optimize model
m. optimize ()
for v in m. getVars ():
print ('%s %g' % (v. varName , v.x))
print ('Obj: %g' % m. objVal )