我有一个表示动态图像数据的嵌套列表,每个内部列表都包含一个数字和边界框的 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()
您可以使用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()