无监督学习之K-Means聚类

无监督学习:通过无标签的数据,学习数据的分布或数据与数据之间的关系。

1.聚类算法

1 定义:根据数据的“相似性”将数据分为多类的过程。
1.1. 算法模块 :K-Means、近邻传播算法、DBSCAN算法,高斯混合模型(GMM)等。
1.2. Python库 :sklearn.cluster;

1.3. K-Means聚类算法步骤
(1) 首先我们选择一组数据,并随机初始化它们各自的中心点。中心点是与每个数据点向量长度相同的位置,这需要我们提前预知类的数量(即中心点的数量)。
(2) 计算每个数据点到中心点的距离,数据点距离哪个中心点最近就划分到哪一类中。
(3) 计算每一类中中心点作为新的中心点。
(4) 重复以上步骤,直到每一类中心在每次迭代后变化不大为止。也可以多次随机初始化中心点,然后选择运行结果最好的一个

1.4. 优点和缺点
(1) 优点是:速度快,计算简便,主要需要调参的参数仅仅是簇数k。
(2) 缺点是用数据集的中位数而不是均值来计算数据的中心点,当隐含类别的数据量严重失衡,或者各隐含类别的方差不同,则聚类效果不佳。
(3) 对噪音和异常点比较的敏感。

2.程序

1.1. K-Means 模块的导入

import numpy as np
from sklearn.cluster import KMeans

1.2. 模块程序


class K_Means():
    '''
    该类实现聚类分析
    '''
    def loadData(self, filePath):
        '''
        :param filePath:
        :return: 城市名,每项指标
        '''
        fr = open(filePath, 'r+') #以读写的方式打开一个文本文件
        lines = fr.readlines()  #一次读取整个文件

        retData_new = []  #城市消费信息
        reCityName = []  #城市名称

        for line in lines:
            items = line.strip().split(",") #按','分开,每行形成一个列表
            reCityName.append(items[0])
            retData = []
            for i in range(1, len(items)-1):
                retData.append(float(items[i]))
            retData_new.append(retData) #统计只有 指标数据的列表 每行为
        return retData_new, reCityName


if __name__ == '__main__':
    tample = K_Means()
    data, cityName = tample.loadData('31省市居民家庭消费水平.txt')

    # print(data, cityName)
    km = KMeans(n_clusters= 3)  #n_clusters表示聚类的数目
    label = km.fit_predict(data) #label聚类后各数据所属的标签  #fit_predict()计算簇中心以及为簇分配序号
    expenses = np.sum(km.cluster_centers_, axis=1)   #聚类中心的数值加和,也是数据的平均消费水平
    # print(expenses)

    CityCluster =[[], [], []]
    for i in range(len(cityName)): #将每个簇的城市输出
        # a = label[i]
        CityCluster[label[i]].append(cityName[i])

    len(CityCluster)
    for i in range(len(CityCluster)): #将每个簇的平均花费进行输出
       print("Expenses:%.2f" %expenses[i])
       print(CityCluster[i])

1.3. 注意事项:
数据(.txt文件)中最后一行数据结尾的光标要在最后一行最后一个数据,不能另取一行。

3.数据及结果展示

1.1. 数据:
百度网盘链接:
链接: link.
1.2. 结果展示:

1聚类:
Expenses:3640.38
['河北', '山西', '内蒙古', '辽宁', '吉林', '黑龙江', '安徽', '江西', '山东', '河南', '湖北', '贵州', '陕西', '甘肃', '青海', '宁夏', '新疆']2聚类:
Expenses:4840.20
['天津', '江苏', '浙江', '福建', '湖南', '广西', '海南', '重庆', '四川', '云南', '西藏']3聚类:
Expenses:7307.83
['北京', '上海', '广东']

可以自定义聚类数目,参考:km = KMeans(n_clusters = 3)。

发布了4 篇原创文章 · 获赞 4 · 访问量 188

猜你喜欢

转载自blog.csdn.net/qq_41709378/article/details/105330818
今日推荐