我试图根据每个 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),或者即使它有意义所以我可以在上面的链接上使用第二个答案。
请帮忙!