开始之前

各位朋友周末好,今天博主小码将开车≥Ö‿Ö≤为大家用代码实战讲解KMeans聚类,请大家坐稳了≡(▔﹏▔)≡。作为机器学习的十大经典算法之一,聚类的相关现实应用非常之广,如图像分割,文本分类、市场分割等,相关的干货知识请查阅相关资料,接下来小码直接带大家撸代码了。

前提准备

为了让各位乘客有良好的乘车体验,请准备如下:
Jupyter notebook
火狐浏览器或谷歌浏览器
win7或win10电脑一台
具备图像处理的知识如numpy,opencv等

啦啦啦!当然还有不怕吃苦的钻研精神。≧◠◡◠≦✌

需求分析

对我国某视频APP的小镇中国区潜在会员数分布用KMeans进行聚类,通过聚类结果知道会员的分布情况。先给大家看下最后的效果图:

本代码所需的图片我将通过网盘给大家
一、读取中国地图

import numpy as np
import cv2
import matplotlib.pyplot as plt
img_china = cv2.imread('../china.png')  #读取中国地图图片
plt.imshow(img_china,cmap="gray")   #对图像进行处理,并显示其格式
plt.xticks([]),plt.yticks([])      #去除x、y轴
plt.show()

【注】plt.imshow()函数负责对图像进行处理,并显示其格式,但是不能显示,其后跟着plt.show()才能显示出来。
效果:

二、特征提取过程
【注】用画图软件加入黑色散点(潜在会员数)(这个不需要大家做,已经用ps做好,保存在china_people.png),另存为china_people.png。

import numpy as np
import cv2
import matplotlib.pyplot as plt
img_china = cv2.imread('../china2thresh.png')    #读取上一步已经处理好的图片,这里无需看第一步的代码,第一步只是告诉如何处理图片,这里china2thresh.png就是第一步处理完成用于第二步的图片
img_china_people = cv2.imread('../china_people.png')  #读取用ps处理的会员分布散点图
img_people = img_china - img_china_people  #此处用到图像相减,两幅图像间对应像素的灰度值相减,用于目标检测
r_img_china = cv2.split(img_china)[0]     #图像颜色通道的分离,看不懂没关系,毕竟这不是重点
r_img_people = cv2.split(img_people)[2]
cv2.imwrite('../people.png',r_img_people)  #把处理后的img_people,存入people.png
print("中国大陆面积(像素数):",np.unique(r_img_china,return_counts = True)[1][1])   #获取中国地图像素大小
print("小镇中国区潜在会员数(像素数):",np.unique(r_img_people,return_counts = True)[1][1])  #获取小镇中国区潜在会员数像素大小
psw = []           #把三张图片img_china、img_china_people、img_people放入数组句柄中,当然我们最后需要的是img_people
psw.append(("china",img_china))
psw.append(("china + people",img_china_people))
psw.append(("people",img_people))
plot_number = len(psw)
cols = 3
rows = plot_number/cols + 1
for index in range(plot_number):plt.subplot(rows,cols,index + 1)plt.imshow(psw[index][1],cmap = "gray")plt.title(psw[index][0],fontsize =15 )plt.xticks([]),plt.yticks([])
plt.show()        #用for循环按要求打印出如下效果

【注】subplot(n,m,x)解释:建立一个mn的绘图区域,然后分别在其x=1,2,3,4,…区域绘制图像*

三、从people图中提取样本作为KMeans的训练集

print(r_img_people.shape)     #打印出people图的像素范围
X = np.argwhere(r_img_people)
print(X.shape)     #小镇中国区潜在会员数分布,样本数为78739,为二维数组
X[0:10]     #打印出前10个样本所在像素点位置

效果:

四、训练KMeans模型(重点)

from sklearn.cluster import KMeans    #从sklearn导入KMeans算法
import copy
k = 72                      #指定簇的数目,KMeans聚类需要预先指定要聚成多少类
y_KMeans = KMeans(n_clusters=k, random_state=9)    #KMeans函数调用、传参
y_pred = y_KMeans.fit_predict(X)                   #预测样本分别属于哪些类
print(y_pred)src_img_china = copy.deepcopy(img_china)
r_src_img_china = cv2.split(src_img_china)[0]
#根据索引赋值
for i in range(len(X)):index = X[i]src_img_china[index[0]][index[1]] = [y_pred[i]*(255/k), (255/3 + y_pred[i]*(255/k))%255, 255*2/3+(y_pred[i]*(255/k))]

【注】random_state的作用是控制随机状态,固定random_state为某个固定的值后,每次构建的模型都是相同的、生成的数据是相同的、每次拆分的结果也是相同的。可以把它理解为控制变量。
效果:


五、可视化结果

cv2.imwrite("../result.png",cv2.cvtColor(src_img_china , cv2.COLOR_RGB2BGR)) #颜色转换,了解即可
plt.imshow(src_img_china)
plt.xticks([]),plt.yticks([])
plt.show()
plt.scatter(X[:,1],X[:,0],c=y_pred)   #把预测的结果用散点图画出
plt.xticks([]),plt.yticks([])
ax = plt.gca()
ax.invert_yaxis()
plt.show()

效果:

六、输出结果

num_pix_china = np.unique(r_img_china, return_counts=True)[1][1]
print('中国大陆面积(像素数):', num_pix_china)
num_all_people = np.unique(r_img_people, return_counts=True)[1][1]
print('小镇中国区潜在会员数(像素数):', num_all_people)
print('每个簇的中心点坐标(像素坐标):', y_KMeans.cluster_centers_)
print('每个簇的潜在会员数(簇内像素数):',np.unique(y_pred, return_counts=True))#每个簇内到簇中心距离列表:
# print(X.shape)
# print(y_pred.shape)
dic_result_xy = {}
dic_result = {}
for i in range(y_pred.shape[0]):if y_pred[i] not in dic_result:dic_result_xy[y_pred[i]]=[]dic_result[y_pred[i]]=[]dic_result_xy[y_pred[i]].append(X[i])
#     print('jjjjjjjjj',i,X[i][0]-y_KMeans.cluster_centers_[y_pred[i]][0])
#     print('kkkkkkkkk',i,X[i][1]-y_KMeans.cluster_centers_[y_pred[i]][1])dic_result[y_pred[i]].append( np.sqrt( np.square(X[i][0]-y_KMeans.cluster_centers_[y_pred[i]][0])\+ np.square(X[i][1]-y_KMeans.cluster_centers_[y_pred[i]][1])))if i%5000 == 0:print('计算到第{}个循环'.format(i))
# print(dic_result_xy[0][:10])
# print(dic_result[0])#每个簇内到簇中心平均距离:
tmp = []
for i in range(k):tmp.append(np.mean(dic_result[i]))
print('每个簇簇内所有点到簇中心平均距离(像素距离):')
print(tmp)tmp = []
for i in range(k):tmp.append(np.median(dic_result[i]))
print('每个簇簇内所有点到簇中心中位数距离(像素距离):')
print(tmp)tmp = []
for i in range(k):tmp.append(max(dic_result[i]))
print('每个簇簇内所有点到簇中心最远距离(像素距离):')
print(tmp)
print(np.mean(tmp))actual_china = 9083674#纯陆地9,083,674平方千米
pix2km = np.sqrt(actual_china/num_pix_china)
print('最终:', np.mean(tmp)*pix2km,'km')

由于打印结果比较多,小码就不把打印结果截图贴上来了,还请大家动手实践,有问题可找我交流,谢谢大家!
【附】:百度网盘图片链接
提取码:4wc4

Python——KMeans(k均值聚类)实战(附详细代码与注解)相关推荐

  1. Python——EM(期望极大算法)实战(附详细代码与注解)(二)

    开始之前 各位朋友,大家好!针对上回讲的EM算法,有朋友反馈还是没弄清楚,今天,我再来详细的讲一下EM算法.请耐心食用本教程,滴滴滴~,上车! 前提准备 Jupyter notebook 或 Pych ...

  2. Python——EM(期望极大算法)实战(附详细代码与注解)(一)

    开始之前 各位朋友大家好!今天我将带大家撸EM算法代码,在撸之前(呵呵,可别乱想≧◔◡◔≦),我们首先讲清楚什么是EM算法?为什么要用EM算法?.在这里我简要的介绍一下,大家都知道极大似然估计吧(至少 ...

  3. Python——KNN实战(附详细代码与注解)

    估计各位绅士都看过我之前的KNN算法博文(嘿嘿≧◔◡◔≦,假装大家都看过),应广大博客朋友们的要求,本次博主来开车讲解如何做一个KNN分类器实现将iris数据集进行分类.关于KNN的相关知识请看机器学 ...

  4. 基于Python的k均值聚类不同规格的商品名

    基于Python的k均值聚类不同规格的商品名 前言 聚类的目标是使得同一簇内的点之间的距离较短,而不同簇中点之间的距离较大.以此来区分不同的群体. 本篇讲述使用k均值算法对超市购物记录集中的商品名称进 ...

  5. Kmeans K均值聚类,OpenCV实现

    Clustering 聚类 kmeans  k均值聚类 Finds centers of clusters and groups input samples around the clusters. ...

  6. Python Kmeans K均值分类

    Python Kmeans K均值分类 1 声明 本文的数据来自网络,部分代码也有所参照,这里做了注释和延伸,旨在技术交流,如有冒犯之处请联系博主及时处理. 2 Kmeans简介 相关概念见下: Km ...

  7. 聚类分析 | MATLAB实现k-Means(k均值聚类)分析

    目录 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k-均值聚类简介 相关描述 程序设计 学习小结 参考资料 致谢 聚类分析 | MATLAB实现k-Means(k均值聚类)分析 k ...

  8. K-Means(K均值聚类)原理及代码实现

    机器学习 没有免费午餐定理和三大机器学习任务 如何对模型进行评估 K-Means(K均值聚类)原理及代码实现 KNN(K最近邻算法)原理及代码实现 KMeans和KNN的联合演习 文章目录 机器学习 ...

  9. python实现k均值聚类(kMeans)基于numpy

    1.k均值聚类简介 k均值聚类是一种无监督学习方法,当数据量小,数据维度低时,具有简单.快速.方便的优点,但是当数据量较大时,其速度较慢,也容易陷入局部最优. 2. 步骤 和以前一样,kMeans聚类 ...

最新文章

  1. vue+elementui项目打包后样式变化问题
  2. bank holiday in uk 2020
  3. boost::math模块使用 agm 以高精度计算 lemniscate 常量
  4. ORA-29786: SIHA attribute GET failed with error
  5. eclipse折叠if语句块_Python学习日志01判断 if 语句
  6. java 反射 内存_Java 反射
  7. SQL Server 2000中的完整备份、差异备份操作
  8. JavaScript:异常处理
  9. sid图像数据_【技术前沿】首届“水下机器人目标抓取大赛”第一名的图像增强方法...
  10. 禁用微信浏览器的下拉_解决微信浏览器禁止下拉查看真实域名网址的问题
  11. 【数据库】MySQL单表查询
  12. java8中lambda的用法(map转list,list转map等等)
  13. oracle补丁冲突解决方法,【学习笔记】Oracle RAC升级安装patch补丁的问题和解决办法...
  14. 机器学习笔记--模型评估之一:准确率与召回率,平均根误差(RMSE、平均绝对百分比误差(MAPE)
  15. 小米9开发版已开启Android,小米9 MIUI安卓10开发版已开始推送,建议大家不要去升级...
  16. 用iLO在惠普服务器安装exsi6.5
  17. 姿态估计目标检测论文整理(1)
  18. OpenDDS有问必答
  19. python空间数据处理_基于Python的空间数据批量处理方法
  20. android 机器人绘制,画个android机器人

热门文章

  1. HDU 3037 Saving Beans [Lucas定理]
  2. 【汇编语言与计算机系统结构笔记09】程序栈,(x86-32)过程调用,栈帧,寄存器使用惯例
  3. 【数据结构笔记28】C实现:图练习-选择最长路径最短的节点
  4. Windows系统单网卡配置双IP双网关
  5. java解析excelpoi_Java解析Excel之POI(一)
  6. 关于pad、智能手机功能增进的设想
  7. 无法通过ip地址连接其它电脑的数据库,但是又可以ping通,错的不是配置,而是差了一个步骤
  8. java 对象深拷贝_java深入理解浅拷贝和深拷贝
  9. PyQt5学习--基本窗口控件--加载文件-QFileDialog
  10. linux 命令大全_linux命令大全