机器学习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算法聚类中心点:\n center=",k_means_cluster_center)  
  49. print("Mini Batch K-Means算法聚类中心点:\n 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算法聚类中心点:\ncenter=", k_means_cluster_centers)  
    48. print ("Mini Batch K-Means算法聚类中心点:\ncenter=", 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\n" % (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  

猜你喜欢

转载自www.cnblogs.com/mfryf/p/9007524.html