女子举重问题
一、問題的描述
問題及要求
1、搜集各個(gè)級別世界女子舉重比賽的實(shí)際數(shù)據(jù)。分別建立女子舉重比賽總成績的線性模型、冪函數(shù)模型、冪函數(shù)改進(jìn)模型,并最終建立總冠軍評選模型。
應(yīng)用以上模型對最近舉行的一屆奧運(yùn)會(huì)女子舉重比賽總成績進(jìn)行排名,并對模型及結(jié)果進(jìn)行必要的分析。
2、請對以上模型作進(jìn)一步的改進(jìn),或提出更好的模型,并應(yīng)用模型進(jìn)行排名。
3、同樣對最近舉行的一屆奧運(yùn)會(huì)所有男女舉重冠軍行進(jìn)評選,選出1名最優(yōu)秀的舉重運(yùn)動(dòng)員,給出你的定量評選方法并合理論述。
4、由以上研究過程及結(jié)果結(jié)論的啟發(fā),你認(rèn)為這個(gè)模型可以推廣應(yīng)用到生活或?qū)W習(xí)中的哪些情況下,或者應(yīng)該對生活或?qū)W習(xí)中哪些事物現(xiàn)有的處理方式需要做出改進(jìn),請給出你的分析。
說明:完成一篇建模論文。(具體資料及提交要求見說明文件)
二、搜集資料和數(shù)據(jù)
1.級別的劃分
以下括號內(nèi)容均為網(wǎng)上的查閱資料
(男子舉重原有8個(gè)級別是:56、62、69、77、85、94、105公斤級和105公斤以上級,于2018年由國際舉聯(lián)調(diào)整新的10個(gè)級別是55(非奧)、61、67、73、81、89(非奧)、96、102(非奧)、109公斤級和109公斤以上級共10個(gè)級別。女子舉重原來7個(gè)級別是:48、53、58、63、69、75公斤級和75公斤級以上級,新的10個(gè)級別也調(diào)整為:45(非奧)、49、55、59、64、71(非奧)、76、81(非奧)、87公斤級和87公斤以上級。男女6個(gè)非奧級別只在奧運(yùn)會(huì)以外的賽事舉行。)
在本題目中,我們按照奧運(yùn)會(huì)的規(guī)定來進(jìn)行求解,規(guī)定為8個(gè)級別(在下面做的時(shí)候用的是10個(gè)級別)
男運(yùn)動(dòng)員:61、67、73、81、96、109、109以上
女運(yùn)動(dòng)員:49、55、59、64、76、87、87以上
2.搜集數(shù)據(jù)
數(shù)據(jù)來源:
女子舉重世界紀(jì)錄_國家體育總局 (sport.gov.cn)(舊紀(jì)錄不可用,這是一個(gè)注意點(diǎn),一定要注意,要用2018以后的數(shù)據(jù),新標(biāo)準(zhǔn)之下的記錄)
圖1.舊標(biāo)準(zhǔn)的記錄
可用數(shù)據(jù)網(wǎng)站(需要科學(xué)上網(wǎng)):https://zh.wikipedia.org/zh-hans/%E8%88%89%E9%87%8D%E4%B8%96%E7%95%8C%E7%B4%80%E9%8C%84%E5%88%97%E8%A1%A8#%E5%A5%B3%E5%AD%90
?在這個(gè)網(wǎng)站里面,我們需要選取,當(dāng)前記錄這一欄目,千萬千萬千萬記住,不要用舊紀(jì)錄這一欄,因?yàn)樵?018年之后男子和女子的分類的級別已經(jīng)改變。
圖2.男子新記錄?
?圖3.女子新紀(jì)錄
三、第一問
1.分別繪制抓舉、挺舉、總和下的散點(diǎn)圖如下:
圖4.體重和舉重重量的散點(diǎn)趨勢圖
?分析圖形可能為線性關(guān)系、非線性關(guān)系(指數(shù)、對數(shù)等)。
散點(diǎn)圖代碼如下(python):
#引入相應(yīng)的庫 import numpy as np import pandas as pd import matplotlib.pyplot as plt import seaborn as sns#讀取數(shù)據(jù) data=pd.read_excel("data.xlsx",sheet_name="女子") #選取抓舉、挺舉、總和 data_1=data[data["class"]=="抓舉"].sort_values("weight") data_2=data[data["class"]=="挺舉"].sort_values("weight") data_3=data[data["class"]=="總和"].sort_values("weight") #篩選出自變量和因變量 x1=data_1["weight"].values y1=data_1["record"].values x2=data_2["weight"].values y2=data_2["record"].values x3=data_3["weight"].values y3=data_3["record"].values#解決中文亂碼和符號顯示的問題 plt.rcParams['font.sans-serif']=['SimHei'] plt.rcParams['font.sans-serif']=['Microsoft YaHei'] #繪制散點(diǎn)圖 plt.figure(figsize=(10,8),dpi=300) plt.title("體重和舉重重量散點(diǎn)趨勢圖",fontsize="16") plt.xlabel("體重/kg",fontsize="14") plt.ylabel("舉重重量/kg",fontsize="14") plt.scatter(x1,y1,color="red",label="抓舉") plt.scatter(x2,y2,color="blue",label="挺舉") plt.scatter(x3,y3,color="green",label="總和") plt.grid(True) plt.legend() plt.savefig("1.png")2.線性擬合
擬合圖如下
計(jì)算結(jié)果
從上面的結(jié)果中我們可以看出,當(dāng)多項(xiàng)式的最高次數(shù)大于4次的時(shí)后,雖然模型的R的平方較好,但是不符合實(shí)際情況,屬于過擬合現(xiàn)象,上面的參數(shù)RMSE和MAE來計(jì)算誤差的話,無法排除離群點(diǎn)的影響,所以采用了MAPE來計(jì)算誤差的話,這樣就排除離群點(diǎn)對模型的影響。這個(gè)多項(xiàng)式擬合可以用到第二問當(dāng)中去,作為模型的改進(jìn)。
2.冪函數(shù)擬合
相關(guān)的理論支持:
?上圖中的參數(shù)是舉例子
擬合效果圖如下:?
?模型的評估
? ? 上面的參數(shù)RMSE和MAE來計(jì)算誤差的話,無法排除離群點(diǎn)的影響,所以采用了MAPE來計(jì)算誤差的話,這樣就排除離群點(diǎn)對模型的影響。?
#冪函數(shù)進(jìn)行擬合#引入相應(yīng)的庫 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit# 自定義的擬合函數(shù) def func2(x,k):return k*np.power(x,2/3)# 開始擬合 popt, pcov = curve_fit(func2, x3, y3)# 提取擬合結(jié)果 k = popt[0]#冪函數(shù)的系數(shù) print("冪函數(shù)的系數(shù)為:{:}\n".format(k)) print("y3的預(yù)測結(jié)果為:") y_predict=func2(x3,k)#預(yù)測的結(jié)果值 print(y_predict)x_new = np.linspace(0, 100, 1000) # 生成新的x軸數(shù)據(jù) #繪制擬合曲線效果 plt.figure(figsize=(10,8),dpi=300) plt.title("冪函數(shù)的擬合效果圖",fontsize=16) plt.xlabel("體重/kg",fontsize=14) plt.ylabel("運(yùn)動(dòng)員所舉的重量",fontsize=14) plt.plot(x3,y3,"ro",label="真實(shí)值") plt.plot(x_new,func2(x_new,k),color='blue',label="預(yù)測值") plt.grid(True) plt.legend(loc="upper left") plt.savefig("3.png")#誤差分析 rmse_poly = np.sqrt(np.mean((y3 - func2(x3,k))**2)) mae_poly = np.mean(np.abs(y3 - func2(x3,k))) mape_poly=np.mean(np.abs(y3-func2(x3,k))/func2(x3,k))# 打印RMSE和MAE print("冪函數(shù)擬合的RMSE和MAE分別為:{:.2f},{:.2f}".format(rmse_poly, mae_poly)) print("冪函數(shù)擬合的MAPE分別為:{:.2f}".format(mape_poly)) y_poly = poly(x_new) # 計(jì)算R平方 r2_poly = r2_score(y3, func2(x3,k)) # 打印R平方 print("冪函數(shù)擬合的R平方為:{:.2f}".format(r2_poly)) print("\n")3.改進(jìn)冪函數(shù)的擬合
相關(guān)的理論支持:
?上圖中的參數(shù)是舉例子
改進(jìn)冪函數(shù)的擬合效果圖?
誤差分析:?
?? ? 上面的參數(shù)RMSE和MAE來計(jì)算誤差的話,無法排除離群點(diǎn)的影響,所以采用了MAPE來計(jì)算誤差的話,這樣就排除離群點(diǎn)對模型的影響。
#改進(jìn)冪函數(shù) #冪函數(shù)進(jìn)行擬合#引入相應(yīng)的庫 import numpy as np import matplotlib.pyplot as plt from scipy.optimize import curve_fit# 自定義的擬合函數(shù) def func2(x,k,w0,l):return k*np.power(x-w0,l)# 開始擬合 popt, pcov = curve_fit(func2, x3, y3)# 提取擬合結(jié)果 k = popt[0]#改進(jìn)冪函數(shù)的系數(shù)k w0=popt[1]#改進(jìn)冪函數(shù)的w0 l=popt[2]#改進(jìn)冪函數(shù)的l print("改進(jìn)冪函數(shù)的系數(shù)為:{:}\n".format(k)) print("改進(jìn)冪函數(shù)的w0為:{:}\n".format(w0)) print("改進(jìn)冪函數(shù)的l為:{:}\n".format(l)) print("y3的預(yù)測結(jié)果為:") y_predict=func2(x3,k,w0,l)#預(yù)測的結(jié)果值 print(y_predict)x_new = np.linspace(0, 100, 1000) # 生成新的x軸數(shù)據(jù) #繪制擬合曲線效果 plt.figure(figsize=(10,8),dpi=300) plt.title("改進(jìn)冪函數(shù)的擬合效果圖",fontsize=16) plt.xlabel("體重/kg",fontsize=14) plt.ylabel("運(yùn)動(dòng)員所舉的重量",fontsize=14) plt.plot(x3,y3,"ro",label="真實(shí)值") plt.plot(x_new,func2(x_new,k,w0,l),color='blue',label="預(yù)測值") plt.grid(True) plt.legend(loc="upper left") plt.savefig("4.png")#誤差分析 rmse_poly = np.sqrt(np.mean((y3 - func2(x3,k,w0,l))**2)) mae_poly = np.mean(np.abs(y3 - func2(x3,k,w0,l))) mape_poly=np.mean(np.abs(y3-func2(x3,k,w0,l))/func2(x3,k,w0,l))# 打印RMSE和MAE print("改進(jìn)冪函數(shù)擬合的RMSE和MAE分別為:{:.2f},{:.2f}".format(rmse_poly, mae_poly)) print("改進(jìn)冪函數(shù)擬合的MAPE分別為:{:.2f}".format(mape_poly)) y_poly = poly(x_new) # 計(jì)算R平方 r2_poly = r2_score(y3, func2(x3,k,w0,l)) # 打印R平方 print("改進(jìn)冪函數(shù)擬合的R平方為:{:.2f}".format(r2_poly)) print("\n")? ? ?綜上所述,線性模型(一次)、冪函數(shù)模型、改進(jìn)冪函數(shù)模型的效果大致相同,因此可以選擇其中一個(gè)模型來進(jìn)行下面的操作,為保持與二題的連貫性,建議選擇線性模型,其次是改進(jìn)冪函數(shù)模型,最后為冪函數(shù)模型。?
4.標(biāo)準(zhǔn)統(tǒng)一化?
相關(guān)理論基礎(chǔ):
?
?本文選取中間級別71公斤的作為標(biāo)準(zhǔn),使所以級別的數(shù)據(jù)轉(zhuǎn)換到71公斤的標(biāo)準(zhǔn)下。
下面是總和成績記錄的所有數(shù)據(jù)
?選用線性模型(一次),當(dāng)然也可以選擇其它模型(改進(jìn)冪函數(shù)等)
即:y=2.52x+88.26?
?將級別6的數(shù)據(jù)代入,即可算出u=267.18
本文選取東京奧運(yùn)會(huì)的舉重?cái)?shù)據(jù)進(jìn)行計(jì)算,數(shù)據(jù)網(wǎng)站如下:
百度百科-驗(yàn)證
?數(shù)據(jù)處理:在當(dāng)年東京奧運(yùn)會(huì)有的級別中選取總冠軍,以該級別的最高邊界值作為選手的體重。
下表為東京奧運(yùn)會(huì)上各個(gè)級別的女子總冠軍。
?計(jì)算得出得結(jié)果如下:
可視化得分結(jié)果如下:?
?從上圖可知:中國臺北的郭婞淳為總冠軍
代碼:
#導(dǎo)庫 import numpy as np import pandas as pd import matplotlib.pyplot as plt #讀取數(shù)據(jù) data=pd.read_excel("data.xlsx",sheet_name="東京奧運(yùn)會(huì)女子舉重") x4=data["weight"].values y4=data["power"].values #定義標(biāo)準(zhǔn)化函數(shù) coefficients = np.polyfit(x3, y3, 1) # 用1次多項(xiàng)式進(jìn)行擬合 poly = np.poly1d(coefficients) # 生成多項(xiàng)式函數(shù) def zfunc(x,y):return 267.18*y/(2.52*x+88.26)#求解運(yùn)動(dòng)員標(biāo)準(zhǔn)得分,該分?jǐn)?shù)越大,證明運(yùn)動(dòng)員成績越好 z=zfunc(x4,y4) #將數(shù)據(jù)讀入到data中 data["標(biāo)準(zhǔn)化得分"]=z#畫圖 x5=data["name"].values y5=z plt.figure(figsize=(15,8),dpi=300) plt.title("2021年東京奧運(yùn)會(huì)女子舉重統(tǒng)一標(biāo)準(zhǔn)下得分圖",fontsize=16) plt.xlabel("運(yùn)動(dòng)員姓名",fontsize=14) plt.ylabel("標(biāo)準(zhǔn)得分",fontsize=14) plt.plot(x5,y5,color="#FF8066",marker="o",label="標(biāo)準(zhǔn)得分") plt.grid(True) plt.legend(loc="upper left") plt.savefig("5.png") print("得分結(jié)果為:") print(z)三、第二問(多項(xiàng)式擬合)
from scipy.interpolate import interp1d import numpy as np import matplotlib.pyplot as plt from sklearn.metrics import r2_scoreplt.rcParams['font.sans-serif']=['SimHei'] #用來正常顯示中文標(biāo)簽 plt.rcParams['axes.unicode_minus'] = False #用來正常顯示負(fù)號 plt.figure(figsize=(20,15),dpi=300) plt.title("總成績擬合圖",fontsize=16) plt.xlabel("體重",fontsize=14) plt.ylabel("舉重重量",fontsize=14) for i in range(1,9):x_new = np.linspace(40, 100, 1000) # 生成新的x軸數(shù)據(jù)coefficients = np.polyfit(x3, y3, i) # 用5次多項(xiàng)式進(jìn)行擬合poly = np.poly1d(coefficients) # 生成多項(xiàng)式函數(shù)# 繪圖plt.subplot(2,4,i)plt.subplots_adjust(left=None, bottom=0.1, right=None, top=None,wspace=None, hspace=None)plt.grid(True)plt.scatter(x3,y3,marker="o",color="red", label='原始數(shù)據(jù)')plt.plot(x_new, poly(x_new), label=str(i)+'次多項(xiàng)式擬合')plt.legend(loc="upper left") plt.savefig("2.png") # 計(jì)算擬合后的數(shù)值 for i in range(1,9):coefficients = np.polyfit(x3, y3, i) # 用5次多項(xiàng)式進(jìn)行擬合poly = np.poly1d(coefficients) # 生成多項(xiàng)式函數(shù)y_poly = poly(x_new)# # 計(jì)算RMSE和MAE# rmse_cubic = np.sqrt(np.mean((y - f_cubic(x))**2))# mae_cubic = np.mean(np.abs(y - f_cubic(x)))rmse_poly = np.sqrt(np.mean((y3 - poly(x3))**2))mae_poly = np.mean(np.abs(y3 - poly(x3)))mape_poly=np.mean(np.abs(y3-poly(x3))/poly(x3))# 打印RMSE和MAEprint(str(i)+"次多項(xiàng)式擬合的RMSE和MAE分別為:{:.2f},{:.2f}".format(rmse_poly, mae_poly))print(str(i)+"次多項(xiàng)式擬合的MAPE分別為:{:.2f}".format(mape_poly))print(poly)y_poly = poly(x_new)# 計(jì)算R平方r2_poly = r2_score(y3, poly(x3))# 打印R平方print(str(i)+"次多項(xiàng)式擬合的R平方為:{:.2f}".format(r2_poly))print("\n")?從上面的結(jié)果中我們可以看出,當(dāng)多項(xiàng)式的最高次數(shù)大于4次的時(shí)后,雖然模型的R的平方較好,但是不符合實(shí)際情況,屬于過擬合現(xiàn)象,上面的參數(shù)RMSE和MAE來計(jì)算誤差的話,無法排除離群點(diǎn)的影響,所以采用了MAPE來計(jì)算誤差的話,這樣就排除離群點(diǎn)對模型的影響。這個(gè)多項(xiàng)式擬合可以用到第二問當(dāng)中去,作為模型的改進(jìn),因此我們進(jìn)行的優(yōu)化為多項(xiàng)式優(yōu)化。
可能大家會(huì)有疑問,為什么要用多項(xiàng)式擬合,而不去用其它函數(shù)呢?在這里就是用到泰勒公式的簡單應(yīng)用,用多項(xiàng)式近似地表示函數(shù)的公式稱為泰勒公式,并且根據(jù)余項(xiàng)表達(dá)式的不同而有不同的形式。 得名于英國數(shù)學(xué)家布魯克·泰勒,他在1712年的一封信里首次敘述了這個(gè)公式。嘿嘿這個(gè)大家大一的高數(shù)應(yīng)該都是學(xué)過滴!
關(guān)于相關(guān)數(shù)學(xué)理論請看這篇文章(其實(shí)可以忽略,想了解的可以看下,記住結(jié)論就行,不用難為自己):
泰勒公式簡單應(yīng)用:多項(xiàng)式近似表示任意函數(shù) - 知乎 (zhihu.com)
基于4次多項(xiàng)式的改進(jìn)模型?
?從圖中可以清晰的看出:在4次多項(xiàng)式的條件下候志惠的標(biāo)準(zhǔn)的分最高。
為什么和前面的不一樣呢?大家可能有疑問,但是在下面可以做一個(gè)實(shí)驗(yàn),當(dāng)多項(xiàng)式的最高次大于等于1時(shí),模型所評選的女子冠軍均為候志惠,這說明多項(xiàng)式的擬合精度更高,更加具有穩(wěn)定性和可信性。
?
?在這就不再一一列舉了,從上面可以觀察出隨著最高次數(shù)的增加,模型逐漸趨于穩(wěn)定。
代碼:
#導(dǎo)庫 import numpy as np import pandas as pd import matplotlib.pyplot as plt#讀取數(shù)據(jù) data=pd.read_excel("data.xlsx",sheet_name="東京奧運(yùn)會(huì)女子舉重") x4=data["weight"].values y4=data["power"].values#改進(jìn)的模型,4次多項(xiàng)式擬合 coefficients = np.polyfit(x3, y3, 5) # 只需改動(dòng)這里面參數(shù),即可擬合多種多項(xiàng)式 poly = np.poly1d(coefficients) # 生成多項(xiàng)式函數(shù) print(poly) u=poly(71) print(u)#定義改進(jìn)后的標(biāo)準(zhǔn)得分函數(shù) def zfunction(x,y):return (270.5482219490648*y)/poly(x) z1=zfunction(x4,y4)#畫圖 x5=data["name"].values y5=z1 plt.figure(figsize=(15,8),dpi=300) plt.title("5次改進(jìn)02021年東京奧運(yùn)會(huì)女子舉重統(tǒng)一標(biāo)準(zhǔn)下得分圖",fontsize=16) plt.xlabel("運(yùn)動(dòng)員姓名",fontsize=14) plt.ylabel("標(biāo)準(zhǔn)得分",fontsize=14) plt.plot(x5,y5,color="b",marker="o",label="標(biāo)準(zhǔn)得分") plt.grid(True) plt.legend(loc="upper left") plt.savefig("6.png") print("得分結(jié)果為:") print(z1)至此解決重要的兩問。三問、四問都比較容易解決。
四、第三問選取男女冠軍
????????這一問就比較簡單啦,在這里我就給大家說一種思路
????????首先按照上面的1、2問的思路對男子數(shù)據(jù)進(jìn)行建模,選出男子冠軍,然后再和我們選出的女子冠軍進(jìn)行比較,最后選出總冠軍,關(guān)于比較的方法。
????????我查閱了相關(guān)資料:
????????‘’科學(xué)界對于男性與女性在青春期形成的生理差異已經(jīng)普遍達(dá)成共識。在哈伯德已經(jīng)經(jīng)歷過的男性青春期期間,男性的肌肉量會(huì)得到增加。
????????體育科學(xué)家塔克(Ross Tucker)稱,男性青春期出現(xiàn)的一系列生理變化會(huì)(在男性與女性之間)帶來顯著的功能優(yōu)勢,他稱在游泳與自行車運(yùn)動(dòng)上這種差異在10-12%之間,而在舉重等涉及上肢肌肉力量的項(xiàng)目上可能達(dá)到“30-40%”這個(gè)結(jié)論我用往年的數(shù)據(jù)檢驗(yàn)了,基本上是符合的,因此可以用了。
????????在模型假設(shè)部分:假設(shè)同體重下,男子的上肢力量要比女子高35%(這個(gè)比例位于30%-40%就行)。(這句話一定要帶上)
? ? ? ? 即是選出的女子總冠軍的標(biāo)準(zhǔn)化成績乘上(1+0.35),再去和男子冠軍的標(biāo)準(zhǔn)化成績進(jìn)行比較。根據(jù)我提供的數(shù)據(jù)男子標(biāo)準(zhǔn)到73kg、女子標(biāo)準(zhǔn)到71kg,由于男子的標(biāo)準(zhǔn)女子大,為了彌補(bǔ)這個(gè)差值,我們可以讓女子和男子的上肢力量設(shè)置的大一些,也就是比0.35大一些,這樣就彌補(bǔ)了這一缺陷啦。
????????代碼上面都有了,直接套用就行。
四、第四問語文建模外加一些機(jī)理分析
? ? ? ? 這一問就更加簡單了
? ? ? ? 這一問可以從摔跤、拳擊、賽艇按體重分等級的體育項(xiàng)目來考慮
? ? ? ? 體測的男女的標(biāo)準(zhǔn)轉(zhuǎn)化也是一個(gè)思路
至此,全部更新完全,本人水平有限,如有錯(cuò)誤,可以提出,歡迎交流。
總結(jié)
- 上一篇: Ubuntu 商店无法安装应用
- 下一篇: 表情宝宝(v3.1)——一个表情包管理软