k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似
度,而簇间的相似度较低。本文主要基于此算法对下图2006年各地区城镇居民家庭平均每人全年消费性支出进行分析,以了解各地消费层级的划分
实现代码如下:
import numpy as np
from sklearn.cluster import KMeans
import openpyxl
def loadData(filePath):
wb = openpyxl.load_workbook(filePath)
sh = wb.get_sheet_by_name('Sheet1')
retData = []
retCityName = []
for i in range(5, sh.max_row + 1):
retCityName.append(sh.cell(row=i, column=1).value)
retData.append([float(sh.cell(row=i, column=j).value) for j in range(2,sh.max_column + 1)])
return retData,retCityName
if __name__ == '__main__':
data,cityName = loadData('city.xlsx')
km = KMeans(n_clusters=4)
label = km.fit_predict(data)
expenses = np.sum(km.cluster_centers_,axis=1)
#print(expenses)
CityCluster = [[],[],[],[]]
for i in range(len(cityName)):
CityCluster[label[i]].append(cityName[i])
for i in range(len(CityCluster)):
print("Expenses:%.2f" % expenses[i])
print(CityCluster[i])
首先通过openpyxl类库来读取Excel中的文件,将城市名称和其它数据分别存入一个一维数据和二维数组中,然后调用KMeans方法,设置n_clusters参数,即分类个数,对数据时行训练,获得标签,最后对标签进行输出。输出结果即将城市按照消费水平n_clusters类,消费水平相近的城市聚集在一类中。其中expense为聚类中心点的数值加和,也就是平均消费水平。
当n_clusters=2时:
Expenses:7595.47
[' 天 津', ' 河 北', ' 山 西', ' 内蒙古', ' 辽 宁', ' 吉 林', ' 黑龙江', ' 江 苏', ' 安 徽', ' 福 建', ' 江 西', ' 山 东', ' 河 南', ' 湖 北', ' 湖 南', ' 广 西', ' 海 南', ' 重 庆', ' 四 川', ' 贵 州', ' 云 南', ' 西 藏', ' 陕 西', ' 甘 肃', ' 青 海', ' 宁 夏', ' 新 疆']
Expenses:13841.98
[' 北 京', ' 上 海', ' 浙 江', ' 广 东']
当n_clusters=3时:
Expenses:7204.11
[' 河 北', ' 山 西', ' 内蒙古', ' 辽 宁', ' 吉 林', ' 黑龙江', ' 安 徽', ' 江 西', ' 山 东', ' 河 南', ' 湖 北', ' 湖 南', ' 广 西', ' 海 南', ' 四 川', ' 贵 州', ' 云 南', ' 西 藏', ' 陕 西', ' 甘 肃', ' 青 海', ' 宁 夏', ' 新 疆']
Expenses:13841.98
[' 北 京', ' 上 海', ' 浙 江', ' 广 东']
Expenses:9845.76
[' 天 津', ' 江 苏', ' 福 建', ' 重 庆']
当n_clusters=4时:
Expenses:7214.42
[' 辽 宁', ' 安 徽', ' 江 西', ' 湖 北', ' 湖 南', ' 广 西', ' 海 南', ' 四 川', ' 贵 州', ' 云 南', ' 西 藏']
Expenses:13841.98
[' 北 京', ' 上 海', ' 浙 江', ' 广 东']
Expenses:9845.76
[' 天 津', ' 江 苏', ' 福 建', ' 重 庆']
Expenses:7194.66
[' 河 北', ' 山 西', ' 内蒙古', ' 吉 林', ' 黑龙江', ' 山 东', ' 河 南', ' 陕 西', ' 甘 肃', ' 青 海', ' 宁 夏', ' 新 疆']
当n_clusters=5时:
Expenses:9845.76
[' 天 津', ' 江 苏', ' 福 建', ' 重 庆']
Expenses:7130.70
[' 河 北', ' 山 西', ' 内蒙古', ' 吉 林', ' 黑龙江', ' 江 西', ' 山 东', ' 河 南', ' 贵 州', ' 陕 西', ' 甘 肃', ' 青 海', ' 宁 夏', ' 新 疆']
Expenses:12890.38
[' 浙 江', ' 广 东']
Expenses:7318.30
[' 辽 宁', ' 安 徽', ' 湖 北', ' 湖 南', ' 广 西', ' 海 南', ' 四 川', ' 云 南', ' 西 藏']
Expenses:14793.59
[' 北 京', ' 上 海']
从结果可以看出消费水平相近的省市聚集在了一类,例如聚4类时,消费最高的' 北 京', ' 上 海', ' 浙 江', ' 广 东'聚集在了消费最高的类别,结果可以比较明显的看出消费层级。