在python中以低维表示绘制距离轮廓

Posted

技术标签:

【中文标题】在python中以低维表示绘制距离轮廓【英文标题】:Draw distance contours in low dimension representation in python 【发布时间】:2018-06-28 05:08:44 【问题描述】:

我有一组n_samples 数据点。每个数据点都有n_features(数百或数千个特征)。我使用 K-Means 聚类和欧几里得距离将点聚类到n_clusters。然后我使用 TSNE 将我的高维输入数据X(即n_samples x n_features)转换为X_low_dim(即n_samples x 2),以二维可视化数据。你知道在 Python 中从集群中心绘制距离等高线的简单方法吗?

【问题讨论】:

您没有得到答案的原因可能是问题太宽泛而且不清楚。对其开放赏金,不会改变这一点。阅读How to Ask,写出清晰的问题描述。 【参考方案1】:

我不知道我是误解了这个问题还是其他人误解了这个问题,但如果我理解正确,您想绘制以集群代表的投影为中心的等高线图。 您可以查看 here 以了解等高线图的一般方法,但是从该代码中几乎逐字逐句地执行以下操作:

import numpy as np
import matplotlib.pyplot as plt
from matplotlib import cm 
import scipy.stats as st

def contour_cloud(x, y, cmap):
    xmin, xmax = -10, 10
    ymin, ymax = -10, 10

    xx, yy = np.mgrid[xmin:xmax:100j, ymin:ymax:100j]
    positions = np.vstack([xx.ravel(), yy.ravel()])
    values = np.vstack([x, y])
    kernel = st.gaussian_kde(values)
    f = np.reshape(kernel(positions).T, xx.shape)

    plt.contourf(xx, yy, f, cmap=cmap, alpha=0.5)

# Assuming to have 2 clusters, split the points into two subsets
representative_1 = ...  # Shape (2, )
cluster_1 = ...         # Shape (n_points_cl_1, 2)
representative_2 = ...  # Shape (2, )
cluster_2 = ...         # Shape (n_points_cl_2, 2)

plt.scatter(x=representative_1[0], y=representative_1[1], c='b')
plt.scatter(x=representative_2[0], y=representative_2[1], c='r')

contour_cloud(x=cluster_1[:, 0], y=cluster_1[:, 1], cmap=cm.Blues)
contour_cloud(x=cluster_2[:, 0], y=cluster_2[:, 1], cmap=cm.Reds)

plt.show()

根据您的数据设置xminxmaxyminymax

这将输出以下内容:

尝试使用适合您需要的参数,我在 5 分钟内将其拼凑在一起,所以它不是很漂亮。 在上图中,我从两个不同的正态分布中抽取了 1000 个点,并使用它们的均值((0, 0)(10, 10))作为代表。

【讨论】:

【参考方案2】:

您的问题存在歧义:如果您将n 维数据投影到2 维流形上,则每个二维点将对应于 多个 原始点和 到聚类中心的距离不同

因此,要在每个 2D 点中获得唯一的距离值,您只需在其中使用 2D 网格和简单的欧几里得距离。它将尽可能与原始距离相似,因为 T-SNE 试图做到这一点。

【讨论】:

以上是关于在python中以低维表示绘制距离轮廓的主要内容,如果未能解决你的问题,请参考以下文章

Python OpenCV:在特定轮廓内绘制外部轮廓

在python中绘制轮廓

python-opencv轮廓基本绘制

Opencv和python获取文档正确的轮廓并在图像上绘制

python 获取,缩放和绘制轮廓的中心

python --opencv图像处理轮廓(寻找轮廓绘制轮廓)详解