日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人文社科 > 生活经验 >内容正文

生活经验

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

發布時間:2023/11/27 生活经验 46 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

使用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繪圖文字及顏色可參考

總結

以上是生活随笔為你收集整理的使用KMeanCluster对多个区域进行聚类,并结合Matplotlib绘制中心点、最大最小距离点的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。