R語言做K均值聚類的一個簡單小例子

2021-03-02 小明的數據分析筆記本
參考連結

https://www.guru99.com/r-k-means-clustering.html

https://datascienceplus.com/k-means-clustering-in-r/

https://www.datanovia.com/en/lessons/k-means-clustering-in-r-algorith-and-practical-examples/

k均值聚類是一種比較常用的聚類方法,R語言裡做k均值聚類比較常用的函數是kmeans(),需要輸入3個參數,第一個是聚類用到的數據,第二個是你想將數據聚成幾類k,第三個參數是nstarthttps://www.datanovia.com/en/lessons/k-means-clustering-in-r-algorith-and-practical-examples/

這篇連結裡提到

默認的nstart是1,推薦使用較大的值,以獲得一個穩定的結果。比如可以使用25或者50。

那如果想使用k均值聚類的話,就可以分成兩種情況,

第一種是知道我自己想聚成幾類,比如鳶尾花的數據集,明確想聚為3類。這時候直接指定k下面用鳶尾花數據集做k均值聚類
df<-iris[,1:4]
iris.kmeans<-kmeans(df,centers=3,nstart = 25)
names(iris.kmeans)

iris.kmeans結果裡存儲9個結果,可能會用到的是iris.kmeans$cluster存儲的是每個樣本被歸為哪一類iris.kmeans$size存儲的是每一個大類有多少個樣本

使用散點圖展示結果,藉助factoextra包中的fviz_cluster()函數

library(factoextra)
fviz_cluster(object=iris.kmeans,data=iris[,1:4],
             ellipse.type = "euclid",star.plot=T,repel=T,
             geom = ("point"),palette='jco',main="",
             ggtheme=theme_minimal())+
  theme(axis.title = element_blank())

作圖代碼參考 https://degreesofbelief.roryquinn.com/clustering-analysis-in-r-part-2

第二種情況是我不知道想要聚成幾類,這個時候就可以將k值設置為一定的範圍,然後根據聚類結果裡的一些參數來篩選最優的結果比如這篇文章 https://www.guru99.com/r-k-means-clustering.html他提到可以使用 cluster$tot.withinss這個參數,選擇出現平滑變化的那個點,他起的名字是 elbow method,英文解釋是

This method uses within-group homogeneity or within-group heterogeneity to evaluate the variability. In other words, you are interested in the percentage of the variance explained by each cluster. You can expect the variability to increase with the number of clusters, alternatively, heterogeneity decreases. Our challenge is to find the k that is beyond the diminishing returns. Adding a new cluster does not improve the variability in the data because very few information is left to explain.

這個英文解釋我也沒有看明白。實際操作的代碼是

下面用USArrests這個數據集是美國50個州1973年每10萬人中因某種罪被捕的人數,共4個變量

df<-USArrests
kmean_withinss <- function(k) {
  cluster <- kmeans(df, k,nstart = 25)
  return (cluster$tot.withinss)
}
wss<-sapply(2:20, kmean_withinss)
wss
elbow<-data.frame(A=2:20,B=wss)
library(ggplot2)
ggplot(elbow,aes(x=A,y=B))+
  geom_point()+
  geom_line()+
  scale_x_continuous(breaks = seq(1, 20, by = 1))+theme_bw()

image.png

從上圖看,7到8好像是變得比較平滑的,那我們先選7看看

usa.kmeans<-kmeans(df,centers=7,nstart = 25)
fviz_cluster(object=usa.kmeans,df,
             ellipse.type = "euclid",star.plot=T,repel=T,
             geom = c("point","text"),palette='jco',main="",
             ggtheme=theme_minimal())+
  theme(axis.title = element_blank())

image.png

從圖上看劃分成7類有點多了

https://www.datanovia.com/en/lessons/k-means-clustering-in-r-algorith-and-practical-examples/

這個連結裡提到factoextra這個包裡有一個函數fviz_nbclust()直接可以選擇最優的k

fviz_nbclust(df, kmeans, method = "wss")

image.png

從圖上看4到5變得平滑了,選擇4試一下

usa.kmeans<-kmeans(df,centers=4,nstart = 25)
fviz_cluster(object=usa.kmeans,df,
             ellipse.type = "euclid",star.plot=T,repel=T,
             geom = c("point","text"),palette='jco',main="",
             ggtheme=theme_minimal())+
  theme(axis.title = element_blank())

image.png

從圖上看有部分重疊的地方,還有一種辦法就是把數據標準化一下

df1<-scale(df)
usa.kmeans<-kmeans(df1,centers=4,nstart = 25)
fviz_cluster(object=usa.kmeans,df,
             ellipse.type = "euclid",star.plot=T,repel=T,
             geom = c("point","text"),palette='jco',main="",
             ggtheme=theme_minimal())+
  theme(axis.title = element_blank())

image.png

標準化以後的效果看起來好了很多

好了,今天就到這裡了。

歡迎大家關注我的公眾號

小明的數據分析筆記本

相關焦點

  • 基於R語言的Kmeans聚類算法
    下面我們通過一個具體的例子來理解這個算法,假設我們首先拿到了這樣一個數據,要把它分成兩類:         1.下圖中,人眼可以很快的分辨出來,可以在兩個聚類間找到一條合理的分界線。<- dt[loc,] # 獲取簇類所有的點 centroids[i,] <- apply(pointsIncluster,2,mean) ##對數據集的列就均值 } step=step+1 ##觀察迭代次數 print(step) } print("Congratulations,cluster complete!")
  • R語言實現聚類kmeans
    PAM(Partitioning Around Medoids),又叫k-medoids,它可以將數據分組為k個組,k為數量是要事前定義的。PAM與k-means一樣,找到距離中心點最小點組成同一類。PAM對噪聲和異常值更具魯棒性,該算法的目標是最小化對象與其最接近的所選對象的平均差異。PAM可以支持混合的數據類型,不僅限於連續變量。
  • 圖解機器學習-聚類(k均值)
    舉個例子,我們通過A班級學生的身高和體重數據,這裡樣本假定不知道是男生還是女生,也就是無監督學習中男女生標記是未知的,這樣就可以通過聚類任務得到哪些樣本最可能是男生,哪些樣本最可能是女生。聚類的相似性度量歐氏距離(Euclidean Distance)是聚類相似性計算距離的一種方法,來自幾何數學中計算兩點間的距離公式。
  • 模糊c均值聚類(FCM)及其在R中實現
    先前所簡介的層次聚類、劃分聚類等,所產生的聚類簇都是非重疊的實體,即對於每個對象而言只有一個確定的分類,這種聚類方法也成硬聚類(hard-clustering)。模糊聚類產生的聚類簇的界限不明顯,一個對象具有屬於多個類的可能性,在描述對象分類時更加謹慎,更貼合自然界的實際情況。在計算上,創建模糊邊界也比在一個類中為一個對象確定邊界容易得多。模糊聚類類似於原子軌道和電子行為:電子不處於固定的位置,而是有可能出現在特定軌道殼中,如果將軌道殼視為「聚類簇」,將電子視為「對象」,那麼這種可能性就是將對象分配到特定簇的概率。
  • 有了K均值聚類,為什麼還需要DBSCAN聚類算法?
    使用K均值的另一個困難是需要指定聚類的數量(「k」)以便使用。很多時候不會預先知道什麼是合理的k值。DBSCAN的優點在於,不必指定使用它的聚類數量。需要的只是一個計算值之間距離的函數,以及一些將某些距離界定為「接近」的指令。在各種不同的分布中,DBSCAN也比K均值產生更合理的結果。
  • R語言之實現K-mean聚類算法
    聚類算法作為無監督的學習方法,在不給出Y的情況下對所有的樣本進行聚類。以動態聚類為基礎的K均值聚類方法是其中最簡單而又有深度的一種方法。
  • 算法雜貨鋪——k均值聚類(K-means)
    本文首先介紹聚類的基礎——距離與相異度,然後介紹一種常見的聚類算法 ——k均值和k中心點聚類,最後會舉一個實例:應用聚類方法試圖解決一個在體育界大家頗具爭議的問題——中國男足近幾年在亞洲到底處於幾流水平。4.2、相異度計算      在正式討論聚類前,我們要先弄清楚一個問題:如何定量計算兩個可比較元素間的相異度。
  • k均值聚類算法(k-means clustering algorithm)
    )減弱類表示唯一公理的要求4.奧卡姆剃刀準則: 選擇簡單的類表示五、K-means算法k均值聚類算法(k-means clusteringalgorithm)是一種迭代求解的聚類分析算法,其步驟是,預將數據分為K組,則隨機選取K個對象作為初始的聚類中心,然後計算每個對象與各個種子聚類中心之間的距離
  • 人工智慧算法|K均值聚類算法Python實現
    以下是K均值法的python代碼實現。程序使用的工具包括numpy和matplotlib,其中numpy是一個用於處理多維數組的庫,而Matplotlib 則用於繪製二維圖形。與centroidList中k個質心的歐式距離,找出距離最小的,    # 並將item加入相應的簇類中    clusterDict = dict() # 用dict來保存簇類結果    for item in dataSet:        vec1 = numpy.array(item)  #轉換成array形式        flag = 0  # 簇分類標記
  • 不足 20 行 Python 代碼,高效實現 k-means 均值聚類算法!
    k-means均值算法雖然是聚類算法中比較簡單的一種,卻包含了豐富的思想內容,非常適合作為初學者的入門習題。關於 k-means 均值聚類算法的原理介紹、實現代碼,網上有很多,但運行效率似乎都有點問題。今天稍微有點空閒,寫了一個不足20行的 k-means 均值聚類算法,1萬個樣本平均耗時20毫秒(10次均值)。同樣的數據樣本,網上流行的算法平均耗時3000毫秒(10次均值)。
  • k均值聚類算法原理和(TensorFlow)實現(無師自通)
    無監督學習非常有用,因為現存的大多數數據是沒有標籤的,這種方法可以用於諸如模式識別、特徵提取、數據聚類和降維等任務。k 均值聚類是一種無監督學習方法。還記得哈利波特故事中的分院帽嗎?那就是聚類,將新學生(無標籤)分成四類:格蘭芬多、拉文克拉、赫奇帕奇和斯特萊林。
  • 【雷火UX數據挖掘】k-means聚類算法家族與R語言示例
    k-means是常見的一種聚類算法,自1967年首次發表後被廣泛應用在多個領域。
  • 機器學習算法實踐 K均值聚類的實用技巧
    在本文中,他詳細介紹了一種稱為 K-Means Clustering(k均值聚類)的算法,其中包括如何衡量算法效果,以及如何確定你需要生成的數據段集數量。雷鋒網編譯整理,更多AI開發技術文章,關注AI研習社(微信號:okweiwu)。Bilal Mahmood:我們最常做的分析之一,便是在數據中提取模式。 比方說,某公司的客戶可被劃分入哪些細分市場?
  • K-means 算法實現二維數據聚類
    聚類分析是一種無監督的觀察式學習方法,在聚類前可以不知道類別甚至不用給定類別數量。目前聚類廣泛應用於統計學、生物學、資料庫技術和市場營銷等領域。聚類算法有很多種,如K-means(K均值聚類)、K中心聚類、密度聚類、譜系聚類、最大期望聚類等。這裡我們重點介紹K-means聚類算法,該算法的基本思想是以空間中K個點為中心進行聚類,對最靠近它們的對象歸類。
  • 機器學習算法實踐之K均值聚類的實用技巧
    在本文中,他詳細介紹了一種稱為 K-Means Clustering(k均值聚類)的算法,其中包括如何衡量算法效果,以及如何確定你需要生成的數據段集數量。雷鋒網編譯整理,更多AI開發技術文章,關注AI研習社(微信號:okweiwu)。Bilal Mahmood:我們最常做的分析之一,便是在數據中提取模式。 比方說,某公司的客戶可被劃分入哪些細分市場?
  • 聚類(三):KNN算法(R語言)
    k最臨近(KNN)算法是最簡單的分類算法之一,屬於有監督的機器學習算法。
  • K-means算法通俗原理及Python與R語言的分別實現
    K均值法先指定聚類數,目標是使每個數據到數據點所屬聚類中心的總距離變異平方和最小,規定聚類中心時則是以該類數據點的平均值作為聚類中心。對於有N個數據的數據集,我們想把它們聚成K類,開始需要指定K個聚類中心,假設第i類有ni個樣本數據,計算每個數據點分別到聚類中心的距離平方和,距離這裡直接用的歐式距離,還有什麼海明距離、街道距離、餘弦相似度什麼的其實都可以,這裡聚類的話,歐式距離就好。
  • 聚類算法之Kmeans
    沒事嘮兩句在傳統機器學習領域裡,主要涉及的任務有回歸、分類、聚類、推薦等。回歸由於其精確度問題,並沒有被廣泛大量地商業化應用,多是用於一些分析工作,或是作為一個簡單的參考數據以及輔助數據而存在。故而這裡我們需要做一個去用戶標準化操作,故而選擇使用皮爾遜相關係數會比較合適。再舉個例子,比如我們有若干特徵變量,我們想要判斷一下不同特徵變量之間是否具有相關性較強的特徵變量,這個時候,因為不同的特徵變量都有自己的一個隱藏標準,在各自的標準下,其數值自然也就不同,故而此時,我們要想判斷變量之間是否相關,則需要做一個變量的去中心化操作,從而消去特徵變量自身的隱藏標準,也就更加準確。
  • R語言譜聚類、K-MEANS聚類分析非線性環狀數據比較
    我假設,你過去的知識是從討論和解決線性問題開始的,這是一個自然的起點。對於非線性問題的解決,往往涉及一個初始處理步驟。這個初始步驟的目的是將問題轉化為同樣具有線性特徵的問題。一個教科書式的例子是邏輯回歸,用於獲得兩類之間的最佳線性邊界。在一個標準的神經網絡模型中,你會發現邏輯回歸(或多類輸出的回歸)應用於轉換後的數據。
  • 手把手教你如何利用K均值聚類實現異常值的識別!
    本期將從K均值聚類的角度,幫助大家理解該方法在異常值識別過程中的優勢!(本文涉及的代碼可以在文末連結中下載)首先,藉助於Python隨機生成兩組二維數據,用於後文的實戰。為了能夠更加直觀地洞察該數據,我們將其繪製成散點圖。