python - 如何使用 Python 在一组点上绘制多边形(部分向内弯曲)边缘?

标签 python matplotlib machine-learning scikit-learn data-mining

我正在尝试在如下所示的 K-Means 集群上绘制多边形(凹面)边(图 1)。

enter image description here

在@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-')

enter image description here (图 2)

The scikit-learn doc似乎很鼓舞人心

问题是fig_1中箭头指向的边与fig_2中对应的不一样。

箭头指向的多边形边缘向内弯曲(感谢@dwilli)。

感谢@ImportanceOfBeingErnest 的提醒,scipy.spatial.ConvexHull 可能无法产生凹面。

有没有其他模块/包可以做到这一点(凹)?

如有任何提示,我们将不胜感激。

最佳答案

你的灵感展示的是维诺图。对于图中的任何坐标,颜色显示它将关联到哪个集群。

您在第一个图中显示的多边形是集群成员凸包的粗略近似值。您可以使用 scipy.spatial.ConvexHullcv2.convexHull()(来自 OpenCV)来计算它。前者的文档还给出了 example on how to plot it .

关于python - 如何使用 Python 在一组点上绘制多边形(部分向内弯曲)边缘?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56664353/

相关文章:

python - 将自定义错误栏添加到seaborn FacetGrid,确认色调和分类x顺序

machine-learning - "ValueError: When feeding symbolic tensors to a model, we expect the tensors to have a static batch size"是什么意思?

machine-learning - 查找两个短句子或文章之间语义相似性的最新方法(在概念级别)

python - 关于在 Python 中定义一个 setter

python - Sklearn AffinityPropagation 内存错误

python - 如何将应用程序设置保存在配置文件中?

python - turicreate 未知类型的图像分类器

python - 在 Windows 上运行 Python 脚本 (Tkinter)

python - 在同一个图表中绘制背景和标签-matplotlib

python - pyplot.scatter 改变轴的数据范围