如何在N维数据集的取值范围内生成均匀分布、无重叠且避免聚集于边界的随机点?
问题:生成N×M数据集内均匀分布的随机点,避免聚集边界
现有实现与遇到的问题
我最初尝试直接基于数据集各维度的最小值和最大值作为上下限生成随机点,代码如下:
import numpy as np 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降维,在PCA空间取极值后逆变换回原空间,再生成随机点,代码如下:
import numpy as np 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
遗憾的是,这种方法依然没能解决问题,生成的点还是无法实现均匀分布。
期望目标
我需要生成的随机点满足:均匀分布、不聚集于边界且无重叠(示例中红色点为期望的分布位置)。
注:我的数据集维度为(46,2730)(46行、2730列),两张可视化图均为该数据集PCA降维后的结果。
我的思路与求助
我考虑过使用生成N球上均匀分布随机点的算法(相关问题的第2种解决方案),但有两个疑问:
- 如何计算N维数据集对应的半径(R)?
- 这种方法是否真的适用于我的场景?
恳请各位提供帮助。
内容的提问来源于stack exchange,提问作者Shihab Ullah
相关产品推荐
相关产品推荐

