机器学习实战(三)—K均值聚类算法

k均值聚类算法(k-means clustering
algorithm)是一种迭代求解的聚类分析算法,其步骤是随机选取K个对象作为初始的聚类中心,然后计算每个对象与各个种子聚类中心之间的距离,把每个对象分配给距离它最近的聚类中心。聚类中心以及分配给它们的对象就代表一个聚类。每分配一个样本,聚类的聚类中心会根据聚类中现有的对象被重新计算。这个过程将不断重复直到满足某个终止条件。终止条件可以是没有(或最小数目)对象被重新分配给不同的聚类,没有(或最小数目)聚类中心再发生变化,误差平方和局部最小。

处理过程
(1)随机选择 k k k 个点作为初始的聚类中心
(2)对于剩下的点,根据其与聚类中心的距离,将其归入最近的簇
(3)对每个簇,计算所有点的均值作为新的聚类中心
(4)重复(2)、(3)直到聚类中心不再发生改变
机器学习实战(三)—K均值聚类算法_第1张图片

算法流程:
机器学习实战(三)—K均值聚类算法_第2张图片
以上算法流程引自周志华《机器学习》,从流程来看K-means算法计算步骤基本上可以概括为两个部分:(1)计算每一个对象到类簇中心的距离;(2)根据类簇内的对象计算新的簇类中心。

应用实例——31省份居民家庭消费调查(将城市按消费水平分类)
数据集展示:
机器学习实战(三)—K均值聚类算法_第3张图片

import numpy as np
from sklearn.cluster import KMeans
#数据集加载函数
def loadData(filePath):
    fr = open(filePath,'r+')
    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))])
    return retData,retCityName
 
     
if __name__ == '__main__':
    data,cityName = loadData('city.txt')
    km = KMeans(n_clusters=4)
    label = km.fit_predict(data)
    #聚类计算,获得标签
    expenses = np.sum(km.cluster_centers_,axis=1)
    CityCluster = [[],[],[],[]]
    for i in range(len(cityName)):
        CityCluster[label[i]].append(cityName[i])
    for i in range(len(CityCluster)):
        print("消费水平: %.2f" % expenses[i])
        print(CityCluster[i])

聚成2类时:(n_clusters=2)输出如下

In [6]: run K_means.py
消费水平: 4040.42
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江苏', '安徽', '江西', '山东', '河南', '湖南', '湖北', '广西', '海南', '四川', '贵州', '云南', '陕西', '甘肃', '青海', '宁夏', '新疆']
消费水平: 6457.13
['北京', '天津', '上海', '浙江', '福建', '广东', '重庆', '西藏']

聚成3类时:(n_clusters=3)输出如下

In [8]: run K_means.py
消费水平: 3827.87
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '安徽', '江西', '山东', '河南', '湖北', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']
消费水平: 5113.54
['天津', '江苏', '浙江', '福建', '湖南', '广西', '海南', '重庆', '四川', '云南', '西藏']
消费水平: 7754.66
['北京', '上海', '广东']

从输出结果看出消费水平相近的省市聚集在了一类。

你可能感兴趣的:(机器学习实战,机器学习实战)