如何进行动态聚类

问题描述 投票:0回答:1

我有一个表示动态图像数据的嵌套列表,每个内部列表都包含一个数字和边界框的 x 中心坐标。我需要进行聚类并通过排序获得近似边界框 x 坐标 inetger 值。 预期输出是

[[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()
python list matplotlib cluster-analysis dynamic-list
1个回答
0
投票

您可以使用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()

© www.soinside.com 2019 - 2024. All rights reserved.