机器学习sklearn19.0聚类算法——Kmeans算法

Posted 知识天地

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习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  

以上是关于机器学习sklearn19.0聚类算法——Kmeans算法的主要内容,如果未能解决你的问题,请参考以下文章

机器学习 sklearn 无监督学习 聚类算法 DBSCAN

机器学习 sklearn 无监督学习 聚类算法 DBSCAN

sklearn聚类算法用于图片压缩与图片颜色直方图分类

机器学习 sklearn 无监督学习 聚类算法 K-means

机器学习---聚类算法

Sklearn机器学习基础(day02基础入门篇)