2023亞太地區數學建模A題思路:開賽后第一時間更新,獲取見文末 名片
2023亞太地區數學建模B題思路:開賽后第一時間更新,獲取見文末 名片
2023亞太地區數學建模C題思路:開賽后第一時間更新,獲取見文末 名片
重要提示:優秀論文的解讀十分重要!!!
? ? ?初次接觸數學建模,所以我們在研讀論文的過程中,除了學習他們在解決問題中用到的思維方法、數學知識、分析其優點與不足之外,更看重學習怎樣寫出一篇優秀的數學建模論文,從而傳達出自己的研究思路和研究成果。研讀完這篇優秀論文后,我們有如下幾點的收獲:
1. 大致了解了一篇數學建模論文應該包括哪幾個部分;
2. 每個部分應該寫些什么,以及怎樣寫才能更好的吸引別人的眼球;
3. 汲取了這篇優秀論文在寫作和處理問題方面的成功之處,以便以后運用于我們的研究之中;
4. 總結了這篇論文的不足之處,提醒我們以后注意不要犯類似的錯誤。
二、寫作內容和技巧
2.1摘要
? ? ? ?摘要是一篇論文能否在眾多論文中脫穎而出的關鍵,好的摘要必須清楚的描述解決問題的方法和顯著的表達論文中最重要的結論。這篇論文的摘要簡明扼要地指出了處理問題的方法并給出了作答,起到較好的總結全文,理清條理的作用。讓讀者對以下論述有一個總體印象。不足之處在于他提到用了兩種方法對預測雨量的兩種方法進行分析,但實際上從后面的主體部分,我們可以看到他只是從題目中提到的兩個方面——準確性和公眾感受——來分析的,談不上兩個方法。
2.2問題的重述
再次闡明論文所研究的問題具有的實際意義,并醒目的提出了所要解決的問題。
2.3問題的分析
分析問題,簡述要解決此問題需要哪些條件和大體的解決途徑
優點:條理比較清晰,論述符合邏輯,表達清楚。并給出了一個將經緯度轉化為坐
的Matlab圖形,將題目中的數據直觀的反映在了圖形上。
缺點:對于考慮公眾感受這一段,敘述稍顯簡略。
2.4模型的假設及符號說明
一個模型建的好與否,很大程度上取決于其假設做的好不好。過煩的假設接近實際,但不宜或者無法求解,過簡的假設對實際的指導意義又不夠。這就要求我們能發揮想象力、洞察力和判斷力,善于辨別主次,并為了使處理方法簡單,盡量使問題簡單、均勻化。
將文中會出現的變量、常量先在此說明,便于讀者的閱讀。這篇論文得符號說明很清楚,也很詳細。
2.5模型的建立及求解、
1.問題(1)及其求解
? 首先闡明算法,給出或推導出需要用到的計算公式;然后可使用Matlab編程,計算出相應的結果;分析得到的答案,給出相應的結論。
?優點:這篇文章建立的模型很簡潔,因而給出的算法也很精煉。他主要采用網格點上的預報數據來預測觀測站點的數據,再來和實際測得的數據相比,以預報偏離差率這個量來判定兩種方法的劣。在數據很繁瑣的情況下,很好的使用了Matlab。
2.問題(2)及其求解
可以參考上述
2.6模型的誤差與分析
模型的誤差與分析有助于改進模型,并使模型在更多的場合適用。
優點:看到了主要可能出現問題和爭議的地方,相當于重新作了個說明,指明了自己方法的可取性;
缺點:對于其他的誤差并沒有進行分析。考慮還不夠周全。
2.7模型的評價及推廣
指出自己的模型為什么具有可取性,它的優點。這篇論點的評價很好的概括了它的優點,并提出它的方法精度高,以及提到它使用了很好的數學工具。
數學模型最主要的目的是解決實際問題,一個模型做出來、解決之后,不把它運用到實際之中,就不是成功的。因而模型的推廣或者說是模型的應用是建模論文中必不可少的。
2.8參考文獻
引用的資料必須指明出處,就是在這兒說明。
#coding=utf-8
#Author:Dodo
#Date:2018-11-15
#Email:lvtengchao@pku.edu.cn
'''
數據集:Mnist
訓練集數量:60000
測試集數量:10000
------------------------------
運行結果:
正確率:81.72%(二分類)
運行時長:78.6s
'''
import numpy as np
import time
def loadData(fileName):'''加載Mnist數據集:param fileName:要加載的數據集路徑:return: list形式的數據集及標記'''print('start to read data')# 存放數據及標記的listdataArr = []; labelArr = []# 打開文件fr = open(fileName, 'r')# 將文件按行讀取for line in fr.readlines():# 對每一行數據按切割福','進行切割,返回字段列表curLine = line.strip().split(',')# Mnsit有0-9是個標記,由于是二分類任務,所以將>=5的作為1,<5為-1if int(curLine[0]) >= 5:labelArr.append(1)else:labelArr.append(-1)#存放標記#[int(num) for num in curLine[1:]] -> 遍歷每一行中除了以第一哥元素(標記)外將所有元素轉換成int類型#[int(num)/255 for num in curLine[1:]] -> 將所有數據除255歸一化(非必須步驟,可以不歸一化)dataArr.append([int(num)/255 for num in curLine[1:]])#返回data和labelreturn dataArr, labelArr
def perceptron(dataArr, labelArr, iter=50):'''感知器訓練過程:param dataArr:訓練集的數據 (list):param labelArr: 訓練集的標簽(list):param iter: 迭代次數,默認50:return: 訓練好的w和b'''print('start to trans')#將數據轉換成矩陣形式(在機器學習中因為通常都是向量的運算,轉換稱矩陣形式方便運算)#轉換后的數據中每一個樣本的向量都是橫向的dataMat = np.mat(dataArr)#將標簽轉換成矩陣,之后轉置(.T為轉置)。#轉置是因為在運算中需要單獨取label中的某一個元素,如果是1xN的矩陣的話,無法用label[i]的方式讀取#對于只有1xN的label可以不轉換成矩陣,直接label[i]即可,這里轉換是為了格式上的統一labelMat = np.mat(labelArr).T#獲取數據矩陣的大小,為m*nm, n = np.shape(dataMat)#創建初始權重w,初始值全為0。#np.shape(dataMat)的返回值為m,n -> np.shape(dataMat)[1])的值即為n,與#樣本長度保持一致w = np.zeros((1, np.shape(dataMat)[1]))#初始化偏置b為0b = 0#初始化步長,也就是梯度下降過程中的n,控制梯度下降速率h = 0.0001#進行iter次迭代計算for k in range(iter):#對于每一個樣本進行梯度下降#李航書中在2.3.1開頭部分使用的梯度下降,是全部樣本都算一遍以后,統一#進行一次梯度下降#在2.3.1的后半部分可以看到(例如公式2.6 2.7),求和符號沒有了,此時用#的是隨機梯度下降,即計算一個樣本就針對該樣本進行一次梯度下降。#兩者的差異各有千秋,但較為常用的是隨機梯度下降。for i in range(m):#獲取當前樣本的向量xi = dataMat[i]#獲取當前樣本所對應的標簽yi = labelMat[i]#判斷是否是誤分類樣本#誤分類樣本特診為: -yi(w*xi+b)>=0,詳細可參考書中2.2.2小節#在書的公式中寫的是>0,實際上如果=0,說明改點在超平面上,也是不正確的if -1 * yi * (w * xi.T + b) >= 0:#對于誤分類樣本,進行梯度下降,更新w和bw = w + h * yi * xib = b + h * yi#打印訓練進度print('Round %d:%d training' % (k, iter))#返回訓練完的w、breturn w, b
def test(dataArr, labelArr, w, b):'''測試準確率:param dataArr:測試集:param labelArr: 測試集標簽:param w: 訓練獲得的權重w:param b: 訓練獲得的偏置b:return: 正確率'''print('start to test')#將數據集轉換為矩陣形式方便運算dataMat = np.mat(dataArr)#將label轉換為矩陣并轉置,詳細信息參考上文perceptron中#對于這部分的解說labelMat = np.mat(labelArr).T#獲取測試數據集矩陣的大小m, n = np.shape(dataMat)#錯誤樣本數計數errorCnt = 0#遍歷所有測試樣本for i in range(m):#獲得單個樣本向量xi = dataMat[i]#獲得該樣本標記yi = labelMat[i]#獲得運算結果result = -1 * yi * (w * xi.T + b)#如果-yi(w*xi+b)>=0,說明該樣本被誤分類,錯誤樣本數加一if result >= 0: errorCnt += 1#正確率 = 1 - (樣本分類錯誤數 / 樣本總數)accruRate = 1 - (errorCnt / m)#返回正確率return accruRate
if __name__ == '__main__':#獲取當前時間#在文末同樣獲取當前時間,兩時間差即為程序運行時間start = time.time()#獲取訓練集及標簽trainData, trainLabel = loadData('../Mnist/mnist_train.csv')#獲取測試集及標簽testData, testLabel = loadData('../Mnist/mnist_test.csv')#訓練獲得權重w, b = perceptron(trainData, trainLabel, iter = 30)#進行測試,獲得正確率accruRate = test(testData, testLabel, w, b)#獲取當前時間,作為結束時間end = time.time()#顯示正確率print('accuracy rate is:', accruRate)#顯示用時時長print('time span:', end - start)