K-means方法及应用

k-means算法

基本概念
k-means算法以k为参数,把n个对象分成k个簇,使簇内具有较高的相似度,而簇间的相似度较低。
其处理过程如下:
1.随机选择k个点作为初始的聚类中心;
2.对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
3.对每个簇,计算所有点的均值作为新的聚类中心
4.重复2、3直到聚类中心不再发生改变

了解更多:https://www.naftaliharris.com/blog/visualizing-k-means-clustering/ 有图形化展示。
在这里插入图片描述

优缺点

优缺点
K-means算法受第一次初始质心选择的影响较大,建议多试几次。

K-means的应用

数据介绍

现有1999年全国31个省份城镇居民家庭平均每人全年消费性支出的八个主要变量数据,这八个变量分别是:食品、衣着、家庭设备用品及服务、医疗 保健、交通和通讯、娱乐教育文化服务、居住以及杂项商品和服务。利用已 有数据,对31个省份进行聚类。实验目的:通过聚类,了解1999年各个省份的消费水平在国内的情况。

技术路线:

sklearn.cluster.Kmeans

数据实例:

1999年全国31个省份城镇居民家庭平均每人全年消费性支出数据
在这里插入图片描述

实验过程:

import numpy as np
from sklearn.cluster import KMeans

def loadData(filePath):           #该方法用来读取数据
    fr = open(filePath,'r+')      #用r+的方式打开文件
    lines = fr.readlines()        #一次性读取文件内容,读取所有行并按行返回列表
    retData = []                  #用于存储存储城市各项消费信息
    retCityName = []              #用于存储城市名称
    for line in lines:            #依次读取每行
        items = line.strip().split(",")
        #strip() 方法用于移除字符串头尾指定的字符(默认为空格或换行符)或字符序列。
        #split()通过指定分隔符对字符串进行切片,
        # 文件存储:北京,2959.19,730.79,749.41,513.34,467.87,1141.82,478.42,457.64
        retCityName.append(items[0])
        retData.append([float(items[i]) for i in range(1,len(items))])
        print(retData)
    return retData,retCityName

if __name__ == '__main__':
    data,cityName = loadData('31省市居民家庭消费水平-city.txt')
    km =KMeans(n_clusters=4)            #创建实例
    label = km.fit_predict(data)        #计算簇中心,以及为簇分配序号
    expenses =np.sum(km.cluster_centers_,axis=1)   #聚类中心的数值加和
    #print(expenses)
    CityCluster = [[],[],[],[]]       #将簇先定义为列表,包含4个元素
    for i in range(len(cityName)):                #将城市按label分成设定的簇
        CityCluster[label[i]].append(cityName[i])
    for i in range(len(CityCluster)):
        print("Expenses:%.2f" % expenses[i])     #将每个簇的城市输出
        print(CityCluster[i])                   #将每个城市的消费水平输出

结果

聚成4类:km = KMeans(n_clusters=4)
聚成4类
聚成3类:km = KMeans(n_clusters=3)
聚成3类

中国大学慕课python机械学习

  • 3
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值