matplotlib 如何进行动态聚类

0kjbasz6  于 2023-10-24  发布在  其他
关注(0)|答案(1)|浏览(112)

我有一个表示动态图像数据的嵌套列表,每个内部列表包含一个数字和一个边界框的x中心坐标。我需要聚类并通过排序获得近似的边界框x坐标。预期输出为[[100,1] ,[120,1],[151,3],[180,0]]
我已经使用Matplotlib可视化了这些数据,以深入了解其在空间中的分布。现在,我希望对这些数据执行聚类,近似坐标,并根据x中心值对其进行排序。为了帮助您更好地理解,我将提供代码和图。

import matplotlib.pyplot as plt
data = [
    [[100, 1], [120, 1], [150, 3]],
    [[101, 1], [119, 1], [151, 3]],
    [[102, 1], [123, 1], [150, 3], [180, 0]],
    [[103, 1], [154, 3], [180, 0]],
    [[103, 1], [152, 3], [181, 0]],
    [[101, 1], [120, 1], [180, 0]],
    [[101, 1], [120, 1], [150, 3]],
    [[101, 1], [119, 1], [150, 3]],
    [[102, 1], [123, 1], [150, 3], [181, 0]],
    [[103, 1], [153, 3], [181, 0]],
    [[103, 1], [152, 3], [181, 0]],
    [[101, 1], [120, 1], [180, 0]],
    [[100, 1], [122, 1], [150, 3], [181, 0]],
    # Add more data here
]

x_values = []
y_values = []

for sublist in data:
    for subsublist in sublist:
        x_values.append(subsublist[0])
        y_values.append(subsublist[1])

print("X Values:", x_values)
print("Y Values:", y_values)

plt.scatter(x_values, y_values)
plt.xlabel('X Values')
plt.ylabel('Y Values')
plt.title('Scatter Plot of X and Y Values')
plt.grid(True)
plt.show()
noj0wjuj

noj0wjuj1#

你可以使用DBSCAN聚类算法来实现这一点。下面是代码和结果:

import matplotlib.pyplot as plt
import numpy as np
from sklearn.cluster import DBSCAN

data = [
    [[100, 1], [120, 1], [150, 3]],
    [[101, 1], [119, 1], [151, 3]],
    [[102, 1], [123, 1], [150, 3], [180, 0]],
    [[103, 1], [154, 3], [180, 0]],
    [[103, 1], [152, 3], [181, 0]],
    [[101, 1], [120, 1], [180, 0]],
    [[101, 1], [120, 1], [150, 3]],
    [[101, 1], [119, 1], [150, 3]],
    [[102, 1], [123, 1], [150, 3], [181, 0]],
    [[103, 1], [153, 3], [181, 0]],
    [[103, 1], [152, 3], [181, 0]],
    [[101, 1], [120, 1], [180, 0]],
    [[100, 1], [122, 1], [150, 3], [181, 0]],
    # Add more data here
]

x_values = []
y_values = []

for sublist in data:
    for subsublist in sublist:
        x_values.append(subsublist[0])
        y_values.append(subsublist[1])

X = np.array(list(zip(x_values, y_values)))
clustering = DBSCAN(eps=10, min_samples=2).fit(X)
centroids = []
for label in np.unique(clustering.labels_):
    cluster_values = X[clustering.labels_ == label]
    # Could also use median here
    centroid = np.mean(cluster_values, axis=0)
    print(centroid)
    centroids.append(centroid)

centroids = np.array(centroids)

plt.scatter(X[:, 0], X[:, 1])
plt.scatter(centroids[:, 0], centroids[:, 1], s=1000, facecolors="none", edgecolors="r")
plt.show()

相关问题