數學建模需要怎樣的編程水平?
經濟學專業,編程0基礎,想知道數學建模究竟需要怎樣的編程水平,是否可以自學。 @數學建模老司機 @張浩馳 @王小龍
謝邀,(本回答為去年美賽前的回答)三次數模國獎路過,曾經單挑過兩次國賽(第三次有一個負責編程的同學給予我很大的幫助)。稍微談談編程這一塊的經驗吧,現在臨近美賽,時間也不多了。最高票回答適合長時間準備(至少有一個從校內賽到國賽的周期,我就談談只剩下一個月不到應該如何準備編程這一塊工作吧)。編程的同學,主要是把建模同學的思想給生產出結果,也就是輸出一定的東西,可以是圖,可以是表可以是數據等等。當你隨便打開一本數模書(比如司守奎老師寫的《數學建模演算法與應用》這本書),你會被裡面的Matlab,lingo等代碼嚇住,尤其是以前不怎麼編程的同學來說更為如此。所以數模三個部分,很多同學會覺得編程非常難以上手。其實,負責編程的同學,並不是說比誰代碼寫得長,誰代碼寫得好,而是應該為建模的同學提供一個結果(只從數模拿獎(功利的角度出發)無論結果的好壞,甚至是否有結果,在比賽即將結束的時刻,都應該給建模隊友一個所得過去的「答案」),所以可以在做一些數模問題的時候,用一些較為「傻瓜」的軟體,比如SPSS,這個軟體可以解決統計學中的很多問題,比如2012年的國賽葡萄酒評價問題,這道題就是使用SPSS的代表。所以說,以其說是會編程,不如說是應該會使用相關軟體,讓所建模型輸出一個不錯的結果。還有作圖軟體Origin,在進行一些簡單的作圖時候,可以使用Origin而沒有必要去使用Matlab進行畫圖,一般情況下,在問題不太複雜的時候,是沒有必要使用Matlab的。還有一款軟體叫做Visio,這款軟體是畫流程圖的利器,比如說寫完一段程序附上程序框圖,或者用系統動力學解決一個問題時畫的系統流圖,得到的效果都是非常棒的(PS:初次學習建模的同學,無論如何一定要在Matlab上面下一點功夫,即使沒有辦法掌握,也需要知道如何修改別人的優秀程序,為我所用)。
如果真的想短期學會一個真正需要編程的語言,還是選Matlab吧,雖然在短時間之類,你是無法把這門語言學到精通,但是只要知道Matlab的語法規律,以及一些基本功能,一些基本的工具箱就足夠了,這裡推薦兩本書,一本是《Matlab完全自學一本通》這本書上面基本上包含了可以用得到的功能,至少是基礎功能。在數模上面,可以司守奎老師寫的《數學建模演算法與應用》這本書,一般常用模型的代碼都給出來了。還有一個最關鍵的是,比賽前,多看看別人寫的優秀論文。不管是國賽還是美賽,都有著優秀論文集,看看別人寫的論文還有別人的代碼,爭取找到一些靈感。
在比賽的過程中,如果什麼地方卡住了,一定不要蒙著頭想,應該即使去相關論壇查找一些使用技巧,當然Matlab自身的幫助文檔也是挺不錯的。多說一句話,LaTeX是寫作排版用的,雖然也是類似於編程語言,不建議編程的人去學習,應該去鼓勵寫作的同學學習LaTeX,編程的同學應該和建模的同學好好合作,合力把比賽題目拿下。看到數學建模老司機(國一優秀論文獲得者,深圳杯獲得者,SAS大賽冠軍)的回答了,SPSS在這幾年的國賽的賽題(2014,2015,2016)當中確實比較難使用了,問題基本上都是純物理類問題(2014航天,2015球面天文學,2016受力分析)而且SPSS還有一個非常強大的競爭對手SAS的存在。至少是國賽A題,一般都是需要自己踏踏實實建模,最後使用Matlab實現。但是,A題由於過於考察建模的實力,因此一些非理工科的學生往往望而怯步。R,Python以及SAS作為數據分析時代的新興語言,大家可以有空的時候學一學。由於現在有一個SAS數據分析大賽(由滙豐銀行贊助,SAS公司主辦)搞的還不錯,大家可以學一學SAS然後去這個比賽中練一練手。參加過蠻多的比賽,還是發現SAS舉辦的這個數據分析競賽(尤其是決賽)給我的參賽體驗非常地好。其實,如果單純從拿獎的角度來說,某些問題,尤其是國賽B題, 美賽E、F題對於程序要求不高的情況下,可以適當地使用現有的模型理論對具體問題進行分析。但是,從2014年開始每一年國賽A題基本上都很難找到可以直接套用的模型(雖然2016年的系泊系統在知網上面有很多現成的研究結果,但是往往不是太複雜,就是和題目分析的背景有點不太一樣),這也是我前面說為什麼對於沒有經歷過理工科訓練的學生很容易望而怯步的原因。所以,我覺得如果你想做好A題,在近些年A題越來越需要自己建模,自己使用一定的軟體實現的大環境下,建議有一定改編現有程序的能力。期末考前預習電機學到筋疲力盡來順便刷個知乎。
拿了兩次國賽國二 ,還有若干次失敗的美賽以及亂七八糟練手的經歷。 其實一般來說,建模,程序和論文三者不是完全割裂的,並不是說一個人只需要了解自己的東西就可以了。既然是面對建模新手,我覺得首先三個人都要了解包括但不僅限於以下的知識點:0 查閱文獻的能力,以及至少看個五六篇別人的論文,學習摘要,結論的寫法以及解題思路和工具。
1 matlab入門簡單編程和出圖,三個人都要掌握。
2 數學基礎知識 包含 基本常用擬合曲線形式及特點。線性擬合線性度。了解插值和回歸。微分偏微分方程求解及數值解,分別了解其數學意義和常用程序。入門之後可以考慮學習mathmatica,以及wolfram是一個很好用的在線工具。矩陣向量 線性代數的基礎知識 概率論與數理統計 了解數據特點,以及拿到數據要分析什麼,比如分布檢驗等等。單獨把傅氏變換,拉氏變換,快速傅立葉fft,小波分析,卷積為代表的複變函數拿出來強調一下。3 物理相關知識
有限元法大學物理,如果不夠用的話加上材料力學。注意力學困難的問題可以考慮從能量或者最小作用量原理了解一下。
量綱分析4 運籌學及演算法入門
決策樹 二分法 牛頓法 遺傳演算法 退火演算法 貪心演算法等等 了解概念,做到會改別人的代碼。主成分分析法 敏感度分析法 歸一化方法 正則化等數據分析演算法項目管理 工程經濟學也有一些知識點有時候會出現。5 演算法進階
時間序列 支持向量機 神經網路 灰色預測 元胞自動機等等 做到會改能用就行,不必要精通。6軟體及程序
入門建議選擇matlab,上手之後可以考慮用Python做符號運算建議用mathmatica數據統計分析spss,但是也不要忽視高版本的Excel,Excel現在也有很多很好的插件功能,比如可以代替arcgis繪製地圖。線性規劃 不等式 lingo 簡單了解一下,可以不用有限元 物理題目可能會用,如果會的話會減輕壓力。有ansoft anysys comsol等出圖入門掌握matlab,入門以後建議嘗試orgin等,matlab畫圖帶鋸齒,很討厭。查閱某些東西和畫某些簡易圖可以用wolfram直接得出。最後建議看幾本書 最有名的就是姜啟源那本數學建模然後建議不要忘了同濟的藍皮概率論與數理統計
還有運籌學的教材 清華出版那本就夠了如果還有餘力可以參考一下顧樵那本數學物理方法這應該是最後一次更新。
首先控訴一下這個多災的暑假,一年不生一次病的我,從八月初就開始重感冒,重感冒剛好不知道吃錯了哪家無良的外賣,急性腸胃炎住院(中間拖了兩天,住院的時候還蠻嚴重的)打吊瓶吃藥吃鹹菜。稍微好一點就騙家長說自己完全好了就返校了。回到學校的第一天晚上就又重感冒了(.....)應該是之前的細菌還在等我回來:)喝著熱水吃著葯吸著鼻涕打著噴嚏...都這副慘狀了,電腦忽然間罷工了,把老夥計送到專賣店去修,沒說什麼毛病,只說要寄到石家莊去修。:)到今天還沒修回來,後天就是國賽前的模擬了,凌亂狀....
回歸正題。
python入門的教程在網上隨便一搜就能搜到很多,當初我是跟著小甲魚學習的
[小甲魚]零基礎入門學習Python_野生技術協會_科技_bilibili_嗶哩嗶哩
對於新手蠻不錯的教程,開倍速秘制帶感(網易雲課堂上也有課程,就可以在移動端開倍速)
這裡著重安利一下北大的python數據結構課程:
數據結構與演算法2015春季 - 北京大學新一代GIS研究室
因為我之前一直在找數據結構的python版本,終於找到了,好東西分享一波。
我沒看視頻,我把講義down下來k過了一遍,收穫還是挺大的:
我的課堂代碼摘抄:數據結構(python) - .delete - 博客園
然後是一些建模方法的python實現:
動態優化 ---------&> 學習北大數據結構動態優化一章。
線性最優 ----------&> scipy.optimize.linprog
最小二成擬合 ----------&> numpy.ploy1d
多項式擬合 ----------&> 沒有現成方法,自己寫
聚類 ----------&> from sklearn.neighbors import KNeighborsClassifier (KNN)
from sklearn.cluster import KMeans(KMeans)
決策樹 ----------&> form sklearn.tree import DessionTreeClassifier
貝葉斯演算法(樸素貝葉斯) ----------&> from sklearn.naive_bayes import GaussianNB
支持向量機 ----------&> from sklearn import svm
回歸 ----------&> from sklearn import linear_model (這裡邊包括了線性,邏輯,隨機樹森林
多項式,嶺回歸等等)
主成分 ----------&> import sklearn.cluster.DBSCN
繪圖 ----------&> import matplotlib.pyplot as plt
import seaborn as sns
數據結構 ----------&> import pandas as pd(Series,DataFrame)
基本上我能想到的就是這些了,其他的一些像對曲線的處理或者解方程等等我一般都使用Matlab做。當然以上的所有方法在lingo都能實現。我用Matlabh+lingo做了一次Kaggle的泰坦尼克之災,得分一樣,但是點點點明顯比敲代碼要舒服的多。
只擼了一個base model,慢慢的再優化。
代碼用到的一些方法:
#Pandas
import pandas as pd
from pandas import Series,DataFrame
#Numpy,Matplotlib
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
#ML
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC,LinearSVC
from sklearn.ensemble import RandomForestClassifier
from sklearn.ensemble import RandomForestRegressor
from sklearn.neighbors import KNeighborsClassifier
from sklearn.naive_bayes import GaussianNB
#Os
import os
os.chdir("C:\Users\pangxianyu\Desktop")
以上,一個對python有興趣的自學小白,如果有錯誤歡迎及時斧正。
預祝大家都取得好成績!
(希望我電腦快點修好.....
-----發布自求爺爺告奶奶借來的電腦
--------------------------------------------最後一更分割線---------------------------------------
校級複試過了,來補充一下。
python相較於matlab和lingo有一個對新手不太好的地方是沒有很多的參考事例。
拿這次複試來說,之前我一直是用python的,之前老師說過對語言沒有要求,考前一天忽然題目有要求用的軟體,臨時抱佛腳在網上找了一個matlab實現的《數學建模和編程》裡邊整本書都是數學建模的例子和用matlab實現的代碼。而我在之前搜索專門的python書籍沒找到這麼專業的。所以還沒入坑的推薦數學軟體。
考試的時候四道題全部用的python實現,然後再在matlab中找到對應的方法,提交答案的時候提交matlab程序。為什麼這麼做?因為在我看來python確實好用啊= ̄ω ̄=,提前四十分鐘交卷。
但是過程一波三折,提交的版本是中途保存的一個版本,上邊只寫了兩道題,不過還算走運,順利拿到了國賽和夏令營的入門券。
這個暑假打算一邊參加夏令營,一邊把數學建模上的知識用python 實現一遍,目前實現了線性最優,最小二乘法,多項式擬合,聚類,主成分,回歸演算法(建模叫分類)等等吧。
給自己挖個坑,所有方法都實現後會把博客地址貼在這裡。
加油。
17-07-07
---------------------------------分----------------割-------------線--------------------------------
當初只是隨手一答,有人點贊,誠惶誠恐,把答案重新編輯下:)
今年準備參加,培訓的時候老師講了畫圖用matlab,數學分析用SPSS,lingo,還講了幾個例子,我去,畫圖不就是python中的matplotlib庫,聚類降維神經網路不就是機器學習sklern中的kmeans,knn,neturework嗎。。。
參加校選賽的題目是關於共享單車時空配比,題目沒有給數據,網上也找不到,我就花了點時間在gitub上找了個輪子自己改了改,用python爬蟲爬的天津地區摩拜單車的數量和坐標,再用kmeans聚類,matplotlib畫圖。
選擇上邊那些軟體的話其它答主已經說的很詳細了,參見他們的回答即可。
如果選擇python的話,需要掌握的有:1、python版本的選擇與安裝 對比VC,python的安裝需要費點時間,如果熟悉Linux會輕鬆很多。目前py2x和py3x共存,在剛入門的時候需要看你選擇的是哪個版本,不同版本支持的包不同。多說一句,用2x的話如果用到3x的method,import futuer就好了,但是3x是主流和未來的方向XD(下邊的sklearn和tensorflow就是不同的python 版本。)2、IDE的選擇
推薦jupter book。我目前使用的python為py36,sklearn的env是py27。在jupter book上邊創建好kernels,然後切換kernel就可以達到切換env的作用。3、基本操作和包
如果上邊的基礎準備都做好了,開始學基礎操作,基本的教學視頻就好了,重點掌握集合,列表,元組,函數,方法,for,magic(如果有時間的話),基本的四則運算,賦值什麼的。python作為一門膠水語言,又以對程序員友好著稱,學習起來我認為不是很痛苦,我之前有C,Java和Matlab的基礎,學的比較快。 包的話重點掌握numpy,pandas,matplotlib,這些裡邊是數學運算,文件處理和圖形繪製,建模的時候都會有用,重點掌握。其他的分類,回歸,聚類,降維,神經網路,相關性分析之類的都在sklearn中(即機器學習中大名鼎鼎sciki-learn的簡稱,不過不要被嚇到,它的數學思想和你學的概率論和數理統計差不多,單純的調用的話看看文檔和技術博客就好,需要我推薦的話可以私信或留言:) 還有一個包是谷歌推的tensorflow,它的領域是多重神經網路和深度學習,如果還有精力的話可以去探索,私以為建模的數據量和複雜程度會使它的學習深度不會太深,它上場的機會不大。人生苦短,我用python。
最後提一點,python作為一門語言,它的學習成本可能要比上邊那些軟體要大。
獻給那些想做建模走python技術棧的人,希望可以幫到你們。
謝不妖。
所謂的數學建模至少要有一個程序猿是因為數學建模比賽很多時候數據太過龐大無法手算。
數學建模要求的程序猿不一定要多強的編程水平,不一定要求必須是個計算機專業的,很多時候要的是一個善於向隊友解釋這個演算法用來幹什麼(或者有什麼局限性),懂得什麼模型用什麼演算法並且能夠把它實現出來的中國好隊友。
數學建模推薦MATLAB、SPSS(我只會這個,別噴我T_T)、lingo、R語言。其實這裡面會一個MATLAB你就差不多入門了(○』ω』○)因為數學建模我一不小心從一名物理專業學生成為了一名程序員……
所以,什麼叫有沒有編程知識,你發現隊友不會寫程序時難道不該你上?你發現隊友寫不好文檔時難道不該你上?你發現隊友需要鼓勵時難道不該你上?你發現隊友拉不到外援的時候難道不該你拉?
所以,編程基礎不重要,關鍵是抱住我這樣的大腿,數學建模一站式服務。
然後,雖然,我隊最後沒拿獎。
但我變成了程序員。
最後,真現學就夠了。無論你用matlab lindo lingo sass spss r python tex。糊弄數學建模總是夠的,特別是國賽去年參加數學建模,我們老師培訓的軟體有MATLAB、SPSS、Lingo,基本上這些軟體就可以了。如果你是自學的話,強烈建議從Matlab著手,因為它是數學系學生解決問題的主要軟體,其次,在解決建模等問題,它佔了很大的比例。如果Matlab的軟體你學通了的話,其他軟體是很好上手的。spss是傻瓜式的,不用編程,lingo你基本上不用費太大的勁學,數學系學生的數學建模教材,掌握其中不同模型的編程格式,學會定義集合的方式編程基本上就夠啦!當然了數學建模題目趨向於多元化,與實際結合。比如我們去年選的一道題,其中用到了交通模擬軟體,老師也沒聽說過,之前也沒聽說過。比賽期間現學現用。所以,精通很好,但是更重要的是,提供自學能力和應變能力。我覺得參加數學建模不需要精通,你能掌握其語言規則,一般水平就可以,精通也是需要時間的。題主是經濟系,有可能對數學系的數學建模內容不是很了解,需要稍微補一下數學方面的知識。團隊成員不是獨立的,寫作、建模、編程每個人都要有所了解的,方便團隊協作討論。
數學建模用matlab,你學了之後就會覺得非常好,如果有C++基礎學這很快。
數學軟體用lingo+python
只要論文寫得好就OK了,哈哈哈哈哈哈哈哈哈 編程和模型就是順帶的事情
推薦閱讀:
※對於血鉀濃度改變引起心肌興奮性的變化?其變化可否用函數表達?表達式是否具有意義?
※學數學的人思想都比較保守嗎?
※數學建模想放棄怎麼辦?
TAG:數學建模 |