• 首页 首页 icon
  • 工具库 工具库 icon
    • IP查询 IP查询 icon
  • 内容库 内容库 icon
    • 快讯库 快讯库 icon
    • 精品库 精品库 icon
    • 问答库 问答库 icon
  • 更多 更多 icon
    • 服务条款 服务条款 icon

2.k-均值k-means聚类算法

武飞扬头像
bgm_Amber
帮助1

简介:K-均值聚类算法时最基础、应用最广泛的聚类算法,也是最快速的聚类算法之一。

一.原理和过程

原理:K-均值聚类算法以最小化误差函数为目标将样本数据集分为k类。

过程

  • 设定k个类别的中心的初值;
  • 计算每个样本到k个中心点的距离,按最近距离进行分类;
  • 以每个类别中样本的均值,更新该类别的中心;
  • 重复迭代以上步骤,直到达到终止条件(迭代次数、最小平方误差、簇中心点变化率)

优缺点优点是原理简单、算法简单,速度快,聚类效果极好,对大数据集具有很好的伸缩性。这些优点特别有利于初学者、常见问题。其缺点是需要给定 K值,对一些特殊情况(如非凸簇、特殊值、簇的大小差别大)的性能不太好。

二.Sklearn中K-均值算法的使用

sklearn.cluster.KMeans 类是 K-均值算法的具体实现。

1.KMeans 的主要参数

  • n_clusters: int,default=8  K值,给定的分类数量,默认值 8。

  • init:{‘k-means ’, ‘random’}  初始中心的选择方式,默认'K-means '是优化值,也可以随机选择或自行指定。

  • n_init:int, default=10  以不同的中心初值多次运行,以降低初值对算法的影响。默认值 10。

  • max_iter:int, default=300  最大迭代次数。默认值 300。

  • algorithm:{“auto”, “full”, “elkan”}, default=”auto”  算法选择,"full"是经典的 EM算法,"elkan"能快速处理定义良好的簇,默认值 “auto"目前采用"elkan"。

2.KMeans 的主要属性

  • clustercenters:每个聚类中心的坐标

  • labels_: 每个样本的分类结果

  • inertia_: 每个点到所属聚类中心的距离之和。

3.实用案例

核心程序如下:

kMeanModel = KMeans(n_clusters=2).fit(X)

实例:

  1.  
    from sklearn.cluster import KMeans # 导入 sklearn.cluster.KMeans 类
  2.  
    import numpy as np
  3.  
    X = np.array([[1,2], [1,4], [1,0], [10,2], [10,4], [10,0]])
  4.  
    kmCluster = KMeans(n_clusters=2).fit(X) # 建立模型并进行聚类,设定 K=2
  5.  
    print(kmCluster.cluster_centers_) # 返回每个聚类中心的坐标
  6.  
    #[[10., 2.], [ 1., 2.]] # print 显示聚类中心坐标
  7.  
    print(kmCluster.labels_) # 返回样本集的分类结果
  8.  
    #[1, 1, 1, 0, 0, 0] # print 显示分类结果
  9.  
    print(kmCluster.predict([[0, 0], [12, 3]])) # 根据模型聚类结果进行预测判断
  10.  
    #[1, 0] # print显示判断结果:样本属于哪个类别

4.针对大样本集的改进算法:Mini Batch K-Means

        对于样本集巨大的问题,例如样本量大于 10万、特征变量大于100,K-Means算法耗费的速度和内存很大。SKlearn 提供了针对大样本集的改进算法 Mini Batch K-Means,并不使用全部样本数据,而是每次抽样选取小样本集进行 K-Means聚类,进行循环迭代。Mini Batch K-Means 虽然性能略有降低,但极大的提高了运行速度和内存占用。

MiniBatchKMeans 与 KMeans不同的主要参数是:

  • batch_size: int, default=100   抽样集的大小。默认值 100。

  Mini Batch K-Means 的用法实例如下:

  1.  
    from sklearn.cluster import MiniBatchKMeans # 导入 .MiniBatchKMeans 类
  2.  
    import numpy as np
  3.  
    X = np.array([[1,2], [1,4], [1,0], [4,2], [4,0], [4,4],
  4.  
    [4,5], [0,1], [2,2],[3,2], [5,5], [1,-1]])
  5.  
    # fit on the whole data
  6.  
    mbkmCluster = MiniBatchKMeans(n_clusters=2,batch_size=6,max_iter=10).fit(X)
  7.  
    print(mbkmCluster.cluster_centers_) # 返回每个聚类中心的坐标
  8.  
    # [[3.96,2.41], [1.12,1.39]] # print 显示内容
  9.  
    print(mbkmCluster.labels_) # 返回样本集的分类结果
  10.  
    #[1 1 1 0 0 0 0 1 1 0 0 1] # print 显示内容
  11.  
    # === 关注 Youcans,分享更多原创系列 https://www.cnblogs.com/youcans/ ===
  12.  
    print(mbkmCluster.predict([[0,0], [4,5]])) # 根据模型聚类结果进行预测判断
  13.  
    #[1, 0] # 显示判断结果:样本属于哪个类别

三.K-均值算法实例

1.问题描述

        数据采用《中国统计年鉴》中2010年我国各地区普通初中基本情况,根据数据对我国各地区普通初中基本情况进行聚类分析。

学新通

2.Python程序

  1.  
    # -*- coding: utf-8 -*-
  2.  
    import numpy as np
  3.  
    import pandas as pd
  4.  
    from sklearn.cluster import KMeans, MiniBatchKMeans
  5.  
     
  6.  
    # 主程序
  7.  
    def main():
  8.  
    # 读取数据文件
  9.  
    readPath = "C:/Users/Administrator/jupter程序/各地区普通初中基本情况2010年.xls" # 数据文件的地址和文件名
  10.  
    dfFile = pd.read_excel(readPath, header=0) # 首行为标题行
  11.  
    dfFile = dfFile.dropna() # 删除含有缺失值的数据
  12.  
    # print(dfFile.dtypes) # 查看 df 各列的数据类型
  13.  
    # print(dfFile.shape) # 查看 df 的行数和列数
  14.  
    print(dfFile.head())
  15.  
     
  16.  
    # 数据准备
  17.  
    z_scaler = lambda x:(x-np.mean(x))/np.std(x) # 定义数据标准化函数
  18.  
    dfScaler = dfFile[['x1','x2','x3','x4','x5']].apply(z_scaler) # 数据归一化
  19.  
    dfData = pd.concat([dfFile[['地区']], dfScaler], axis=1) # 列级别合并
  20.  
    df = dfData.loc[:,['x1','x2','x3','x4','x5']] # 基于全部 5个特征聚类分析
  21.  
    # df = dfData.loc[:,['x1','x2','x3']] # 降维后选取 3个特征聚类分析
  22.  
    X = np.array(df) # 准备 sklearn.cluster.KMeans 模型数据
  23.  
    print("Shape of cluster data:", X.shape)
  24.  
     
  25.  
    # KMeans 聚类分析(sklearn.cluster.KMeans)
  26.  
    nCluster = 4
  27.  
    kmCluster = KMeans(n_clusters=nCluster).fit(X) # 建立模型并进行聚类,设定 K=2
  28.  
    print("Cluster centers:\n", kmCluster.cluster_centers_) # 返回每个聚类中心的坐标
  29.  
    print("Cluster results:\n", kmCluster.labels_) # 返回样本集的分类结果
  30.  
     
  31.  
    # 整理聚类结果
  32.  
    listName = dfData['地区'].tolist() # 将 dfData 的首列 '地区' 转换为 listName
  33.  
    dictCluster = dict(zip(listName,kmCluster.labels_)) # 将 listName 与聚类结果关联,组成字典
  34.  
    listCluster = [[] for k in range(nCluster)]
  35.  
    for v in range(0, len(dictCluster)):
  36.  
    k = list(dictCluster.values())[v] # 第v个城市的分类是 k
  37.  
    listCluster[k].append(list(dictCluster.keys())[v]) # 将第v个城市添加到 第k类
  38.  
    print("\n聚类分析结果(分为{}类):".format(nCluster)) # 返回样本集的分类结果
  39.  
    for k in range(nCluster):
  40.  
    print("第 {} 类:{}".format(k, listCluster[k])) # 显示第 k 类的结果
  41.  
     
  42.  
    return
  43.  
     
  44.  
     
  45.  
    if __name__ == '__main__':
  46.  
    main()
学新通

3.程序运行结果

学新通

这篇好文章是转载于:学新通技术网

  • 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
  • 本站站名: 学新通技术网
  • 本文地址: /boutique/detail/tanhghejck
系列文章
更多 icon
同类精品
更多 icon
继续加载