白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)

维度诅咒(The Curse of Dimensionality)

KNN在高维空间运行会出现”维度诅咒”的问题,那是因为在高维空间太广阔,高维空间的数据点不趋向接近另外的数据点。有一个办法可以证明这一点,随机产生很多对d维度的向量,然后计算每对的向量距离。

产生随机数据点:

def random_point(dim):
    return [random.random() for _ in range(dim)]

生成每对(num_pairs)向量的距离:

def random_distances(dim, num_pairs):
    return [distance(random_point(dim), random_point(dim))
            for _ in range(num_pairs)]

我们会计算维度从1到100,每一维度计算出10000个距离,使用这些距离计算每一维的平均距离和找出最小距离:

dimensions = range(1, 101)

avg_distances = []
min_distances = []

random.seed(0)
for dim in dimensions:
    distances = random_distances(dim, 10000) # 10,000 random pairs
    avg_distances.append(mean(distances)) # track the average
    min_distances.append(min(distances)) # track the minimum

白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)_第1张图片

当维度增加时,数据点之间的平均距离也增加,但是更重要的问题是在最近距离与平均距离的比率:

min_avg_ratio = [min_dist / avg_dist
                for min_dist, avg_dist in zip(min_distances, avg_distances)]

白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)_第2张图片

在低维数据集中,最小距离数据点更加接近平均值;在高维数据集中,最小距离数据点不接近平均值,这个意味着最小距离的2个数据点并不是很接近。

解决方案对高维空间进行降维。

在0到1之间,在一维空间里,你提取50个随机点,你将得到极好的且紧凑的样本:
白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)_第3张图片

在2维空间里,提取50个随机点,你会发现随机点零散的覆盖在2维空间里:
白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)_第4张图片

在3维空间里,你会得到更加零散的随机点:
白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)_第5张图片

matplotlib不能画4维空间,这是我们能做的最大限度了,但是这足够发现有很多空的空间,且在随机点周围没有太多的数据点。在更高维空间,除非你得到更加多的数据(指数增加的数据),否者这些大且空的空间表示没有数据点的区域,你想在你的模型中使用是非常不准确。

所以,如果你正在尝试在高维空间使用最近邻模型,那么一个好的主意是降维。下一章节中我们将要介绍朴素贝叶斯(Naive Bayes)。

你可能感兴趣的:(数据挖掘,数据科学,数据挖掘,KNN,维度诅咒,python)