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