聚类算法应用——K-means

2019-10-07  本文已影响0人  敬子v

聚类: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
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '安徽', '江西', '山东', '河南', '湖北', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']

很明显,可以看出来消费水平较高的是北上广

上一篇下一篇

猜你喜欢

热点阅读