原文鏈接:http://tecdat.cn/?p=18726
自組織映射神經網絡(SOM)是一種無監督的數據可視化技術,可用於可視化低維(通常為2維)表示形式的高維數據集。在本文中,我們研究了如何使用R創建用於客戶細分的SOM。
SOM由1982年在芬蘭的Teuvo Kohonen首次描述,而Kohonen在該領域的工作使他成為世界上被引用最多的芬蘭科學家。通常,SOM的可視化是六邊形節點的彩色2D圖。
SOM
SOM可視化由多個“節點”組成。每個節點向量具有:
- 在SOM網格上的位置
- 與輸入空間維度相同的權重向量。(例如,如果您的輸入數據代表人,則可能具有變量“年齡”,“性別”,“身高”和“體重”,網格上的每個節點也將具有這些變量的值)
- 輸入數據中的關聯樣本。輸入空間中的每個樣本都“映射”或“鏈接”到網格上的節點。一個節點可以代表多個輸入樣本。
SOM的關鍵特征是原始輸入數據的拓撲特征保留在圖上。這意味着將相似的輸入樣本(其中相似性是根據輸入變量(年齡,性別,身高,體重)定義的)一起放置在SOM網格上。例如,所有高度大約為1.6m的55歲女性將被映射到網格同一區域中的節點。考慮到所有變量,身材矮小的人將被映射到其他地方。在身材上,高個的男性比小個的胖男性更接近高個頭的女性,因為他們“相似”得多。
SOM熱圖
典型的SOM可視化是“熱圖”。熱圖顯示了變量在SOM中的分布。理想情況下,相似年齡的人應該聚集在同一地區。
下圖使用兩個熱圖說明平均教育水平和失業率之間的關系。
SOM算法
從樣本數據集生成SOM的算法可總結如下:
- 選擇地圖的大小和類型。形狀可以是六邊形或正方形,具體取決於所需節點的形狀。通常,最好使用六邊形網格,因為每個節點都具有6個近鄰 。
- 隨機初始化所有節點權重向量。
- 從訓練數據中選擇一個隨機數據點,並將其呈現給SOM。
- 在地圖上找到“最佳匹配單位”(BMU)–最相似的節點。使用歐幾里德距離公式計算相似度。
- 確定BMU“鄰居”內的節點。
–鄰域的大小隨每次迭代而減小。 - 所選數據點調整BMU鄰域中節點的權重。
–學習率隨着每次迭代而降低。
–調整幅度與節點與BMU的接近程度成正比。 - 重復步驟2-5,進行N次迭代/收斂。
R中的SOM
訓練
R可以創建SOM和可視化。
-
# 在R中創建自組織映射
-
-
# 創建訓練數據集(行是樣本,列是變量
-
-
-
# 在這里,我選擇“數據”中可用的變量子集
-
-
-
data_train <- data[, c(3,4,5,8)]
-
-
#將帶有訓練數據的數據框更改為矩陣
-
-
#同時對所有變量進行標准化
-
-
#SOM訓練過程。
-
-
data_train_matrix <- as.matrix(scale(data_train))
-
-
#創建SOM網格
-
-
#在訓練SOM之前先訓練網格
-
-
-
grid(xdim = 20, ydim=20, topo="hexagonal")
-
-
#最后,訓練SOM,迭代次數選項,
-
-
#學習率
-
-
model <- som(data_train_matrix)
可視化
可視化可以檢察生成SOM的質量,並探索數據集中變量之間的關系。
- 訓練過程:
隨着SOM訓練迭代的進行,從每個節點的權重到該節點表示的樣本的距離將減小。理想情況下,該距離應達到最小。此圖選項顯示了隨着時間的進度。如果曲線不斷減小,則需要更多的迭代。-
#SOM的訓練進度
-
-
plot(model, type="changes")
-
- 節點計數
我們可以可視化映射到地圖上每個節點的樣本數。此度量可以用作圖質量的度量-理想情況下,樣本分布相對均勻。選擇圖大小時,每個節點至少要有5-10個樣本。-
#節點數
-
-
plot(model, type="count")
-
- 鄰居距離
通常稱為“ U矩陣”,此可視化表示每個節點與其鄰居之間的距離。通常使用灰度查看,鄰居距離低的區域表示相似的節點組。距離較大的區域表示節點相異得多。U矩陣可用於識別SOM映射內的類別。-
# U-matrix 可視化
-
-
- 代碼/權重向量
節點權重向量由用於生成SOM的原始變量值。每個節點的權重向量代表/相似於映射到該節點的樣本。通過可視化整個地圖上的權重向量,我們可以看到樣本和變量分布中的模型。權重向量的默認可視化是一個“扇形圖”,其中為每個節點顯示了權重向量中每個變量的大小的各個扇形表示。-
# 權重矢量視圖
-
-
- 熱圖
熱圖是也許是自組織圖中最重要的可能的可視化。通常,SOM過程創建多個熱圖,然后比較這些熱圖以識別圖上有趣的區域。
在這種情況下,我們將SOM的平均教育水平可視化。-
# 熱圖創建
-
應該注意的是,該默認可視化繪制了感興趣變量的標准化版本。
-
# 未標准化的熱圖
-
-
-
-
#定義要繪制的變量
-
-
-
-
aggregate(as.numeric(data_train, by=list(som_model$unit.classi FUN=mean)
值得注意的是,上面的熱圖顯示了失業率與教育水平之間的反比關系。並排顯示的其他熱圖可用於構建不同區域及其特征的圖片。
SOM網格中具有空節點的熱圖
在某些情況下,您的SOM訓練可能會導致SOM圖中的節點為空。通過幾行,我們可以找到som_model $ unit.classif中缺少的節點,並將其替換為NA值–此步驟將防止空節點扭曲您的熱圖。-
# 當SOM中有空節點時繪制未標准化的變量
-
-
-
-
var_unscaled <- aggregate(as.numeric(data_train_raw), by=list(som_model$unit.classif), FUN=mean)
-
-
# 為未分配的節點添加NA值
-
-
-
-
missingNodes <- which(!(seq(1,nrow(som_model$codes) %in% varunscaled$Node))
-
-
# 將它們添加到未標准化的數據框
-
-
-
-
var_unscaled <- rbind(var_unscaled, data.frame(Node=missingNodes, Value=NA))
-
-
# 結果數據框
-
-
-
var_unscaled
-
-
# 現在僅使用正確的“值”創建熱圖。
-
-
-
-
plot(som_model, type =d)
-
自組織圖的聚類和分割
可以在SOM節點上執行聚類,以發現具有相似度量的樣本組。可以使用kmeans算法並檢查“類內平方和之內”圖中的“肘點”來確定合適的聚類數估計。
-
# 查看WCSS的kmeans
-
-
-
for (i in 2:15) {
-
-
wss[i] <- sum(kmeans(mydata, centers=i)$withinss)
-
-
}
-
-
-
# 可視化聚類結果
-
-
-
-
##使用分層聚類對向量進行聚類
-
cutree(hclust(dist(som_model$codes)), 6)
-
-
# 繪制這些結果:
-
-
-
-
plot(som_model, t"mappinol =ty_pal
理想情況下,發現的類別在圖表面上是連續的。為了獲得連續的聚類,可以使用僅在SOM網格上僅將相似AND的節點組合在一起的層次聚類算法。
將聚類映射回原始樣本
當按照上面的代碼示例應用聚類算法時,會將聚類分配給 SOM映射上的每個 節點,而不是 數據集中的原始 樣本。
-
# 為每個原始數據樣本獲取具有聚類值的向量
-
-
som_clust[som_modl$unit.clasf]
-
-
# 為每個原始數據樣本獲取具有聚類值的向量
-
-
data$cluster <- cluster_assignment
使用每個聚類中訓練變量的統計信息和分布來構建聚類特征的有意義的圖片-這既是藝術又是科學,聚類和可視化過程通常是一個迭代過程。
結論
自組織映射(SOM)是數據科學中的一個強大工具。優勢包括:
- 發現客戶細分資料的直觀方法。
- 相對簡單的算法,易於向非數據科學家解釋結果
- 可以將新的數據點映射到經過訓練的模型以進行預測。
缺點包括:
- 由於訓練數據集是迭代的,因此對於非常大的數據集缺乏並行化功能
- 很難在二維平面上表示很多變量
- SOM訓練需要清理后的,數值的數據,這些數據很難獲得。
最受歡迎的見解
3.R語言對用電負荷時間序列數據進行K-medoids聚類建模和GAM回歸
5.Python Monte Carlo K-Means聚類實戰