前陣子有朋友請(qǐng)教茄唐,如果有一份各城市的指標(biāo)表,一共是20個(gè)城市 X 24個(gè)指標(biāo)蝇更,包括城市GDP沪编、人均GDP、人均存款等年扩,應(yīng)該如何分類蚁廓?
如果不考慮原有的一二三線城市分布,而利用各個(gè)指標(biāo)進(jìn)行分類(正確說(shuō)應(yīng)該是聚類)厨幻,我想到的就是K-means方法相嵌。
K-means是非監(jiān)督學(xué)習(xí)(unsupervised learning)中最簡(jiǎn)單也是最常用的一種聚類算法,它的計(jì)算過(guò)程非常直觀:
1况脆、隨機(jī)取k個(gè)元素饭宾,作為k個(gè)簇的各自的中心。
2格了、分別計(jì)算剩下的元素到k個(gè)簇中心的相異度看铆,將這些元素分別劃歸到相異度最低的簇。
3笆搓、根據(jù)聚類結(jié)果性湿,重新計(jì)算k個(gè)簇各自的中心,計(jì)算方法是取簇中所有元素各自維度的算術(shù)平均數(shù)满败。
4肤频、全部元素按照新的中心重新聚類。
5算墨、重復(fù)第4步宵荒,直到聚類結(jié)果不再變化。
按照以上的距離算法,取值范圍大的屬性报咳,例如gdp的數(shù)字差別侠讯,會(huì)產(chǎn)生更大的距離影響,這樣不利于反映真實(shí)的相異度暑刃。為了解決這個(gè)問(wèn)題厢漩,一般要對(duì)屬性值按照比例進(jìn)行規(guī)格化,(scale)映射到[0,1]區(qū)間岩臣。平衡各個(gè)屬性對(duì)距離的影響溜嗜。
代碼如下:
install.packages("corrplot")
library(corrplot)
install.packages("readr")
library(readr)
setwd("E:")
city<-read_csv("city.csv")
head(city)
#設(shè)立一個(gè)空數(shù)據(jù)框,城市名跟原來(lái)的相同
data<-as.data.frame(matrix(ID<-city$city))
#重點(diǎn)是這里:將表格2-25列進(jìn)行循環(huán)架谎,每一列指標(biāo)用kmeans方法分成三類炸宵,再將每個(gè)城市的分類加入新的表格中。
for (m in 2:25){
my.km<-kmeans(scale(city[,m]),center=3)
data<-cbind(data,my.km$cluster)
}
names(data)<-names(city)
這樣最后成為的就是一個(gè)矩陣谷扣,在excel里直觀顯示如此:
這個(gè)可以繼續(xù)往下挖掘土全,例如各個(gè)指標(biāo)間的相互聯(lián)系,可以用cor函數(shù)做会涎,也可以直接用corrplot來(lái)做可視化裹匙。
corr <- cor(data[2:25])
corrplot(corr)
從圖中可以看出,GDP與政府花費(fèi)是有著很強(qiáng)大正相關(guān)關(guān)系在塔。因此幻件,如何選擇重要的指標(biāo),正切利用或排除這些相互影響的因素蛔溃,是做好預(yù)測(cè)和聚類的不可忽略的關(guān)鍵一步。
以上僅為初步探討篱蝇,歡迎批評(píng)指正贺待。
參考文件
http://www.cnblogs.com/leoo2sk/archive/2010/09/20/k-means.html