拓端tecdat|R語言使用自組織映射神經(jīng)網(wǎng)絡(luò)(SOM)進(jìn)行客戶細(xì)分
原文鏈接:http://tecdat.cn/?p=18726?
自組織映射神經(jīng)網(wǎng)絡(luò)(SOM)是一種無監(jiān)督的數(shù)據(jù)可視化技術(shù),可用于可視化低維(通常為2維)表示形式的高維數(shù)據(jù)集。在本文中,我們研究了如何使用R創(chuàng)建用于客戶細(xì)分的SOM。
SOM由1982年在芬蘭的Teuvo Kohonen首次描述,而Kohonen在該領(lǐng)域的工作使他成為世界上被引用最多的芬蘭科學(xué)家。通常,SOM的可視化是六邊形節(jié)點(diǎn)的彩色2D圖。
SOM
SOM可視化由多個“節(jié)點(diǎn)”組成。每個節(jié)點(diǎn)向量具有:
在SOM網(wǎng)格上的位置
與輸入空間維度相同的權(quán)重向量。(例如,如果您的輸入數(shù)據(jù)代表人,則可能具有變量“年齡”,“性別”,“身高”和“體重”,網(wǎng)格上的每個節(jié)點(diǎn)也將具有這些變量的值)
輸入數(shù)據(jù)中的關(guān)聯(lián)樣本。輸入空間中的每個樣本都“映射”或“鏈接”到網(wǎng)格上的節(jié)點(diǎn)。一個節(jié)點(diǎn)可以代表多個輸入樣本。
SOM的關(guān)鍵特征是原始輸入數(shù)據(jù)的拓?fù)涮卣鞅A粼趫D上。這意味著將相似的輸入樣本(其中相似性是根據(jù)輸入變量(年齡,性別,身高,體重)定義的)一起放置在SOM網(wǎng)格上。例如,所有高度大約為1.6m的55歲女性將被映射到網(wǎng)格同一區(qū)域中的節(jié)點(diǎn)??紤]到所有變量,身材矮小的人將被映射到其他地方。在身材上,高個的男性比小個的胖男性更接近高個頭的女性,因?yàn)樗麄儭跋嗨啤钡枚唷?/p>
SOM熱圖
典型的SOM可視化是“熱圖”。熱圖顯示了變量在SOM中的分布。理想情況下,相似年齡的人應(yīng)該聚集在同一地區(qū)。
下圖使用兩個熱圖說明平均教育水平和失業(yè)率之間的關(guān)系。

SOM算法
從樣本數(shù)據(jù)集生成SOM的算法可總結(jié)如下:
選擇地圖的大小和類型。形狀可以是六邊形或正方形,具體取決于所需節(jié)點(diǎn)的形狀。通常,最好使用六邊形網(wǎng)格,因?yàn)槊總€節(jié)點(diǎn)都具有6個近鄰 。
隨機(jī)初始化所有節(jié)點(diǎn)權(quán)重向量。
從訓(xùn)練數(shù)據(jù)中選擇一個隨機(jī)數(shù)據(jù)點(diǎn),并將其呈現(xiàn)給SOM。
在地圖上找到“最佳匹配單位”(BMU)–最相似的節(jié)點(diǎn)。使用歐幾里德距離公式計(jì)算相似度。
確定BMU“鄰居”內(nèi)的節(jié)點(diǎn)。
–鄰域的大小隨每次迭代而減小。所選數(shù)據(jù)點(diǎn)調(diào)整BMU鄰域中節(jié)點(diǎn)的權(quán)重。
–學(xué)習(xí)率隨著每次迭代而降低。
–調(diào)整幅度與節(jié)點(diǎn)與BMU的接近程度成正比。重復(fù)步驟2-5,進(jìn)行N次迭代/收斂。
R中的SOM
訓(xùn)練
R可以創(chuàng)建SOM和可視化。
# 在R中創(chuàng)建自組織映射
# 創(chuàng)建訓(xùn)練數(shù)據(jù)集(行是樣本,列是變量
# 在這里,我選擇“數(shù)據(jù)”中可用的變量子集
data_train <- data[, c(3,4,5,8)]
#將帶有訓(xùn)練數(shù)據(jù)的數(shù)據(jù)框更改為矩陣
#同時對所有變量進(jìn)行標(biāo)準(zhǔn)化
#SOM訓(xùn)練過程。
data_train_matrix <- as.matrix(scale(data_train))
#創(chuàng)建SOM網(wǎng)格
#在訓(xùn)練SOM之前先訓(xùn)練網(wǎng)格
grid(xdim = 20, ydim=20, topo="hexagonal")
#最后,訓(xùn)練SOM,迭代次數(shù)選項(xiàng),
#學(xué)習(xí)率
model <- som(data_train_matrix)
可視化
可視化可以檢察生成SOM的質(zhì)量,并探索數(shù)據(jù)集中變量之間的關(guān)系。
訓(xùn)練過程:
隨著SOM訓(xùn)練迭代的進(jìn)行,從每個節(jié)點(diǎn)的權(quán)重到該節(jié)點(diǎn)表示的樣本的距離將減小。理想情況下,該距離應(yīng)達(dá)到最小。此圖選項(xiàng)顯示了隨著時間的進(jìn)度。如果曲線不斷減小,則需要更多的迭代。

#SOM的訓(xùn)練進(jìn)度
plot(model, type="changes")
節(jié)點(diǎn)計(jì)數(shù)
我們可以可視化映射到地圖上每個節(jié)點(diǎn)的樣本數(shù)。此度量可以用作圖質(zhì)量的度量-理想情況下,樣本分布相對均勻。選擇圖大小時,每個節(jié)點(diǎn)至少要有5-10個樣本。?

#節(jié)點(diǎn)數(shù)
plot(model, type="count")
鄰居距離
通常稱為“ U矩陣”,此可視化表示每個節(jié)點(diǎn)與其鄰居之間的距離。通常使用灰度查看,鄰居距離低的區(qū)域表示相似的節(jié)點(diǎn)組。距離較大的區(qū)域表示節(jié)點(diǎn)相異得多。U矩陣可用于識別SOM映射內(nèi)的類別。

# U-matrix 可視化
代碼/權(quán)重向量
節(jié)點(diǎn)權(quán)重向量由用于生成SOM的原始變量值。每個節(jié)點(diǎn)的權(quán)重向量代表/相似于映射到該節(jié)點(diǎn)的樣本。通過可視化整個地圖上的權(quán)重向量,我們可以看到樣本和變量分布中的模型。權(quán)重向量的默認(rèn)可視化是一個“扇形圖”,其中為每個節(jié)點(diǎn)顯示了權(quán)重向量中每個變量的大小的各個扇形表示。

# 權(quán)重矢量視圖
熱圖
熱圖是也許是自組織圖中最重要的可能的可視化。通常,SOM過程創(chuàng)建多個熱圖,然后比較這些熱圖以識別圖上有趣的區(qū)域。
在這種情況下,我們將SOM的平均教育水平可視化。

應(yīng)該注意的是,該默認(rèn)可視化繪制了感興趣變量的標(biāo)準(zhǔn)化版本。

值得注意的是,上面的熱圖顯示了失業(yè)率與教育水平之間的反比關(guān)系。并排顯示的其他熱圖可用于構(gòu)建不同區(qū)域及其特征的圖片。

SOM網(wǎng)格中具有空節(jié)點(diǎn)的熱圖
在某些情況下,您的SOM訓(xùn)練可能會導(dǎo)致SOM圖中的節(jié)點(diǎn)為空。通過幾行,我們可以找到som_model $ unit.classif中缺少的節(jié)點(diǎn),并將其替換為NA值–此步驟將防止空節(jié)點(diǎn)扭曲您的熱圖。# 當(dāng)SOM中有空節(jié)點(diǎn)時繪制未標(biāo)準(zhǔn)化的變量
var_unscaled <- aggregate(as.numeric(data_train_raw), by=list(som_model$unit.classif), FUN=mean)
# 為未分配的節(jié)點(diǎn)添加NA值
missingNodes <- which(!(seq(1,nrow(som_model$codes) %in% varunscaled$Node))
# 將它們添加到未標(biāo)準(zhǔn)化的數(shù)據(jù)框
var_unscaled <- rbind(var_unscaled, data.frame(Node=missingNodes, Value=NA))
# 結(jié)果數(shù)據(jù)框
var_unscaled
# 現(xiàn)在僅使用正確的“值”創(chuàng)建熱圖。
plot(som_model, type =d)
# 未標(biāo)準(zhǔn)化的熱圖
#定義要繪制的變量
aggregate(as.numeric(data_train, by=list(som_model$unit.classi FUN=mean)
# 熱圖創(chuàng)建
自組織圖的聚類和分割
可以在SOM節(jié)點(diǎn)上執(zhí)行聚類,以發(fā)現(xiàn)具有相似度量的樣本組??梢允褂胟means算法并檢查“類內(nèi)平方和之內(nèi)”圖中的“肘點(diǎn)”來確定合適的聚類數(shù)估計(jì)。
# 查看WCSS的kmeans
for (i in 2:15) {
wss[i] <- sum(kmeans(mydata, centers=i)$withinss)
}
# 可視化聚類結(jié)果
##使用分層聚類對向量進(jìn)行聚類
cutree(hclust(dist(som_model$codes)), 6)
# 繪制這些結(jié)果:
plot(som_model, t"mappinol =ty_pal

理想情況下,發(fā)現(xiàn)的類別在圖表面上是連續(xù)的。為了獲得連續(xù)的聚類,可以使用僅在SOM網(wǎng)格上僅將相似AND的節(jié)點(diǎn)組合在一起的層次聚類算法。
將聚類映射回原始樣本
當(dāng)按照上面的代碼示例應(yīng)用聚類算法時,會將聚類分配給?SOM映射上的每個?節(jié)點(diǎn),而不是?數(shù)據(jù)集中的原始?樣本。
# 為每個原始數(shù)據(jù)樣本獲取具有聚類值的向量
som_clust[som_modl$unit.clasf]
# 為每個原始數(shù)據(jù)樣本獲取具有聚類值的向量
data$cluster <- cluster_assignment
使用每個聚類中訓(xùn)練變量的統(tǒng)計(jì)信息和分布來構(gòu)建聚類特征的有意義的圖片-這既是藝術(shù)又是科學(xué),聚類和可視化過程通常是一個迭代過程。
結(jié)論
自組織映射(SOM)是數(shù)據(jù)科學(xué)中的一個強(qiáng)大工具。優(yōu)勢包括:
發(fā)現(xiàn)客戶細(xì)分資料的直觀方法。
相對簡單的算法,易于向非數(shù)據(jù)科學(xué)家解釋結(jié)果
可以將新的數(shù)據(jù)點(diǎn)映射到經(jīng)過訓(xùn)練的模型以進(jìn)行預(yù)測。
缺點(diǎn)包括:
由于訓(xùn)練數(shù)據(jù)集是迭代的,因此對于非常大的數(shù)據(jù)集缺乏并行化功能
很難在二維平面上表示很多變量
SOM訓(xùn)練需要清理后的,數(shù)值的數(shù)據(jù),這些數(shù)據(jù)很難獲得。

最受歡迎的見解
1.R語言k-Shape算法股票價格時間序列聚類
2.R語言中不同類型的聚類方法比較
3.R語言對用電負(fù)荷時間序列數(shù)據(jù)進(jìn)行K-medoids聚類建模和GAM回歸
4.r語言鳶尾花iris數(shù)據(jù)集的層次聚類
5.Python Monte Carlo K-Means聚類實(shí)戰(zhàn)
6.用R進(jìn)行網(wǎng)站評論文本挖掘聚類
7.用于NLP的Python:使用Keras的多標(biāo)簽文本LSTM神經(jīng)網(wǎng)絡(luò)
8.R語言對MNIST數(shù)據(jù)集分析 探索手寫數(shù)字分類數(shù)據(jù)
9.R語言基于Keras的小數(shù)據(jù)集深度學(xué)習(xí)圖像分類