我正在尝试在如下所示的 K-Means 集群上绘制多边形(凹面)边(图 1)。
在@ypnos 的帮助下,这段代码绘制了除边缘之外的所有内容。
df = pd.read_csv('https://raw.githubusercontent.com/MachineIntellect/dataset.ml/master/watermelon/watermelon_4_0.csv')
X = df.iloc[:,1:].to_numpy()
m0 = X[5]
m1 = X[11]
m2 = X[23]
centroids = np.array([m0, m1, m2])
labels = pairwise_distances_argmin(X, centroids)
m0 = X[labels == 0].mean(0)
m1 = X[labels == 1].mean(0)
m2 = X[labels == 2].mean(0)
new_centroids = np.array([m0, m1, m2])
plt.xlim(0.1,0.9)
plt.ylim(0, 0.8)
plt.scatter(X[:,0], X[:,1])
plt.scatter(new_centroids[:,0], new_centroids[:,1], c='r', marker = '+')
for i in range(3):
points = X[labels == i]
hull = ConvexHull(points)
for simplex in hull.simplices:
plt.plot(points[simplex, 0], points[simplex, 1], 'r-')
The scikit-learn doc似乎很鼓舞人心
问题是fig_1中箭头指向的边与fig_2中对应的不一样。
箭头指向的多边形边缘向内弯曲(感谢@dwilli)。
感谢@ImportanceOfBeingErnest 的提醒,scipy.spatial.ConvexHull
可能无法产生凹面。
有没有其他模块/包可以做到这一点(凹)?
如有任何提示,我们将不胜感激。
最佳答案
你的灵感展示的是维诺图。对于图中的任何坐标,颜色显示它将关联到哪个集群。
您在第一个图中显示的多边形是集群成员凸包的粗略近似值。您可以使用 scipy.spatial.ConvexHull
或 cv2.convexHull()
(来自 OpenCV)来计算它。前者的文档还给出了 example on how to plot it .
关于python - 如何使用 Python 在一组点上绘制多边形(部分向内弯曲)边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56664353/