kmeans算法

原理

以k为参数,把n个对象分成k个簇,使簇内具有较高的相似性,而簇间的相似度较低。处理过程:

  1. 随机选择k个点作为初始的聚类中心
  2. 对于剩下的点,根据其与聚类中心的距离(如欧式距离等),将其归入最近的簇
  3. 对每个簇,计算所有点的均值作为新的聚类中心
  4. 重复2、3直到聚类中心不再发生改变

实战

31省市居民家庭消费调查

import numpy as np
from sklearn.cluster import KMeans


# 31个城市,每个城市8项数据
def loadData(filePath):
    fr = open(filePath, 'r+', encoding='UTF-8')   # 返回文件对象fr
    lines = fr.readlines()                        # 读取所有行并返回列表,列表元素为8维数据
    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')             # data共有31个元素,每个元素是8维的
    km = KMeans(n_clusters=4)
    label = km.fit_predict(data)                      # 返回每个城市对应的簇中心并为簇分配序号
    # print(km.cluster_centers_)                      # 4个簇中心,每个簇中心是8维的
    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("Expenses:%.2f" % expenses[i])
        print(CityCluster[i])

输出

Expenses:3788.76
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '江西', '山东', '河南', '贵州', '陕西', '甘肃', '青海', '宁夏', '*']
Expenses:7754.66
['北京', '上海', '广东']
Expenses:4512.27
['江苏', '安徽', '湖南', '湖北', '广西', '海南', '四川', '云南']
Expenses:5678.62
['天津', '浙江', '福建', '重庆', '*']
上一篇:SQL Server中使用Backup语句进行数据库备份


下一篇:模板 KM算法