无监督学习:通过无标签的数据,学习数据的分布或数据与数据之间的关系。
1.聚类算法
1 定义:根据数据的“相似性”将数据分为多类的过程。
1.1. 算法模块 :K-Means、近邻传播算法、DBSCAN算法,高斯混合模型(GMM)等。
1.2. Python库 :sklearn.cluster;
1.3. K-Means聚类算法步骤 :
(1) 首先我们选择一组数据,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置,这需要我们提前预知类的数量(即中心点的数量)。
(2) 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。
(3) 计算每一类中中心点作为新的中心点。
(4) 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个
1.4. 优点和缺点 :
(1) 优点是:速度快,计算简便,主要需要调参的参数仅仅是簇数k。
(2) 缺点是用数据集的中位数而不是均值来计算数据的中心点,当隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
(3) 对噪音和异常点比较的敏感。
2.程序
1.1. K-Means 模块的导入
import numpy as np
from sklearn.cluster import KMeans
1.2. 模块程序
class K_Means():
'''
该类实现聚类分析
'''
def loadData(self, filePath):
'''
:param filePath:
:return: 城市名,每项指标
'''
fr = open(filePath, 'r+') #以读写的方式打开一个文本文件
lines = fr.readlines() #一次读取整个文件
retData_new = [] #城市消费信息
reCityName = [] #城市名称
for line in lines:
items = line.strip().split(",") #按','分开,每行形成一个列表
reCityName.append(items[0])
retData = []
for i in range(1, len(items)-1):
retData.append(float(items[i]))
retData_new.append(retData) #统计只有 指标数据的列表 每行为
return retData_new, reCityName
if __name__ == '__main__':
tample = K_Means()
data, cityName = tample.loadData('31省市居民家庭消费水平.txt')
# print(data, cityName)
km = KMeans(n_clusters= 3) #n_clusters表示聚类的数目
label = km.fit_predict(data) #label聚类后各数据所属的标签 #fit_predict()计算簇中心以及为簇分配序号
expenses = np.sum(km.cluster_centers_, axis=1) #聚类中心的数值加和,也是数据的平均消费水平
# print(expenses)
CityCluster =[[], [], []]
for i in range(len(cityName)): #将每个簇的城市输出
# a = label[i]
CityCluster[label[i]].append(cityName[i])
len(CityCluster)
for i in range(len(CityCluster)): #将每个簇的平均花费进行输出
print("Expenses:%.2f" %expenses[i])
print(CityCluster[i])
1.3. 注意事项:
数据(.txt文件)中最后一行数据结尾的光标要在最后一行最后一个数据,不能另取一行。
3.数据及结果展示
1.1. 数据:
百度网盘链接:
链接: link.
1.2. 结果展示:
第1聚类:
Expenses:3640.38
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '安徽', '江西', '山东', '河南', '湖北', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
第2聚类:
Expenses:4840.20
['天津', '江苏', '浙江', '福建', '湖南', '广西', '海南', '重庆', '四川', '云南', '西藏']
第3聚类:
Expenses:7307.83
['北京', '上海', '广东']
可以自定义聚类数目,参考:km = KMeans(n_clusters = 3)。