K-means計算城市聚類
前陣子有朋友請教,如果有一份各城市的指標表,一共是20個城市 X 24個指標,包括城市GDP、人均GDP、人均存款等,應該如何分類?
如果不考慮原有的一二三線城市分布,而利用各個指標進行分類(正確說應該是聚類),我想到的就是K-means方法。K-means是非監督學習(unsupervised learning)中最簡單也是最常用的一種聚類演算法,它的計算過程非常直觀:
1、隨機取k個元素,作為k個簇的各自的中心。
2、分別計算剩下的元素到k個簇中心的相異度,將這些元素分別劃歸到相異度最低的簇。3、根據聚類結果,重新計算k個簇各自的中心,計算方法是取簇中所有元素各自維度的算術平均數。4、全部元素按照新的中心重新聚類。5、重複第4步,直到聚類結果不再變化。
按照以上的距離演算法,取值範圍大的屬性,例如gdp的數字差別,會產生更大的距離影響,這樣不利於反映真實的相異度。為了解決這個問題,一般要對屬性值按照比例進行規格化,(scale)映射到[0,1]區間。平衡各個屬性對距離的影響。
代碼如下:install.packages("corrplot")library(corrplot)install.packages("readr")library(readr)setwd("E:")city<-read_csv("city.csv")head(city)#設立一個空數據框,城市名跟原來的相同data<-as.data.frame(matrix(ID<-city$city))#重點是這裡:將表格2-25列進行循環,每一列指標用kmeans方法分成三類,再將每個城市的分類加入新的表格中。for (m in 2:25){ my.km<-kmeans(scale(city[,m]),center=3) data<-cbind(data,my.km$cluster)}names(data)<-names(city)
這樣最後成為的就是一個矩陣,在excel里直觀顯示如此:
這個可以繼續往下挖掘,例如各個指標間的相互聯繫,可以用cor函數做,也可以直接用corrplot來做可視化。
corr <- cor(data[2:25])corrplot(corr)
從圖中可以看出,GDP與政府花費是有著很強大正相關關係。因此,如何選擇重要的指標,正切利用或排除這些相互影響的因素,是做好預測和聚類的不可忽略的關鍵一步。
以上僅為初步探討,歡迎批評指正。
參考文件
演算法雜貨鋪--k均值聚類(K-means) - T2噬菌體 - 博客園 數據分析筆記
推薦閱讀:
※雙向鏈表
※演算法:2. Add Two Numbers
※圖解分散式圖演算法 Pregel: 模型簡介與實戰案例
※二叉樹中和為某一值的路徑
※機器學慣用於金融市場預測難在哪?
TAG:演算法 |