在 python 中以低维表示绘制距离等高线

Draw distance contours in low dimension representation in python

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

你的问题有一个歧义:如果你将 n 维数据投影到 2 维流形上,那么每个二维点将对应 多个 到聚类中心的距离 不同 的原始点。

因此,要在每个 2D 点中具有唯一的距离值,您必须仅使用 2D 网格和其中的简单欧氏距离。它将尽可能接近原始距离,因为 T-SNE 试图做到这一点。

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

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))作为代表。