拓端tecdat|R語言中的SOM(自組織映射神經網絡)對NBA球員聚類分析


原文鏈接:http://tecdat.cn/?p=19077

 

導入

自組織映射 (SOM)是一種工具,通過生成二維表示來可視化高維數據中的模式,在高維結構中顯示有意義的模式。通過以下方式使用給定的數據(或數據樣本)對SOM進行“訓練”:

  • 定義了網格的大小。
  • 網格中的每個單元都在數據空間中分配了一個初始化向量。
    • 例如,如果要創建22維空間的地圖,則會為每個網格單元分配一個22維向量。
  • 數據被反復輸入到模型中進行訓練。每次輸入訓練向量時,都會執行以下過程:
    • 識別具有最接近訓練向量的代表向量的網格單元。
    • 隨着訓練向量的多次輸入,收斂的參數使調整變得越來越小,從而使地圖穩定。

該算法賦予SOM的關鍵特征:數據空間中接近的點在SOM中更接近。因此,SOM可能是表示數據中的空間聚類的好工具。

Kohonen映射類型

下面的示例將使用2015/16 NBA賽季的球員統計數據。我們將查看每36分鍾更新一次的球員統計信息。這些數據可從 http://www.basketball-reference.com/獲得。我們已經清理了數據。

  1.  
    NBA <- read.csv( "NBA_cleaned.csv",
  2.  
    sep = ",", header = T, check.names = FALSE)

基本SOM

在創建SOM之前,我們需要選擇要在其中搜索模式的變量。

colnames(NBA)
  1.  
    ## [ 1] "" "Player" "Pos" "Age" "Tm" "G" "GS"
  2.  
    ## [ 8] "MP" "FG" "FGA" "FG%" "3P" "3PA" "3P%"
  3.  
    ## [ 15] "2P" "2PA" "2P%" "FT" "FTA" "FT%" "ORB"
  4.  
    ## [ 22] "DRB" "TRB" "AST" "STL" "BLK" "TOV" "PF"
  5.  
    ## [ 29] "PTS"

我們從簡單示例開始:

som(scale(NBA[res1], grid = somgrid(6, 4, "rectangular") 

請注意,我們標准化了訓練數據,並定義了網格大小。標准SOM圖可為網格單元的代表矢量創建這些餅圖表示,其中半徑對應於特定維度上的大小。

熱圖SOM

我們可以通過將每個球員分配到具有最接近該球員狀態的代表向量來識別地圖。“計數”類型的SOM根據球員數量創建了一個熱圖。

  1.  
    # 色帶
  2.  
     
  3.  
    colors <- function(n, alpha = 1) {
  4.  
    rev(heat.colors(n, alpha))
  5.  
    }

繪圖點

您可以使用“映射”類型的SOM將球員繪制為網格上的點。我們與常規SOM進行可視化比較。

每個地圖單元格的代表性矢量顯示在右側。左側是根據其狀態與這些代表向量的接近程度繪制的球員圖表。

環形SOM

下一個示例是一種更改幾何形狀的方法。在為上述示例訓練SOM時,我們使用了矩形網格。由於邊緣(尤其是拐角處)的單元比內部單元具有更少的鄰居,因此傾向於將更多的極端值推到邊緣。

  1.  
    par( mfrow = c(1, 2))
  2.  
    plot( NBA.SOM2, type = "mapping", pchs = 20, main = "Mapping Type SOM")
  3.  
    plot( NBA.SOM2, main = "Default SOM Plot")

映射距離

當用繪制時 type = "dist.neighbours",單元格將根據與它們最近的鄰居的距離着色,這使我們可以直觀地看到高維空間中不同要素之間的距離。

plot(SOM2, type = "dist.neighbours")

 

有監督SOM

有監督的SOM使我們可以進行分類。到目前為止,我們僅將三維數據映射到二維。當我們處理更高維度的數據時,SOM的實用性變得更加明顯,因此讓我們使用擴展的球員統計信息列表來做這個受監督的示例:

我們創建有監督的SOM,並根據球員在球場上的位置對其進行分類。我們將數據隨機分為訓練集和測試集。

  1.  
    indices <- sample( nrow(NBA), 200)
  2.  
    training <- scale( NBA[indices, NBA.measures2])
  3.  
    testing <- scale( NBA[-indices, NBA.measures2], center = attr(training,
  4.  
    "scaled:center"), scale = attr(training, "scaled:scale"))

請注意,當我們重新標准化測試數據時,我們需要根據訓練數據的方式對其進行標准化。

您可以在訓練算法中對訓練變量(NBA.training)與預測變量(NBA$Pos)進行加權。現在讓我們檢查預測的准確性:

  1.  
    ##
  2.  
    ## Center Point Guard Power Forward Shooting Guard
  3.  
    ## Center 16 0 26 1
  4.  
    ## Point Guard 0 49 0 12
  5.  
    ## Power Forward 10 1 29 5
  6.  
    ## Shooting Guard 0 8 4 38
  7.  
    ## Small Forward 0 0 15 9
  8.  
    ##
  9.  
    ## Small Forward
  10.  
    ## Center 4
  11.  
    ## Point Guard 11
  12.  
    ## Power Forward 8
  13.  
    ## Shooting Guard 19
  14.  
    ## Small Forward 38

可視化預測:

這次,我們使用xweight 參數為權重衡量球員統計數據 。

使用type = "codes" 我們進行繪制,可以 得到標准的可視化球員狀態(Codes X)和球員位置預測(Codes Y)。

  1.  
     
  2.  
    add.cluster.boundaries(NBA.SOM4, NBA.SOM4.hc)

該視圖使我們可以將球員統計數據與位置預測進行比較。

可視化預測:自定義SOM

在最后一個示例中,我們將對該type = mapping 圖進行一些自定義, 以便我們可以同時表示實際球員位置和SOM的預測位置。我們將從可視化開始。

背景顏色繪制的球員點的背景代表其真實位置。

  1.  
    bg.pallet <- c( "red", "blue", "yellow", "purple", "green")
  2.  
     
  3.  
    # 為所有單元格制作僅背景顏色的矢量
  4.  
     
  5.  
    base.color.vector <- bg.pallet[match(position.predictions, levels(NBA$Pos))]
  6.  
     
  7.  
    # 設置alpha以最大的預測置信度標准化
  8.  
     
  9.  
     
  10.  
    max.conf <- apply(NBA.SOM4$codes$Y, 1, max)

最受歡迎的見解

1.R語言k-Shape算法股票價格時間序列聚類

2.R語言中不同類型的聚類方法比較

3.R語言對用電負荷時間序列數據進行K-medoids聚類建模和GAM回歸

4.r語言鳶尾花iris數據集的層次聚類

5.Python Monte Carlo K-Means聚類實戰

6.用R進行網站評論文本挖掘聚類

7.用於NLP的Python:使用Keras的多標簽文本LSTM神經網絡

8.R語言對MNIST數據集分析 探索手寫數字分類數據

9.R語言基於Keras的小數據集深度學習圖像分類

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM