聚类:K-means算法
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
处理的思路:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对每个簇,计算所有点的均值作为新的聚类中心
4.重复2、3直到聚类中心不再发生改变
图解:
image.png下面是对31个省份的人均消费水平的聚类算法,从而可以看出每个省的消费水平。
所需要的数据:
链接: https://pan.baidu.com/s/1Uw2pIAQwm6q7D1zJL-CHSw 提取码: cfbk
#-*- coding:utf-8 -*-
import numpy as np
from sklearn.cluster import KMeans
def loadData(filepath):#调用函数时直接输入路径
fr=open(filepath,'r+',encoding='gbk') #只读模式,文本的编辑方式是'gbk'
lines=fr.readlines() #读取整个文件
retData=[]
retCityName=[]
for line in lines:
items=line.strip().split(",") #以逗号作为依据将表格分隔开,#此处一定要记得分割
retCityName.append(items[0]) #第一列是城市名
retData.append([float(items[i]) for i in range(1,len(items))]) #第二列到最后一列都是数据,变成n个数列的形式,才能计算每个数据
for i in range(len(items)):
return retCityName,retData
# loadData("city.txt")
if __name__ == '__main__':
CityName,Data=loadData('city.txt')
km=KMeans(n_clusters=3) #这两步完成了聚类算法,第一步,调用Kmeans算法,然后是利用调用的算法进行距离的计算,同时进行分类,并且设置标签
lable=km.fit_predict(Data) #lable=[2 0 1 1 1 1 1 1 2 0 0 1 0 1 1 1 0 1 2 0 0 0 0 1 0 0 1 1 1 1 1],#通过数据对城市进行分类
expense=np.sum(km.cluster_centers_,axis=1) #计算出每个省份的总的消费情况,便于了解各省的人均支出 #聚类之后对各个簇里面的数值求均值
# print(expense)
#进行聚类之后,再打印输出
CityCluster=[[],[],[]]
for i in range(len(CityName)):
CityCluster[lable[i]].append(CityName[i]) #将每个簇的城市输出
for i in range(len(CityCluster)):
print("Expense:%.2f"%expense[i]) #将每个簇的平均花费输出
print(CityCluster[i])
调用KMeans方法所需参数:
其它参数:
• n_clusters:用于指定聚类中心的个数 • data:加载的数据
• init:初始聚类中心的初始化方法 • label:聚类后各数据所属的标签
• max_iter:最大的迭代次数 • axis: 按行求和
• 一般调用时只用给出n_clusters即可,init 默认是k-means++,max_iter默认是300
• fit_predict():计算簇中心以及为簇分配序号
结果:
Expense:5113.54
['天津', '江苏', '浙江', '福建', '湖南', '广西', '海南', '重庆', '四川', '云南', '西藏']
Expense:7754.66
['北京', '上海', '广东']
Expense:3827.87
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '安徽', '江西', '山东', '河南', '湖北', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
很明显,可以看出来消费水平较高的是北上广
网友评论