zoukankan      html  css  js  c++  java
  • 机器学习sklearn19.0聚类算法——Kmeans算法

    一、关于聚类及相似度、距离的知识点

    二、k-means算法思想与流程

    三、sklearn中对于kmeans算法的参数

    四、代码示例以及应用的知识点简介

    (1)make_blobs:聚类数据生成器

    sklearn.datasets.make_blobs(n_samples=100, n_features=2,centers=3, cluster_std=1.0, center_box=(-10.0, 10.0), shuffle=True, random_state=None)[source]


    返回值为:

    (2)np.vstack方法作用——堆叠数组

    详细介绍参照博客链接:http://blog.csdn.net/csdn15698845876/article/details/73380803

    [python] view plain copy
     
    1. #!/usr/bin/env python  
    2. # -*- coding:utf-8 -*-  
    3. # Author:ZhengzhengLiu  
    4.   
    5. #k-means聚类算法  
    6.   
    7. import numpy as np  
    8. import pandas as pd  
    9. import matplotlib as mpl  
    10. import matplotlib.pyplot as plt  
    11. import matplotlib.colors  
    12. import sklearn.datasets as ds  
    13. from sklearn.cluster import KMeans      #引入kmeans  
    14.   
    15. #解决中文显示问题  
    16. mpl.rcParams['font.sans-serif'] = [u'SimHei']  
    17. mpl.rcParams['axes.unicode_minus'] = False  
    18.   
    19. #产生模拟数据  
    20. N = 1500  
    21. centers = 4  
    22. #make_blobs:聚类数据生成器  
    23. data,y = ds.make_blobs(N,n_features=2,centers=centers,random_state=28)  
    24.   
    25. data2,y2 = ds.make_blobs(N,n_features=2,centers=centers,random_state=28)  
    26. data3 = np.vstack((data[y==0][:200],data[y==1][:100],data[y==2][:10],data[y==3][:50]))  
    27. y3 = np.array([0]*200+[1]*100+[2]*10+[3]*50)  
    28.   
    29. #模型的构建  
    30. km = KMeans(n_clusters=centers,random_state=28)  
    31. km.fit(data,y)  
    32. y_hat = km.predict(data)  
    33. print("所有样本距离聚簇中心点的总距离和:",km.inertia_)  
    34. print("距离聚簇中心点的平均距离:",(km.inertia_/N))  
    35. print("聚簇中心点:",km.cluster_centers_)  
    36.   
    37. y_hat2 = km.fit_predict(data2)  
    38. y_hat3 = km.fit_predict(data3)  
    39.   
    40. def expandBorder(a, b):  
    41.     d = (b - a) * 0.1  
    42.     return a-d, b+d  
    43.   
    44. #画图  
    45. cm = mpl.colors.ListedColormap(list("rgbmyc"))  
    46. plt.figure(figsize=(15,9),facecolor="w")  
    47. plt.subplot(241)  
    48. plt.scatter(data[:,0],data[:,1],c=y,s=30,cmap=cm,edgecolors="none")  
    49.   
    50. x1_min,x2_min = np.min(data,axis=0)  
    51. x1_max,x2_max = np.max(data,axis=0)  
    52. x1_min,x1_max = expandBorder(x1_min,x1_max)  
    53. x2_min,x2_max = expandBorder(x2_min,x2_max)  
    54. plt.xlim((x1_min,x1_max))  
    55. plt.ylim((x2_min,x2_max))  
    56. plt.title("原始数据")  
    57. plt.grid(True)  
    58.   
    59. plt.subplot(242)  
    60. plt.scatter(data[:, 0], data[:, 1], c=y_hat, s=30, cmap=cm, edgecolors='none')  
    61. plt.xlim((x1_min, x1_max))  
    62. plt.ylim((x2_min, x2_max))  
    63. plt.title(u'K-Means算法聚类结果')  
    64. plt.grid(True)  
    65.   
    66. m = np.array(((1, 1), (0.5, 5)))  
    67. data_r = data.dot(m)  
    68. y_r_hat = km.fit_predict(data_r)  
    69. plt.subplot(243)  
    70. plt.scatter(data_r[:, 0], data_r[:, 1], c=y, s=30, cmap=cm, edgecolors='none')  
    71.   
    72. x1_min, x2_min = np.min(data_r, axis=0)  
    73. x1_max, x2_max = np.max(data_r, axis=0)  
    74. x1_min, x1_max = expandBorder(x1_min, x1_max)  
    75. x2_min, x2_max = expandBorder(x2_min, x2_max)  
    76.   
    77. plt.xlim((x1_min, x1_max))  
    78. plt.ylim((x2_min, x2_max))  
    79. plt.title(u'数据旋转后原始数据图')  
    80. plt.grid(True)  
    81.   
    82. plt.subplot(244)  
    83. plt.scatter(data_r[:, 0], data_r[:, 1], c=y_r_hat, s=30, cmap=cm, edgecolors='none')  
    84. plt.xlim((x1_min, x1_max))  
    85. plt.ylim((x2_min, x2_max))  
    86. plt.title(u'数据旋转后预测图')  
    87. plt.grid(True)  
    88.   
    89. plt.subplot(245)  
    90. plt.scatter(data2[:, 0], data2[:, 1], c=y2, s=30, cmap=cm, edgecolors='none')  
    91. x1_min, x2_min = np.min(data2, axis=0)  
    92. x1_max, x2_max = np.max(data2, axis=0)  
    93. x1_min, x1_max = expandBorder(x1_min, x1_max)  
    94. x2_min, x2_max = expandBorder(x2_min, x2_max)  
    95. plt.xlim((x1_min, x1_max))  
    96. plt.ylim((x2_min, x2_max))  
    97. plt.title(u'不同方差的原始数据')  
    98. plt.grid(True)  
    99.   
    100. plt.subplot(246)  
    101. plt.scatter(data2[:, 0], data2[:, 1], c=y_hat2, s=30, cmap=cm, edgecolors='none')  
    102. plt.xlim((x1_min, x1_max))  
    103. plt.ylim((x2_min, x2_max))  
    104. plt.title(u'不同方差簇数据的K-Means算法聚类结果')  
    105. plt.grid(True)  
    106.   
    107. plt.subplot(247)  
    108. plt.scatter(data3[:, 0], data3[:, 1], c=y3, s=30, cmap=cm, edgecolors='none')  
    109. x1_min, x2_min = np.min(data3, axis=0)  
    110. x1_max, x2_max = np.max(data3, axis=0)  
    111. x1_min, x1_max = expandBorder(x1_min, x1_max)  
    112. x2_min, x2_max = expandBorder(x2_min, x2_max)  
    113. plt.xlim((x1_min, x1_max))  
    114. plt.ylim((x2_min, x2_max))  
    115. plt.title(u'不同簇样本数量原始数据图')  
    116. plt.grid(True)  
    117.   
    118. plt.subplot(248)  
    119. plt.scatter(data3[:, 0], data3[:, 1], c=y_hat3, s=30, cmap=cm, edgecolors='none')  
    120. plt.xlim((x1_min, x1_max))  
    121. plt.ylim((x2_min, x2_max))  
    122. plt.title(u'不同簇样本数量的K-Means算法聚类结果')  
    123. plt.grid(True)  
    124.   
    125. plt.tight_layout(2, rect=(0, 0, 1, 0.97))  
    126. plt.suptitle(u'数据分布对KMeans聚类的影响', fontsize=18)  
    127. plt.savefig("k-means聚类算法.png")  
    128. plt.show()  
    129.   
    130. #运行结果:  
    131. 所有样本距离聚簇中心点的总距离和: 2592.9990199  
    132. 距离聚簇中心点的平均距离: 1.72866601327  
    133. 聚簇中心点: [[ -7.44342199e+00  -2.00152176e+00]  
    134.  [  5.80338598e+00   2.75272962e-03]  
    135.  [ -6.36176159e+00   6.94997331e+00]  
    136.  [  4.34372837e+00   1.33977807e+00]]  


    代码中用到的知识点:

    [python] view plain copy
     
    1. #!/usr/bin/env python  
    2. # -*- coding:utf-8 -*-  
    3. # Author:ZhengzhengLiu  
    4.   
    5. #kmean与mini batch kmeans 算法的比较  
    6.   
    7. import time  
    8. import numpy as np  
    9. import matplotlib as mpl  
    10. import matplotlib.pyplot as plt  
    11. import matplotlib.colors  
    12. from sklearn.cluster import KMeans,MiniBatchKMeans  
    13. from sklearn.datasets.samples_generator import make_blobs  
    14. from sklearn.metrics.pairwise import pairwise_distances_argmin  
    15.   
    16. #解决中文显示问题  
    17. mpl.rcParams['font.sans-serif'] = [u'SimHei']  
    18. mpl.rcParams['axes.unicode_minus'] = False  
    19.   
    20. #初始化三个中心  
    21. centers = [[1,1],[-1,-1],[1,-1]]  
    22. clusters = len(centers)     #聚类数目为3  
    23. #产生3000组二维数据样本,三个中心点,标准差是0.7  
    24. X,Y = make_blobs(n_samples=300,centers=centers,cluster_std=0.7,random_state=28)  
    25.   
    26. #构建kmeans算法  
    27. k_means =  KMeans(init="k-means++",n_clusters=clusters,random_state=28)  
    28. t0 = time.time()  
    29. k_means.fit(X)      #模型训练  
    30. km_batch = time.time()-t0       #使用kmeans训练数据消耗的时间  
    31. print("K-Means算法模型训练消耗时间:%.4fs"%km_batch)  
    32.   
    33. #构建mini batch kmeans算法  
    34. batch_size = 100        #采样集的大小  
    35. mbk = MiniBatchKMeans(init="k-means++",n_clusters=clusters,batch_size=batch_size,random_state=28)  
    36. t0 = time.time()  
    37. mbk.fit(X)  
    38. mbk_batch = time.time()-t0  
    39. print("Mini Batch K-Means算法模型训练消耗时间:%.4fs"%mbk_batch)  
    40.   
    41. #预测结果  
    42. km_y_hat = k_means.predict(X)  
    43. mbk_y_hat = mbk.predict(X)  
    44.   
    45. #获取聚类中心点并对其排序  
    46. k_means_cluster_center = k_means.cluster_centers_  
    47. mbk_cluster_center = mbk.cluster_centers_  
    48. print("K-Means算法聚类中心点:  center=",k_means_cluster_center)  
    49. print("Mini Batch K-Means算法聚类中心点:  center=",mbk_cluster_center)  
    50. order = pairwise_distances_argmin(k_means_cluster_center,mbk_cluster_center)  
    51.   
    52. #画图  
    53. plt.figure(figsize=(12,6),facecolor="w")  
    54. plt.subplots_adjust(left=0.05,right=0.95,bottom=0.05,top=0.9)  
    55. cm = mpl.colors.ListedColormap(['#FFC2CC', '#C2FFCC', '#CCC2FF'])  
    56. cm2 = mpl.colors.ListedColormap(['#FF0000', '#00FF00', '#0000FF'])  
    57.   
    58. #子图1——原始数据  
    59. plt.subplot(221)  
    60. plt.scatter(X[:,0],X[:,1],c=Y,s=6,cmap=cm,edgecolors="none")  
    61. plt.title(u"原始数据分布图")  
    62. plt.xticks(())  
    63. plt.yticks(())  
    64. plt.grid(True)  
    65.   
    66. #子图2:K-Means算法聚类结果图  
    67. plt.subplot(222)  
    68. plt.scatter(X[:,0], X[:,1], c=km_y_hat, s=6, cmap=cm,edgecolors='none')  
    69. plt.scatter(k_means_cluster_center[:,0], k_means_cluster_center[:,1],c=range(clusters),s=60,cmap=cm2,edgecolors='none')  
    70. plt.title(u'K-Means算法聚类结果图')  
    71. plt.xticks(())  
    72. plt.yticks(())  
    73. plt.text(-3.8, 3,  'train time: %.2fms' % (km_batch*1000))  
    74. plt.grid(True)  
    75.   
    76. #子图三Mini Batch K-Means算法聚类结果图  
    77. plt.subplot(223)  
    78. plt.scatter(X[:,0], X[:,1], c=mbk_y_hat, s=6, cmap=cm,edgecolors='none')  
    79. plt.scatter(mbk_cluster_center[:,0], mbk_cluster_center[:,1],c=range(clusters),s=60,cmap=cm2,edgecolors='none')  
    80. plt.title(u'Mini Batch K-Means算法聚类结果图')  
    81. plt.xticks(())  
    82. plt.yticks(())  
    83. plt.text(-3.8, 3,  'train time: %.2fms' % (mbk_batch*1000))  
    84. plt.grid(True)  
    85. plt.savefig("kmean与mini batch kmeans 算法的比较.png")  
    86. plt.show()  
    87.   
    88. #运行结果:  
    89. K-Means算法模型训练消耗时间:0.2260s  
    90. Mini Batch K-Means算法模型训练消耗时间:0.0230s  
    91. K-Means算法聚类中心点:  
    92.  center= [[ 0.96091862  1.13741775]  
    93.  [ 1.1979318  -1.02783007]  
    94.  [-0.98673669 -1.09398768]]  
    95. Mini Batch K-Means算法聚类中心点:  
    96.  center= [[ 1.34304199 -1.01641075]  
    97.  [ 0.83760683  1.01229021]  
    98.  [-0.92702179 -1.08205992]]  


    五、聚类算法的衡量指标

    [python] view plain copy
     
      1. #!/usr/bin/env python  
      2. # -*- coding:utf-8 -*-  
      3. # Author:ZhengzhengLiu  
      4.   
      5. #聚类算法评估  
      6.   
      7. import time  
      8. import numpy as np  
      9. import matplotlib as mpl  
      10. import matplotlib.pyplot as plt  
      11. import matplotlib.colors  
      12. from sklearn.cluster import KMeans,MiniBatchKMeans  
      13. from sklearn import metrics  
      14. from sklearn.metrics.pairwise import pairwise_distances_argmin  
      15. from sklearn.datasets.samples_generator import make_blobs  
      16.   
      17. #解决中文显示问题  
      18. mpl.rcParams['font.sans-serif'] = [u'SimHei']  
      19. mpl.rcParams['axes.unicode_minus'] = False  
      20.   
      21. #初始化三个中心  
      22. centers = [[1,1],[-1,-1],[1,-1]]  
      23. clusters = len(centers)     #聚类数目为3  
      24. #产生3000组二维数据样本,三个中心点,标准差是0.7  
      25. X,Y = make_blobs(n_samples=300,centers=centers,cluster_std=0.7,random_state=28)  
      26.   
      27. #构建kmeans算法  
      28. k_means =  KMeans(init="k-means++",n_clusters=clusters,random_state=28)  
      29. t0 = time.time()  
      30. k_means.fit(X)      #模型训练  
      31. km_batch = time.time()-t0       #使用kmeans训练数据消耗的时间  
      32. print("K-Means算法模型训练消耗时间:%.4fs"%km_batch)  
      33.   
      34. #构建mini batch kmeans算法  
      35. batch_size = 100        #采样集的大小  
      36. mbk = MiniBatchKMeans(init="k-means++",n_clusters=clusters,batch_size=batch_size,random_state=28)  
      37. t0 = time.time()  
      38. mbk.fit(X)  
      39. mbk_batch = time.time()-t0  
      40. print("Mini Batch K-Means算法模型训练消耗时间:%.4fs"%mbk_batch)  
      41.   
      42. km_y_hat = k_means.labels_  
      43. mbkm_y_hat = mbk.labels_  
      44.   
      45. k_means_cluster_centers = k_means.cluster_centers_  
      46. mbk_means_cluster_centers = mbk.cluster_centers_  
      47. print ("K-Means算法聚类中心点: center=", k_means_cluster_centers)  
      48. print ("Mini Batch K-Means算法聚类中心点: center=", mbk_means_cluster_centers)  
      49. order = pairwise_distances_argmin(k_means_cluster_centers,  
      50.                                   mbk_means_cluster_centers)  
      51.   
      52. #效果评估  
      53. ### 效果评估  
      54. score_funcs = [  
      55.     metrics.adjusted_rand_score,    #ARI(调整兰德指数)  
      56.     metrics.v_measure_score,        #均一性与完整性的加权平均  
      57.     metrics.adjusted_mutual_info_score, #AMI(调整互信息)  
      58.     metrics.mutual_info_score,      #互信息  
      59. ]  
      60.   
      61. ## 2. 迭代对每个评估函数进行评估操作  
      62. for score_func in score_funcs:  
      63.     t0 = time.time()  
      64.     km_scores = score_func(Y, km_y_hat)  
      65.     print("K-Means算法:%s评估函数计算结果值:%.5f;计算消耗时间:%0.3fs" % (score_func.__name__, km_scores, time.time() - t0))  
      66.   
      67.     t0 = time.time()  
      68.     mbkm_scores = score_func(Y, mbkm_y_hat)  
      69.     print("Mini Batch K-Means算法:%s评估函数计算结果值:%.5f;计算消耗时间:%0.3fs " % (score_func.__name__, mbkm_scores, time.time() - t0))  
      70.   
      71. #运行结果:  
      72. K-Means算法模型训练消耗时间:0.6350s  
      73. Mini Batch K-Means算法模型训练消耗时间:0.0900s  
      74. K-Means算法聚类中心点:  
      75. center= [[ 0.96091862  1.13741775]  
      76.  [ 1.1979318  -1.02783007]  
      77.  [-0.98673669 -1.09398768]]  
      78. Mini Batch K-Means算法聚类中心点:  
      79. center= [[ 1.34304199 -1.01641075]  
      80.  [ 0.83760683  1.01229021]  
      81.  [-0.92702179 -1.08205992]]  
      82. K-Means算法:adjusted_rand_score评估函数计算结果值:0.72566;计算消耗时间:0.071s  
      83. Mini Batch K-Means算法:adjusted_rand_score评估函数计算结果值:0.69544;计算消耗时间:0.001s  
      84.   
      85. K-Means算法:v_measure_score评估函数计算结果值:0.67529;计算消耗时间:0.004s  
      86. Mini Batch K-Means算法:v_measure_score评估函数计算结果值:0.65055;计算消耗时间:0.004s  
      87.   
      88. K-Means算法:adjusted_mutual_info_score评估函数计算结果值:0.67263;计算消耗时间:0.006s  
      89. Mini Batch K-Means算法:adjusted_mutual_info_score评估函数计算结果值:0.64731;计算消耗时间:0.005s  
      90.   
      91. K-Means算法:mutual_info_score评估函数计算结果值:0.74116;计算消耗时间:0.002s  
      92. Mini Batch K-Means算法:mutual_info_score评估函数计算结果值:0.71351;计算消耗时间:0.001s  
  • 相关阅读:
    扑克牌顺子
    数组转 二叉树 ,并且输出二叉树的右视图
    数组中逆序对(归并排序思想)
    链表数字加和
    回文数字
    数组中 只出现一次的数
    判断是否有从根节点到叶子节点的节点值之和等于 sum
    双指针求 3个数和 为0的 数
    vue项目将css,js全部打包到html文件配置
    webpack4配置优化
  • 原文地址:https://www.cnblogs.com/mfryf/p/9007524.html
Copyright © 2011-2022 走看看