首页投稿(暂停使用,暂停投稿)程序员

K-means计算城市聚类

2017-06-30  本文已影响0人  只是不在意

前阵子有朋友请教,如果有一份各城市的指标表,一共是20个城市 X 24个指标,包括城市GDP、人均GDP、人均存款等,应该如何分类?

1.png

如果不考虑原有的一二三线城市分布,而利用各个指标进行分类(正确说应该是聚类),我想到的就是K-means方法。

K-means是非监督学习(unsupervised learning)中最简单也是最常用的一种聚类算法,它的计算过程非常直观:

1、随机取k个元素,作为k个簇的各自的中心。
2、分别计算剩下的元素到k个簇中心的相异度,将这些元素分别划归到相异度最低的簇。
3、根据聚类结果,重新计算k个簇各自的中心,计算方法是取簇中所有元素各自维度的算术平均数。
4、全部元素按照新的中心重新聚类。
5、重复第4步,直到聚类结果不再变化。

image.png

按照以上的距离算法,取值范围大的属性,例如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里直观显示如此:

2.png

这个可以继续往下挖掘,例如各个指标间的相互联系,可以用cor函数做,也可以直接用corrplot来做可视化。

corr <- cor(data[2:25])
corrplot(corr)
3.png

从图中可以看出,GDP与政府花费是有着很强大正相关关系。因此,如何选择重要的指标,正切利用或排除这些相互影响的因素,是做好预测和聚类的不可忽略的关键一步。
以上仅为初步探讨,欢迎批评指正。


参考文件
http://www.cnblogs.com/leoo2sk/archive/2010/09/20/k-means.html

上一篇下一篇

猜你喜欢

热点阅读