博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)
阅读量:4057 次
发布时间:2019-05-25

本文共 1238 字,大约阅读时间需要 4 分钟。

维度诅咒(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

这里写图片描述

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

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

这里写图片描述

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

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

在0到1之间,在一维空间里,你提取50个随机点,你将得到极好的且紧凑的样本:

这里写图片描述

在2维空间里,提取50个随机点,你会发现随机点零散的覆盖在2维空间里:

这里写图片描述

在3维空间里,你会得到更加零散的随机点:

这里写图片描述

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

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

你可能感兴趣的文章
hdu 1561 The more, The Better (树形背包dp)
查看>>
【设计模式】学习笔记14:状态模式(State)
查看>>
poj 1976 A Mini Locomotive (dp 二维01背包)
查看>>
斯坦福大学机器学习——因子分析(Factor analysis)
查看>>
项目导入时报错:The import javax.servlet.http.HttpServletRequest cannot be resolved
查看>>
不一定会执行finally代码块的两个例子
查看>>
LRUCache
查看>>
linux对于没有写权限的文件如何保存退出vim
查看>>
Windows下安装ElasticSearch6.3.1以及ElasticSearch6.3.1的Head插件
查看>>
IntelliJ IDEA 下的svn配置及使用的非常详细的图文总结
查看>>
【IntelliJ IDEA】idea导入项目只显示项目中的文件,不显示项目结构
查看>>
itellij idea导入web项目并部署到tomcat
查看>>
ssh 如何方便的切换到其他节点??
查看>>
JSP中文乱码总结
查看>>
AspectJ下载和安装
查看>>
Java-IO-File类
查看>>
Java-IO-java的IO流
查看>>
Java-IO-字节流和字符流
查看>>
Java-IO-输入/输出流体系
查看>>
Java实现DES加密解密
查看>>