2021 年 五一数学建模比赛 B 题(第四问至第六问)
文章目錄
- 第四問
- 第一理解
- 第二理解
- 第五問
- 第六問
- PageRank 算法
- 應(yīng)用 PageRank
- J 和 N 設(shè)置消防站后
- 逐年建立消防站(失敗的嘗試)
- 改進方案
- 代碼與提問
本人專挑數(shù)據(jù)挖掘、機器學(xué)習(xí)和 NLP 類型的題目做,有興趣也可以逛逛我的 數(shù)據(jù)挖掘競賽專欄。
如果本篇博文對您有所幫助,請不要吝嗇您的點贊 😊
賽題官網(wǎng):http://51mcm.cumt.edu.cn/
返回目錄
第一題到第三題鏈接
第四問
題目是找出不同區(qū)域,相關(guān)性最高的事件。我們首先整理出事件類型-事件發(fā)生密度表格,如下所示:
什么是相關(guān)性,我覺得有兩個理解:
第一理解
對于第一個理解,可以沿著上表的行,求出事件的方差,方差最大的那個,就是啦。求出方差如下:
于是,事件 7 是不同區(qū)域相關(guān)性最大的。
第二理解
第二個理解,沿著行,求出數(shù)據(jù)的相關(guān)性矩陣,找出最大的那個相關(guān)性,對應(yīng)的兩個事件,就是啦。
計算偏相關(guān)矩陣(使用Pearson相關(guān)系數(shù)),偏相關(guān)系數(shù)可以刪除其他因素的影響,所以使用偏相關(guān)系數(shù):
從上圖可以找出,事件 3 和 事件 7 在不同區(qū)域的相關(guān)性最高。
第五問
找出人口密度和事件密度的關(guān)系,首先就得統(tǒng)計出數(shù)據(jù)咯:
其中事件密度是根據(jù) 16-20 年的總數(shù)據(jù)算出來的。
如何找出關(guān)系呢?還記得問題二的方法嗎?
我們首先畫出數(shù)據(jù):
大致可以猜測出,人口密度越大,事件密度(16-20年)越大。
采用第二問的一元回歸方法,用線性函數(shù)去擬合數(shù)據(jù),可得:
我們可以用 R 方來評價模型的效果,計算出模型的 R 方為:0.9996,可見模型的效果很好。
于是,人口密度和事件密度(16-20):y=0.4116x?0.02374y=0.4116 x - 0.02374y=0.4116x?0.02374
第六問
第六問是:
目前該地有兩個消防站,分別位于區(qū)域J和區(qū)域N,請依據(jù)附件1和附件2,綜合考慮各種因素,建立數(shù)學(xué)模型,確定如果新建1個消防站,應(yīng)該建在哪個區(qū)域?如果在2021-2029年每隔3年新建1個消防站,則應(yīng)依次建在哪些區(qū)域?
從第四問可知,由于人口密度和事件密度呈現(xiàn)線性關(guān)系,且是正相關(guān),所以我們只需要考慮人口密度即可。
先看第一問:該地已經(jīng)有兩個消防站,另一個消防站該建在哪里?
我們不妨先考慮簡單的:如果沒有消防站,那么消防站應(yīng)該建在哪里?
若沒有消防站,那么,我們可以用谷歌的網(wǎng)頁排行算法來解決這個問題。具體是:
于是:就可以搜索出最重要的網(wǎng)頁,也就是,最重要的節(jié)點!
那么,邊的權(quán)重,以及網(wǎng)頁的權(quán)重,該如何設(shè)置呢?
首先得來看看 PageRank 算法的原理:
PageRank 算法
PageRank 算法要求每一個節(jié)點的權(quán)重之和是 1,權(quán)重是為了模擬每個網(wǎng)頁被點擊的概率(所有網(wǎng)頁被點擊的概率當(dāng)然是 1)
PageRank 算法要求每一個節(jié)點,散發(fā)出的所有邊,的權(quán)重之和,為 1。
然后,PageRank 的算法如下(篇幅原因,就用專業(yè)的語言描述吧):
設(shè)每一個節(jié)點的權(quán)重為 NiN_iNi?,iii 是節(jié)點編號,為了方便,就即為 {1,2,?,n}\{1,2,\cdots,n\}{1,2,?,n},nnn 為節(jié)點的數(shù)量;若 iii, jjj 存在邊,記邊的權(quán)重為 wijw_{ij}wij?。設(shè)收斂標(biāo)準為:tol,最大迭代步長為:T,當(dāng)前步長為:t,設(shè)權(quán)重傳遞時的損失參數(shù)為 α\alphaα算法如下:
initialNi(0)t=0for???i???in???n:for???j???in???wi:Nj(t+1)+=α?Ni(t)?wijift≤T:breakwhile∑∣Ni(t?1)?Ni(t)∣≤tol\begin{aligned} &initial N_i(0) \\ &t=0 \\ &\text{for ~ }\text{i ~ in ~ }n: \\ &\text{~~~~~~~~for ~ }\text{j ~ in ~ } w_i: \\ &\text{ ~~~~~~~~~~~~~ ~~~~ } N_j(t+1) += \alpha \cdot N_i(t) \cdot w_{ij}\\ &if \text{~~~~}t \leq T:\\ &\text{~~~~~~~~}break\\ &while \sum|{N_i(t-1)-N_i(t)}|\leq tol \end{aligned} ?initialNi?(0)t=0for???i???in???n:????????for???j???in???wi?:????????????????????Nj?(t+1)+=α?Ni?(t)?wij?if????t≤T:????????breakwhile∑∣Ni?(t?1)?Ni?(t)∣≤tol?
應(yīng)用 PageRank
如何應(yīng)用呢?
首先如何將節(jié)點設(shè)置為總和為 1?我認為直接將人口密度進行標(biāo)準化即可。
如何將某節(jié)點的邊,設(shè)置為總和為 1?
當(dāng)兩個點的距離越大時,應(yīng)該賦予一個較大的權(quán)重。因為距離越遠,意味著越需要消防站。因此,如某點到 1,2, 3 的距離為 40,50,10,則權(quán)重分別為 0.4, 0.5, 0.1;
帶入 PageRank 算法,可得結(jié)果如下:
因此,當(dāng)沒有消防站時,最重要的節(jié)點是 D。此時應(yīng)該在 D 中設(shè)置消防站。從這個結(jié)果來看,還算是比較合理,畢竟 D 節(jié)點鏈接的邊最多,而且人口密度也比較多:
J 和 N 設(shè)置消防站后
沒有設(shè)置消防站是,我們用人口密度的標(biāo)準化,作為節(jié)點的權(quán)重。
在 J 和 N 設(shè)置消防站后,只需要將 J 和 N 的權(quán)重設(shè)置為 0 即可(或負數(shù),意味著其鏈接的點的權(quán)重也會在迭代過程中下降),這里設(shè)置為負數(shù)也即,標(biāo)準化后,J 和 N 的權(quán)重為 $ n(w)/15$。其中 n(w)n(w)n(w) 為該節(jié)點的邊數(shù)。
之所以設(shè)置為 ?2/15-2/15?2/15,是因為圖的節(jié)點總數(shù)為 15 個,而我們認為一個消防站所起到的撲滅功能,頂?shù)纳?strong>平均意義上的 n(w)n(w)n(w) 個節(jié)點權(quán)重。當(dāng)然,這個數(shù)值的設(shè)置有主觀性,it depends。
此時依舊使用 PageRank 算法,可得:
逐年建立消防站(失敗的嘗試)
因為不知道人口密度的變化,所以按照我們的理論,這是一個靜態(tài)模型。2021 到 2029 一共 9 年,三年一次,迭代三次。按照上述算法,迭代三次即可:
在運行代碼時,我們發(fā)現(xiàn)連續(xù)三次都需要在 I 中設(shè)置消防站,這明顯是不合理的。究其原因,就是因為負數(shù)在迭代過程中,對周圍的線條的影響,超出了我們主觀上的預(yù)估。
但筆者在將有消防站的節(jié)點的權(quán)重,設(shè)置為 0 時,則出現(xiàn)下面的情況:
改進方案
本文所講解的 PageRank 是最簡單形式。實際上還有許多復(fù)雜的算法。對于設(shè)置了消防站的節(jié)點,我們可以將其視為懸浮節(jié)點,也即對所有節(jié)點都看成有鏈接,且鏈接是單向的,并根據(jù)距離,設(shè)置單獨地權(quán)重。
至于如何實現(xiàn),就要看大家啦!
代碼與提問
若需要代碼,請點贊,關(guān)注、私信、說明題目和年份
如果有其他問題,請到評論區(qū)留言,私信提問,概不回答。也在此鼓勵大家獨立思考。
本人不會回訪,不互關(guān),不互吹,以及謝絕諸如此類事
總結(jié)
以上是生活随笔為你收集整理的2021 年 五一数学建模比赛 B 题(第四问至第六问)的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: ARM处理器工作模式
- 下一篇: colorUI的使用