在 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()
根据您的数据设置 xmin
、xmax
、ymin
和 ymax
。
这将输出以下内容:
尝试使用适合您需要的参数,我在 5 分钟内将其组合在一起,所以它不是很漂亮。
在上图中,我从两个不同的正态分布中采样了 1000 个点,并使用它们的均值((0, 0)
和 (10, 10)
)作为代表。
我有一组 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()
根据您的数据设置 xmin
、xmax
、ymin
和 ymax
。
这将输出以下内容:
尝试使用适合您需要的参数,我在 5 分钟内将其组合在一起,所以它不是很漂亮。
在上图中,我从两个不同的正态分布中采样了 1000 个点,并使用它们的均值((0, 0)
和 (10, 10)
)作为代表。