天天看點

【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試

  論文中的案例其實是來源于1993年全國大學生數學模組化競賽的b題—足球隊排名問題。

  1993年的全國大學生數學模組化競賽b題就出了這道題目,不過當時pagerank算法還沒有問世,是以現在用pagerank來求解也隻能算馬後炮,不過可以借鑒一下思路,順便可以加深對算法的了解,并可以觀察算法實際的效果怎麼樣。順便說一下,全國大學生數學模組化競賽的确非常有用,我在大學期間,連續參加過2004和2005年的比賽,雖然隻拿了一個省二等獎,但是這個過程對我的影響非常大。包括我現在的程式設計,解決問題的思路都是從模組化教育訓練開始的。希望在校大學生珍惜這些機會,如果能入選校隊,參加集訓,努力學習,對以後的學習,工作都非常有幫助。下面看看這個題目的具體問題:

【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試

  足球隊排名次問題要求我們建立一個客觀的評估方法,隻依據過去一段時間(幾個賽季或幾年)内每個球隊的戰績給出各個球隊的名次,具有很強的實際背景.通過分析題中12支足球隊在聯賽中的成績,不難發現表中的資料殘缺不全,隊與隊之間的比賽場數相差很大,直接根據比賽成績來排名次比較困難。

  下面我們利用pagerank算法的随機沖浪模型來求解.類比pagerank算法,我們可以綜合考慮各隊的比賽成績為每支球隊計算相應的等級分(rank),然後根據各隊的等級分高低來确定名次,直覺上看,給定球隊的等級分應該由它所戰勝和戰平的球隊的數量以及被戰勝或戰平的球隊的實力共同決定.具體來說,确定球隊z的等級分的依據應為:一是看它戰勝和戰平了多少支球隊;二要看它所戰勝或戰平球隊的等級分的高低.這兩條就是我們确定排名的基本原理.在實際中,若出現等級分相同的情況,可以進一步根據淨勝球的多少來确定排名.由于表中包含的資料量龐大,我們先在不計平局,隻考慮獲勝局的情形下計算出各隊的等級分,以說明算法原理。然後我們綜合考慮獲勝局和平局,權重後得到各隊的等級分,并據此進行排名。考慮到競技比賽的結果的不确定性,我們最後建立了等級分的随機沖浪模型,分析表明等級分排名結果具有良好的參數穩定性。

   首先利用有向賦權圖的權重矩陣來表達出各隊之間的勝負關系.用圖的頂點表示相應球隊,用連接配接兩個頂點的有向邊表示兩隊的比賽結果。同時給邊賦權重,表明占勝的次數。是以,可以得到資料表中給出的12支球隊所對應的權重矩陣,這是計算轉義機率矩陣的必要步驟,這裡直接對論文中的截圖進行引用:

【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試
【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試
【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試
【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試

  上述權重不夠科學,在論文中,作者提出了權重等級分,就是考慮平局的影響,對2個矩陣進行權重得到權重矩陣,進而得到轉移機率矩陣。這裡由于篇幅比較大,但是思路比較簡單,不再詳細說明,如果需要詳細了解,可以看論文。本文還是集中在c#的實作過程。

  

【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試

  下面我們将使用c#實作論文中的上述過程,注意,2.3和2.2的思想是類似的,隻不過是多了一個權重的過程,對程式來說還是很簡單的。下面還是按照步驟一個一個來,很多人看到問題寫程式很難下手,其實習慣就好了,按照算法的步驟來,一個一個實作,總之要先動手,不要老是想,想來想去沒有結果,浪費時間。隻有實際行動起來,才能知道實際的問題,一個一個解決,持之以恒,思路會越來越清晰。

  權重矩陣要根據測試資料,球隊和每2個球隊直接的比分來擷取,是以我們使用一個字典來存儲原始資料,将每個節點,2個隊伍的比賽結果比分都寫成數組的形式,來根據勝平負的場次計算積分,得到邊的權重,看代碼吧:

  上面最後傳回調用了歸一化的函數,比較簡單,直接代碼貼出來,折疊一下:

【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試
【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試

view code

  計算特征值和特征向量是一個數學問題,我們采用了math.net數學計算元件,可以直接計算很友善。詳細的使用可以參考下面代碼,元件的其他資訊可以參考本站導航欄上的專題目錄,有大量的使用文章。看代碼吧。

  随機沖浪模型主要是有一個比例,設定之後可以直接求解,也比較簡單,函數如下:

  其他問題就是資料組合的過程,這裡太多,不詳細講解。主要是建構測試資料以及排序後結果的處理,很簡單。貼一個球隊排序的函數,根據特征向量:

  我們使用問題1中的資料,進行測試,首先建構測試集合,代碼如下,太長,折疊一下,主要是問題1的原始資料:

【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試
【原創】機器學習之PageRank算法應用與C#實作(2)球隊排名應用與C#代碼1.足球隊排名問題2.利用PageRank算法的思路3.C#程式設計實作過程4.算法測試

測試的主要方法是:

排序結果如下:

結果和論文差不多,差别在前面2個,隊伍7和3的位置有點問題。具體應該是計算精度的關系如果前面的計算有一些精度損失的話,對後面的計算有一點點影響。

  pagerank的一個基本應用今天就到此為止,接下來如果大家感興趣,我将繼續介紹pagerank在球隊排名和比賽預測結果中的應用情況。看時間安排,大概思路和本文類似,隻不過在細節上要處理一下。

繼續閱讀