机器学习之k-means聚类算法

1、k-means聚类算法简介

k-means算法把数据集分成k个组,使每个组内具有较高的相似度。其处理过程如下:

1、随机选择k个点作为初始的聚类中心

2、对于剩下的点,根据其与聚类中心的距离,将其归入最近的组

3、对每个组,计算所有点的均值作为新的聚类中心

4、重复2、3直到聚类中心不再发生改变

2、数据源

1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:食品、衣着、家庭设备用品及服务、医疗保健、交通和通讯、娱乐教育文化服务、居住以及杂项商品和服务。

下载地址:链接:https://pan.baidu.com/s/1ClND-R7rpx8M03TirkqXLw 密码:6tk6

3、实验目的

通过聚类,了解1999年各个省份在国内的消费水平情况

4、代码实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
import numpy as np
from sklearn.cluster import KMeans


def load_data(file_path):
"""
读取文件数据并返回消费数据和对应省份名称
:param file_path: 数据文件路径
:return: 各省消费数据,省份名称
"""
file = open(file_path, 'r+', encoding='utf-8') # 注意读文件的编码
lines = file.readlines()
file_data = []
file_city_name = []
for line in lines:
items = line.strip().split(',')
file_city_name.append(items[0])
file_data.append([float(items[i]) for i in range(1, len(items))])
file.close()
return file_data, file_city_name


def save_data(file_path, file_data):
"""
保存输出结果到指定路径下
:param file_path: 保存结果的目的文件路径
:param file_data: 结果数据
:return:
"""
file = open(file_path, 'w+', encoding='utf-8') # 注意编码
file.write(str(file_data))
file.close()


data, city_name = load_data('data.csv')
km = KMeans(n_clusters=3) # 将省份分3类
label = km.fit_predict(data) # 计算簇中心以及为簇分配序号
avgExpenses = np.sum(km.cluster_centers_, axis=1) # axis 1按行 2按列 求和

# 根据label将相同分类省份名放置一起
CityCluster = [[], [], []] # 创建3个数组存放数据,和分类数量对应
for i in range(len(city_name)):
CityCluster[int(label[i])].append(city_name[i])

resultStr = '' # 保存分类结果
# 输出分类结果
for i in range(len(CityCluster)):
print("每人每年的消费:¥%0.2f" % (avgExpenses[i]))
print(CityCluster[i])
# 将同分类省份用,拼接
resultStr = resultStr + ','.join(CityCluster[i]) + '\n'

# 保存分类结果
save_data('result.csv', resultStr)

5、运行结果

1
2
3
4
5
6
每人每年的消费:¥5113.54
['天津', '江苏', '浙江', '福建', '湖南', '广西', '海南', '重庆', '四川', '云南', '西藏']
每人每年的消费:¥3827.87
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '安徽', '江西', '山东', '河南', '湖北', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
每人每年的消费:¥7754.66
['北京', '上海', '广东']