python - 如何在低范围和高范围之间的 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:
这两个图像都是形状为 (46,2730) 的数据集的 PCA 表示,即 46 行和 2730 维
我正在考虑使用这个问题的第二个答案:用于在 N 球上生成均匀分布的随机点的算法 但我不确定如何计算 N 维数据集的半径(R),或者即使它有意义所以我可以在上面的链接上使用第二个答案。
请帮忙!
解决方案
为了更好地理解问题并就问题的可能原因提供一些提示,我发布了这条无法放入评论的消息。
描述
让我用我自己的话来解释您的问题,并请纠正我或您的答案,以使您的情况更清楚。
在M维空间中,您有N_1和N_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 个数据集是否相关?
- 我没看懂这里的图:
红色的是交叉的黑点所需的位置”您能否重新绘制您的图形,提供更多示例并改写图例?
推荐阅读
- javascript - 如何优化此同步“模糊搜索”功能并将其转换为异步功能?
- python - 如何有效地找到二维矩阵中多个元素的行索引?
- python - 如何从 main() 返回变量?
- reactive-programming - 你可以合并两个 Flux 而不阻塞,使得结果只包含唯一的元素吗?
- android - Flutter JSON 无法正确读取
- php - 更改产品 Prestashop 的每个变体的包装尺寸
- xpath - xpath 无法识别标记的谓词
- python - 使用动态 ID 从 Python 代码访问 kivy 小部件
- sql - SQL Server - 在 WHERE 子句中使用组合列
- json - 在 Scala 中解析对 jsonarray 的请求