首页 > 解决方案 > 如何在低范围和高范围之间的 N 维空间或数据集中均匀均匀地生成不重叠的随机点

问题描述

我试图根据每个 M 的最小值作为低范围和每个 M 的最大值作为高范围在 NxM 数据集上找到随机点。

这是代码:

def generate_random_points(dataset, dimension_based=False):
    dimension = dataset.shape[1]
    if dimension_based == False:
        row_size = np.floor((np.sqrt(dimension))).astype(int) if np.floor(np.sqrt(dimension)).astype(int) < np.floor(np.sqrt(dataset.shape[0])).astype(int) else np.floor((np.sqrt(dataset.shape[0]))).astype(int) 
        generated_spikes = np.random.uniform(low=np.min(dataset, axis=0),
                                             high=np.max(dataset, axis=0),
                                             size=(row_size, dimension))
        return generated_spikes
    else:
        row_size = np.floor((np.sqrt(dimension))).astype(int)
        generated_spikes = np.random.uniform(low=np.min(dataset, axis=0),
                                             high=np.max(dataset, axis=0),
                                             size=(row_size, dimension))
        return generated_spikes

但问题是大多数随机点位于数据集空间的边界或边缘,而不是均匀分布

这是一个例子的图: 随机点是黑色的

我也尝试过做 PCA,然后通过对范围做 inverse_transform 来应用高低范围,但有点预期,随机点分布不均匀

def generate_random_points(dataset,dimension_based= False):
    dimension = dataset.shape[1]
    dimension_pca = dataset.shape[0] if dataset.shape[0] < dataset.shape[1] else dataset.shape[1]
    pca, dataset_pca = perform_PCA(dimension_pca, dataset)
    low_pca = np.min(dataset_pca, axis=0)
    high_pca = np.max(dataset_pca, axis=0)
    low = perform_PCA_inverse(pca, low_pca)
    high = perform_PCA_inverse(pca, high_pca)
    if dimension_based == False:
        row_size = np.floor((np.sqrt(dimension))).astype(int) if np.floor(np.sqrt(dimension)).astype(int) < np.floor(np.sqrt(dataset.shape[0])).astype(int) else np.floor((np.sqrt(dataset.shape[0]))).astype(int) 
        generated_spikes = np.random.uniform(low=low,
                                             high=high,
                                             size=(row_size, dimension))
        return generated_spikes
    else:
        row_size = np.floor((np.sqrt(dimension))).astype(int)
        generated_spikes = np.random.uniform(low=np.min(dataset, axis=0),
                                             high=np.max(dataset, axis=0),
                                             size=(row_size, dimension))
        return generated_spikes

如何解决这个问题,使随机生成的点分布更均匀,而不是堆积在两条边上,也不重叠?

我需要这样:

红色的是交叉的黑点所需的位置

PS:

  1. 这两个图像都是形状为 (46,2730) 的数据集的 PCA 表示,即 46 行和 2730 维

  2. 我正在考虑使用这个问题的第二个答案:用于在 N 球上生成均匀分布的随机点的算法 但我不确定如何计算 N 维数据集的半径(R),或者即使它有意义所以我可以在上面的链接上使用第二个答案。

请帮忙!

标签: pythonnumpyrandomuniform-distributionn-dimensional

解决方案


为了更好地理解问题并就问题的可能原因提供一些提示,我发布了这条无法放入评论的消息。

描述

让我用我自己的话来解释您的问题,并请纠正我或您的答案,以使您的情况更清楚。

在M维空间中,您有N_1N_2个点。也许您在每组中的点通常分布在M维空间中,例如,如果您使用make_blobs创建它。然后,您确定集合N_1中每个点的每个维度x_i的最小值x_{i,min,1}和最大值x_{i,max,1}然后,您在M维空间中生成随机点,该点位于M维矩形范围内

[x_{1,min,1},x_{1,max,1}] x [x_{2,min,1},x_{2,max,1}] x ... x [x_{M,min ,1},x_{M,max,1}]

然后应用 PCA 并绘制 2 个主成分。您的观察是,您的随机点在数据所在的范围内并非均匀分布。

2D 中的说明和示例

如果您的数据遵循M维正态分布(在此示例中,M = 2),则最小值和最大值可能比标准偏差大几倍。当您在最小值和最大值内生成随机点时,您的随机点将均匀地代表您几乎没有数据点的范围。以下面为例。它生成 10'000 个二维正态分布的数据点,然后在围绕数据点绘制的矩形中生成另外 5 个均匀分布的点。

import matplotlib.pyplot as plt
import numpy as np

np.random.seed(3)
x_data = np.random.normal(size=10000)
x_min = x_data.min()
x_max = x_data.max()

y_data = np.random.normal(size=10000)
y_min = y_data.min()
y_max = y_data.max()

random_x = np.random.uniform(x_min, x_max, size=5)
random_y = np.random.uniform(y_min, y_max, size=5)

fig, ax = plt.subplots()
ax.plot(x_data[:10000], y_data[:10000], "o",
        label="data points with normal distribution")
ax.plot(random_x, random_y, "o", label="random points with uniform distribution")
ax.legend()
plt.show()

代码的输出如下所示:

生成的数据和随机点。

尽管随机点是均匀分布的,但人们可能认为它们仅位于分布的边缘。从某种角度来看,更高维度的情况只会变得更糟。想象一下单位M维球体和立方体。球体体积与立方体体积之比趋于0,这意味着如果您在单位立方体中生成随机点,而您的数据(主要)位于单位球体内,那么您的随机点的比率数据点区域之外的区域趋向于 1。但是,如果您只是使用 PCA 删除额外的维度,您将无法在 2D 图中完全看到这一点。

建议

如果我正确理解了您的问题并且问题只是一种错觉,请相应地改写您的问题,以便其他人可以解决您的具体要求。

如果您希望随机点更好地反映数据的分布特性,则需要在数据上建立模型,例如,它是正态分布的数据。识别均值和标准差,并使用具有该属性的分布生成随机点。

进一步的问题

  • 您能否显示更多数据点?
  • 您有 2 个数据集是否相关?
  • 我没看懂这里的图:

    红色的是交叉的黑点所需的位置”您能否重新绘制您的图形,提供更多示例并改写图例?


推荐阅读