K 表示 R 中的聚類:帶示例的分步教程
已發表: 2020-02-17作為一名數據科學家,您將進行大量聚類。 有許多類型的聚類算法可用,您應該精通所有這些算法。 在本文中,我們將討論一種流行的聚類算法 K-means,並了解它是如何在 R 中使用的。
您將了解 R 中 K-means 聚類背後的基本理論以及如何使用它。 我們還在本文後面討論了一個實際示例。 請務必將此文章添加為書籤以供將來參考。 閱讀有關數據挖掘中聚類分析的更多信息。
在我們開始討論 R 中的 K 表示聚類之前,我們應該看一下現有的聚類算法的類型,以便您更好地了解該算法如何處理它們。
閱讀:數據科學領域的頂級 R 庫
目錄
聚類類型
當您將多個對象分組時,將彼此最相似的對象放在一個緊密的簇中,這稱為聚類。 對象之間的距離可能與它們的相似性有關。 相似性顯示了數據科學中兩個不同對象之間關係的強度。 聚類是一種流行的數據挖掘技術。 聚類在許多行業和領域都有應用,包括圖像分析、機器學習、數據壓縮、模式識別等。
聚類有兩種類型——硬的和軟的。 讓我們簡要討論一下它們。
- 在硬集群中,一個數據點將完全屬於一個集群,或者根本不屬於它。 中間沒有。
- 在軟集群中,由於某種可能性或概率,一個數據對象可能一次與多個集群相關。
從世界頂級大學在線學習數據科學課程。 獲得行政 PG 課程、高級證書課程或碩士課程,以加快您的職業生涯。
聚類算法的類型
就像有不同類型的集群一樣,也有不同類型的集群算法。 您可以根據它們的集群模型來區分算法。 這意味著您可以根據它們如何形成集群來區分它們。 如果我們開始談論各種聚類算法,那麼本指南將變得太長且遠離重點。 因此,我們將只討論幾種突出類型的聚類算法。 有基於連通性、基於質心、基於密度和基於分佈的聚類算法。
K-Means 的基本概念
K-means 的基本概念非常簡單。 K-means 與定義集群有關,以便集群內的總變化盡可能小。 有多種 k-means 算法。 最常見的 k-means 算法是 Hartigan-Wong 算法,該算法指出集群內的總變化等於質心與其項目之間的歐幾里得距離平方距離之和:
W( C k )= x i C k ( x i – k ) 2
這裡x i是指屬於集群C k的數據點, k是指存在於集群 Ck 中的數據點的平均值。
x i的值應使x i和k之間的平方距離之和最小。
什麼是 K-means 算法?
要使用該算法,我們首先必須說明將出現在結果中的簇數 K。 該算法首先隨機選擇 K 個對像作為初始聚類中心。 我們稱這些對象為簇質心或均值。 然後我們將剩餘的對象分配給它們最近的質心。 聚類質心和對象之間的歐幾里得距離決定了它們的距離。
在我們將對象分配給它們各自的質心之後,算法會計算聚類的平均值。 在重新計算之後,我們重新檢查觀察結果,看看它們是否可能更接近不同的集群。 然後,我們相應地將對象重新分配給質心。 我們不斷重複這些步驟,直到分配集群停止。 這意味著當迭代中形成的集群與其前一次迭代中的集群相同時,我們停止重複迭代。
使用 K-Means 聚類(示例)
現在您已經知道 R 中的 K-means 算法是什麼以及它是如何工作的,讓我們討論一個示例以便更好地說明。 在此示例中,我們將使用批發客戶數據庫對組織的客戶進行聚類。 此問題的數據可在 Berkley UCI 的機器學習存儲庫中獲得。 你可以在這裡查看。
首先,我們將讀取數據。 然後得到它的摘要。 閱讀數據並查看其摘要後,您會發現不同類別的頂級消費者之間存在一些明顯差異。 您會發現一些異常值,這些異常值無法通過標準化(或縮放)輕鬆刪除。 有了這些數據,企業就希望了解他們的中端客戶大部分時間都在購買什麼。 那是因為一家公司會對他們的頂級客戶購買什麼有一個不錯的了解。
打造中層客戶集群,首先要從各個品類中剔除頂層客戶。 所以我們將刪除前 5 個並創建一個新集合。 我們將這樣做:
top.n.custs <- function (data,cols,n=5) { #需要一些數據框和前N個刪除
idx.to.remove <-integer(0) #初始化一個向量來保存被移除的客戶
for (c in cols){ # 對於我們傳遞給此函數的數據中的每一列
col.order <-order(data[,c],decreasing=T) #按降序對列“c”進行排序(頂部較大)
#Order 返回排序後的索引(例如第 15、3、7、1、...行),而不是排序後的實際值。
idx <-head(col.order, n) #取排好序的列C的前n
idx.to.remove <-union(idx.to.remove,idx) #合併和去重需要移除的row id
}
return(idx.to.remove) #返回要移除的客戶的索引
}
top.custs <-top.n.custs(數據,cols=3:8,n=5)
length(top.custs) #需要移除多少個客戶?
data[top.custs,] #查看可用客戶
data.rm.top<-data[-c(top.custs),] #刪除需要的客戶

有了這個新文件,我們就可以開始進行聚類分析了。 要執行聚類分析,我們將使用以下代碼:
set.seed(76964057) #為可重複性設置種子
k <-kmeans(data.rm.top[,-c(1,2)],centers=5) #創建5個簇,去掉1和2列
k$centers #顯示集群中心
table(k$cluster) #給出每個簇中數據點的個數
在給定數據庫上運行此代碼後,您將獲得以下結果:
- 第一個集群將有高質量的洗滌劑,但新鮮食品的數量很少
- 第三個集群將有更多的新鮮產品
您需要使用 insidess 和 betweenss 來詳細解釋結果。 k$withinss 等於每個數據對像到集群中心的距離平方和。 範圍越低,結果越好。 如果您的數據中的內部度量值很高,則意味著存在許多異常值,您需要執行數據清理。 k$betweenss 是聚類不同中心之間距離平方的總和。 聚類中心之間的距離應盡可能高。
閱讀:R中6個更常用的數據結構
您應該借助反複試驗來獲得最準確的結果。 為此,您需要嘗試 K 的各種值。當結果圖未顯示集群內部的增量時,該點將是 K 的最合適值。您可以找到該值K 通過以下代碼:
rng<-2:20 #K 從 2 到 20
嘗試 <-100 #運行 K 均值算法 100 次
avg.totw.ss <-integer(length(rng)) #設置一個空向量來保存所有的點
for(v in rng){ # 對於範圍變量的每個值
v.totw.ss <-integer(tries) #設置一個空向量來保存100次嘗試
for(i in 1:tries){
k.temp <-kmeans(data.rm.top,centers=v) #運行kmeans
v.totw.ss[i] <-k.temp$tot.withinss#存儲總內部
}
avg.totw.ss[v-1] <-mean(v.totw.ss) #平均100個總內數
}
plot(rng,avg.totw.ss,type=”b”, main=”SS 內的各種 K 總數”,
ylab =“平方和內的平均總數”,
xlab="K 值")
而已。 現在,您可以使用從此代碼中獲得的圖表來獲得 K 的最佳值,並使用它來獲得所需的結果。 使用此示例來嘗試您對 R 中的 K-means 聚類的了解。以下是我們在示例中使用的所有代碼:
數據 <-read.csv(“批發客戶數據.csv”,header=T)
摘要(數據)
top.n.custs <- function (data,cols,n=5) { #需要一些數據框和前N個刪除
idx.to.remove <-integer(0) #初始化一個向量來保存被移除的客戶
for (c in cols){ # 對於我們傳遞給此函數的數據中的每一列
col.order <-order(data[,c],decreasing=T) #按降序對列“c”進行排序(頂部較大)
#Order 返回排序後的索引(例如第 15、3、7、1、...行),而不是排序後的實際值。
idx <-head(col.order, n) #取排好序的列C的前n
idx.to.remove <-union(idx.to.remove,idx) #合併和去重需要移除的row id
}
return(idx.to.remove) #返回要移除的客戶的索引
}
top.custs <-top.n.custs(數據,cols=3:8,n=5)
length(top.custs) #要刪除多少客戶?
data[top.custs,] #檢查客戶
data.rm.top <-data[-c(top.custs),] #移除客戶
set.seed(76964057) #為可重複性設置種子
k <-kmeans(data.rm.top[,-c(1,2)],centers=5) #創建5個簇,去掉1和2列
k$centers #顯示聚類中心
table(k$cluster) #給每個簇中數據點的個數
rng<-2:20 #K 從 2 到 20
Trys<-100 #運行 K 均值算法 100 次
avg.totw.ss<-integer(length(rng)) #設置一個空向量來保存所有的點
for(v in rng){ # 對於範圍變量的每個值
v.totw.ss<-integer(tries) #設置一個空向量來保存100次嘗試
for(i in 1:tries){
k.temp<-kmeans(data.rm.top,centers=v) #運行kmeans
v.totw.ss[i]<-k.temp$tot.withinss#存儲總內部
}
avg.totw.ss[v-1]<-mean(v.totw.ss) #平均100個內sss
}
plot(rng,avg.totw.ss,type=”b”, main=”SS 內的各種 K 總數”,
ylab =“平方和內的平均總數”,
xlab="K 值")
結論
我們希望您喜歡本指南。 我們試圖保持簡潔和全面。 如果您對 K-means 算法有任何疑問,請隨時向我們提問。 我們很樂意回答您的問題。
如果您想了解數據科學,請查看 IIIT-B 和 upGrad 的數據科學執行 PG 計劃,該計劃是為在職專業人士創建的,提供 10 多個案例研究和項目、實用的實踐研討會、與行業專家的指導、1與行業導師一對一,400 多個小時的學習和頂級公司的工作協助。
使用 K-means 有哪些缺點?
離群值可以拉出質心,或者離群值可能會被賦予自己的集群而不是被忽略。 由於 K-means 是隨機的,它不能確保找到全局最優的聚類解決方案。 實際上,異常值和噪聲數據可能會使算法高度敏感。 在分組之前,請考慮消除或刪除異常值。 在對具有可變大小和密度的數據進行分組時,K-means 有困難。 您必須泛化 K-means 來對此類數據進行聚類。 即使它們明顯屬於同一個簇,k-means 算法也不允許相距較遠的數據點共享同一個簇。
K-means中的肘部方法是什麼?
k-means 方法在很大程度上依賴於找到適當數量的集群。 肘部方法是一種廣泛使用的確定最佳 K 值的方法。 肘部技術在數據集上針對圖上的一系列 K 值執行 K 均值聚類,然後針對每個 K 值計算所有聚類的平均分數。失真分數,即到每個點的平方距離之和到其指定的中心,默認計算。 其他數據驅動模型,例如表徵數據集的主要組件的數量,可以利用相同的技術來確定參數的數量。
我們如何在 K-means 中找到異常值?
可以使用基於距離和基於集群的技術來發現 K-Means 聚類中的異常值。 在層次聚類的情況下,使用樹狀圖發現異常值。 該項目的目標是發現和消除異常值,以使聚類更加準確。 在基於 K-means 的異常值識別方法中,通過將數據分配到最近的聚類中心,將數據劃分為 K 個組。 然後我們可以計算每個項目與其聚類中心之間的距離或相異度,並選擇距離最大的異常值。 由於極值可能會很快影響平均值,因此 K-means 聚類方法對異常值很敏感。