如何使用Python生成维度灾难效应的可视化图表
你当前的代码逻辑是给两个固定点不断追加维度计算绝对欧氏距离,该数值本身就会随维度升高自然增长,完全不符合维度灾难的演示逻辑。以下是对应问题的解决方案:
1. 维度灾难的计算指标选择
维度灾难在距离维度的核心表现是高维空间中所有点对的距离趋同,我们通常用同一维度下所有点对的最近邻距离除以最远邻距离作为核心指标,随着维度升高,该比值会无限趋近于1,这也是你参考预期图的绘制依据。
2. 2-30维、每维度100个随机点的实现逻辑
每个维度需要独立生成100个随机点,计算该维度下所有点对的距离后再得到比值,具体实现代码如下:
首先导入依赖库:
import numpy as np import matplotlib.pyplot as plt %matplotlib inline
核心计算与绘图逻辑:
# 固定参数配置 MIN_DIM = 2 MAX_DIM = 30 POINT_COUNT_PER_DIM = 100 VALUE_RANGE = (0, 100) ratio_result = [] for dim in range(MIN_DIM, MAX_DIM + 1): # 生成当前维度的100个随机点,形状为 [点数量, 维度数] points = np.random.randint(VALUE_RANGE[0], VALUE_RANGE[1] + 1, size=(POINT_COUNT_PER_DIM, dim)) # 向量化计算所有点对的欧氏距离矩阵 dist_matrix = np.linalg.norm(points[:, np.newaxis] - points, axis=2) # 过滤掉自己和自己计算得到的0值 valid_dists = dist_matrix[dist_matrix != 0] # 计算最近邻/最远邻的比值 min_dist = valid_dists.min() max_dist = valid_dists.max() ratio_result.append(min_dist / max_dist) # 绘制结果曲线 plt.plot(range(MIN_DIM, MAX_DIM + 1), ratio_result) plt.xlabel('Number of dimensions') plt.ylabel('Ratio of nearest / farthest distance') plt.title('Curse of Dimensionality Demo') plt.show()
代码说明
- 所有随机点取值范围和你原有逻辑保持0-100整数一致,可根据需要调整
- 用numpy广播机制计算距离矩阵,避免手写嵌套循环,性能更高
- 过滤掉了距离矩阵中自己和自己计算得到的0值,避免最小距离恒为0的问题
- 运行后输出的曲线即为你预期的随维度升高逐渐趋近于1的上升曲线
内容的提问来源于stack exchange,提问作者ShridharK
相关产品推荐
相关产品推荐

