使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点

news/2024/9/20 14:31:22

使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点

    • 1. 效果图
    • 2. 源码
      • 2.1 原始数据——xq.txt
      • 2.2 源码
    • 参考

这篇博客将演示如何使用KMeansCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小区域的点。
写这篇博客源于博友的提问:期望能解决疫情防控应急服务点选址问题。
在这里插入图片描述

1. 效果图

聚类1效果图如下:
29个小区分别对应29个点,方形对应中心点,三角对应距离中心最近的小区,五角星对应距离中心最远的小区
在这里插入图片描述
聚类2效果图如下:
可以看到29个小区聚类为 蓝色圆点、绿色圆点2类。
其中蓝色三角、蓝色方形、蓝色五角星分别对应蓝色聚类的最小、中心、最大小区。
其中绿色三角、绿色方形、绿色五角星分别对应绿色聚类的最小、中心、最大小区。

在这里插入图片描述
聚类3效果图如下:
可以看到29个小区聚类为 蓝色圆点、绿色圆点、红色圆点3类。
其中蓝色三角、蓝色方形、蓝色五角星分别对应蓝色聚类的最小、中心、最大小区。
其中绿色三角、绿色方形、绿色五角星分别对应绿色聚类的最小、中心、最大小区。
其中红色三角、红色方形、红色五角星分别对应红色聚类的最小、中心、最大小区。
在这里插入图片描述在这里插入图片描述

2. 源码

2.1 原始数据——xq.txt

1 2.00 43.01 11 10.41 41.62 21 23.39 25.23
2 2.42 7.78 12 12.72 29.17 22 23.78 20.60
3 3.34 10.05 13 13.10 16.43 23 25.17 15.81
4 3.98 12.94 14 14.63 27.27 24 26.14 17.61
5 6.12 30.66 15 15.50 24.44 25 27.40 38.08
6 6.70 18.28 16 16.59 40.15 26 29.23 26.11
7 7.17 11.96 17 17.74 35.00 27 30.47 19.66
8 7.80 32.16 18 19.04 5.86 28 31.66 36.94
9 9.03 6.38 19 20.50 44.76 29 31.92 43.53
10 9.81 22.35 20 21.18 30.12

2.2 源码

# 根据Kmeans聚类,并绘制中心点、最近点、最远点
import cv2
from pylab import *# 读取原始数据
def get_points():with open("maps/xq.txt", "r") as f:  # 打开文件str = f.read()  # 读取文件str = str.replace("\n", " ")strs = np.array(str.split(" "))data = np.array([float(x) for x in strs]).reshape(29, 3)# 根据第1列排序(保证小区是从1~29)data = data[data[:, 0].argsort()]return data# 计算俩点之间的值(此处没有考虑地球🌏是球体)
def get_distance(pt1, pt2):return math.sqrt(math.pow(pt1[0] - pt2[0], 2) + math.pow(pt1[1] - pt2[1], 2))# 获取最近、最远距离的小区(最近的小区绘制三角形,最远的小区绘制五角星)
# center:中心点
# data: 聚类数据
# color:颜色
def get_most_distance(center, data, color, flag=False):dis = []for i in data:dis.append(get_distance(center, [i[0], i[1]]))# print(dis)# print("min: ", min(dis), dis.index(min(dis)), data[dis.index(min(dis))])# print("max: ", max(dis), dis.index(max(dis)), data[dis.index(max(dis))])minIndex = dis.index(min(dis))maxIndex = dis.index(max(dis))# print(data[minIndex, 0], data[minIndex, 1])# print(data[maxIndex, 0], data[maxIndex, 1])plt.scatter(data[minIndex, 0], data[minIndex, 1], s=120, c=color, marker='^')plt.scatter(data[maxIndex, 0], data[maxIndex, 1], s=120, c=color, marker='*')if flag:return dis.index(min(dis)) + 1return dis.index(max(dis)) + 1# 对原始数据进行聚类,聚成 n 类,默认只聚类1堆
def k_means_cluster(data, n=1):Z = data[:, 1:]  # 获取小区坐标数据,第一列是小区,第2列横坐标,第3列纵坐标# 转换为 np.float32Z = np.float32(Z)# 定义终止准则以及应用KMeans聚类criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)ret, label, centers = cv2.kmeans(Z, n, None, criteria, 10, cv2.KMEANS_RANDOM_CENTERS)print('Kmeanscluster (', n, ') —— center: ', centers)# 解决中文问题mpl.rcParams['font.sans-serif'] = ['SimHei']mpl.rcParams['axes.unicode_minus'] = False# ‘b’ blue 蓝色# ‘g’ green 绿色# ‘r’ red 红色# ‘c’ cyan 兰青色# ‘m’ magenta 紫色# ‘y’ yellow 黄色# ‘k’ black 黑色# ‘w’ white 白色# n类,构建n个颜色color_arr = np.array(['b', 'g', 'r', 'c', 'm', 'y', 'k', 'w'])colors = color_arr[:n]# 给每个点添加小区编码for x, y, zone in zip(data[:, 1], data[:, 2], data[:, 0]):  # zip函数将x,y,小区数据一一对应,配对组合plt.text(x, y + 1, '%s' % int(zone), ha='center', va='bottom', fontdict={'color': 'black','weight': 'bold','size': 12})  # 增加标签# 根据聚类label遍历数据,及绘制数据# 绘制分类点为圆形,中心点为方形,最小距离小区为三角,最大距离小区为五角星for i, (color, center) in enumerate(zip(colors, centers)):A = Z[label.ravel() == i]# print('cluster ', i, ' : ', len(A), ' ', A)print('cluster ', i, ' : ', len(A))# 绘制数据plt.scatter(A[:, 0], A[:, 1], c=color)# 绘制中心点及其上的中心点文本plt.scatter(center[0], center[1], s=120, c=color, marker='s')plt.text(x=center[0], y=center[1] + 2, s='中心点', ha='center', va='baseline', fontdict={'color': 'black','weight': 'bold','size': 12})  # 中心点上方文字# 获取距离最大小区、最小小区,并绘制最大值三角,最小值五角星get_most_distance(center, A, color, plt)plt.xlabel('x'), plt.ylabel('y')plt.title("emergency service location KMeanCluster" + str(n) + " res")plt.show()data = get_points()
# 分别聚类1,2,3
k_means_cluster(data, 1)
k_means_cluster(data, 2)
k_means_cluster(data, 3)

参考

  • KMeansCluster可参考
  • Matplot绘图文字及颜色可参考

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pgtn.cn/news/17765.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈,一经查实,立即删除!

相关文章

PyTorch框架:(2)使用PyTorch框架构建神经网络模型---气温预测

目录 第一步:数据导入 第二步:将时间转换成标准格式(比如datatime格式) 第三步: 展示数据:(画了4个子图) 第四步:做独热编码 第五步:指定输入与输出 第六步:对数据做一…

使用Python,OpenCV进行Tesseract-OCR绑定及识别

使用Python,OpenCV进行Tesseract-OCR绑定及识别1. 效果图2. 安装TesseractPython“绑定”及识别3. 源码参考上一篇博客介绍了Windows上Tesseract-OCR的安装,并使用命令行参数进行了OCR数字和字母的识别。这一篇将介绍如何使用Python应用Tesseract-OCR绑定…

PyTorch框架:(3)使用PyTorch框架构构建神经网络分类任务

目录 0、背景 1、分类任务介绍: 2、网络架构 3、手写网络 3.1、读取数据集 3.2、查看数据集 3.3将x和y转换成tensor的格式 3.4、定义model 0、背景 其实分类和回归本质上没有太大区别,只是说最终得到的结果是不同的,以及使用的损失函数…

PyTorch框架:(4)如何去构建数据

接PyTorch框架:(3) 1、最基本的方法 (1)使用模块 模块1:TensorDataset、模块2:DataLoader 自己去构造数据集,然后一个batch一个batch的取数据,自己去写构造数据太麻烦…

使用Python,OpenCV进行银行支票数字和符号的OCR

使用Python,OpenCV进行银行支票数字和符号的OCR(第一部分)1. 效果图2. 原理2.1 MICR E-13B字体2.2 从MICR E-13B参考图像中提取数字和符号3. 源码3.1 MICR E-13B符号和数字提取3.2 银行支票数字和符号OCR参考上一篇介绍了:使用Pyh…

Jquery php 点击td变成input,修改后失去焦点发送数据

html部分 <Td><?php echo $row[bigclassid]?></Td> <td height"25" width"241" class"bigclassname"><?php echo $row[bigclassname]?></a></td> Js部分 <script> /**//* * 说明&#xff1…

PyTorch框架:(5)使用PyTorch框架构建卷积神经网络

基于pytorch构建一个非常简单的卷积神经网络&#xff0c;以Mnist数据集为例演示基本的流程 1、导工具包 2、读取数据 &#xff08;把该写的超参数全部写出来&#xff09; PS&#xff1a;当前输入图像的大小&#xff0c;注意这里使用卷积网络处理Mnist数据他就不是一个一个像素…

使用Python,OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制

使用Python&#xff0c;OpenCV进行基本的图像处理——提取红色圆圈轮廓并绘制1. 效果图1.1 形态学图像处理效果图1.2 转换HSV色彩空间提取2. 源码2.1 形态学图像处理提取源码2.2 转换HSV色彩空间提取源码写这篇博客源于博友的提问&#xff0c;想提取图片中的红色圆圈坐标&#…