想象一下单位立方体。所有训练数据都在这个立方体内均匀采样,即,我们正在考虑这样一个测试点的最近邻。[0,1]d∀i,xi∈[0,1]dk=10

设 ℓ 是包含测试点的所有 k 最近邻的最小超立方体的边长。然后和。如果 n=1000,ℓ 有多大?ℓd≈knℓ≈(kn)1/d

因此,当 d≫0 时,几乎需要整个空间来找到 10-NN。
为了模拟这种现象,我进行了以下实验(实现参考中的示例):
import matplotlib.pyplot as plt
%matplotlib inline
plt.rcParams.update({'figure.figsize':(7,5), 'figure.dpi':100})
import numpy as np
np.random.seed(0)
from scipy.spatial import distance_matrix
min_val = 0
max_val = 1
n = 1000
for d in (2, 3, 10, 100, 1000, 10000):
a = np.random.rand(n, d)
b = np.random.rand(n, d)
distances = distance_matrix(a, b)
distances = np.array(distances).flatten()
plt.hist(distances, bins=100, weights=np.ones(len(distances)) / len(distances))
# plt.gca().set(title='Frequency Histogram', ylabel='Frequency')
plt.show()
并且这些图与参考中的图非常吻合。
参考:
- 第 2 讲:k-最近邻