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

2023-11-22 12:08

本文主要是介绍白手起家学习数据科学 ——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 pairsavg_distances.append(mean(distances)) # track the averagemin_distances.append(min(distances)) # track the minimum

这里写图片描述

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

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

这里写图片描述

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

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

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

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

在3维空间里,你会得到更加零散的随机点:
这里写图片描述

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

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

这篇关于白手起家学习数据科学 ——k-Nearest Neighbors之“维度诅咒”(九)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/410025

相关文章

Java利用JSONPath操作JSON数据的技术指南

《Java利用JSONPath操作JSON数据的技术指南》JSONPath是一种强大的工具,用于查询和操作JSON数据,类似于SQL的语法,它为处理复杂的JSON数据结构提供了简单且高效... 目录1、简述2、什么是 jsONPath?3、Java 示例3.1 基本查询3.2 过滤查询3.3 递归搜索3.4

MySQL大表数据的分区与分库分表的实现

《MySQL大表数据的分区与分库分表的实现》数据库的分区和分库分表是两种常用的技术方案,本文主要介绍了MySQL大表数据的分区与分库分表的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有... 目录1. mysql大表数据的分区1.1 什么是分区?1.2 分区的类型1.3 分区的优点1.4 分

Mysql删除几亿条数据表中的部分数据的方法实现

《Mysql删除几亿条数据表中的部分数据的方法实现》在MySQL中删除一个大表中的数据时,需要特别注意操作的性能和对系统的影响,本文主要介绍了Mysql删除几亿条数据表中的部分数据的方法实现,具有一定... 目录1、需求2、方案1. 使用 DELETE 语句分批删除2. 使用 INPLACE ALTER T

Python Dash框架在数据可视化仪表板中的应用与实践记录

《PythonDash框架在数据可视化仪表板中的应用与实践记录》Python的PlotlyDash库提供了一种简便且强大的方式来构建和展示互动式数据仪表板,本篇文章将深入探讨如何使用Dash设计一... 目录python Dash框架在数据可视化仪表板中的应用与实践1. 什么是Plotly Dash?1.1

Redis 中的热点键和数据倾斜示例详解

《Redis中的热点键和数据倾斜示例详解》热点键是指在Redis中被频繁访问的特定键,这些键由于其高访问频率,可能导致Redis服务器的性能问题,尤其是在高并发场景下,本文给大家介绍Redis中的热... 目录Redis 中的热点键和数据倾斜热点键(Hot Key)定义特点应对策略示例数据倾斜(Data S

Python实现将MySQL中所有表的数据都导出为CSV文件并压缩

《Python实现将MySQL中所有表的数据都导出为CSV文件并压缩》这篇文章主要为大家详细介绍了如何使用Python将MySQL数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到... python将mysql数据库中所有表的数据都导出为CSV文件到一个目录,并压缩为zip文件到另一个

SpringBoot整合jasypt实现重要数据加密

《SpringBoot整合jasypt实现重要数据加密》Jasypt是一个专注于简化Java加密操作的开源工具,:本文主要介绍详细介绍了如何使用jasypt实现重要数据加密,感兴趣的小伙伴可... 目录jasypt简介 jasypt的优点SpringBoot使用jasypt创建mapper接口配置文件加密

使用Python高效获取网络数据的操作指南

《使用Python高效获取网络数据的操作指南》网络爬虫是一种自动化程序,用于访问和提取网站上的数据,Python是进行网络爬虫开发的理想语言,拥有丰富的库和工具,使得编写和维护爬虫变得简单高效,本文将... 目录网络爬虫的基本概念常用库介绍安装库Requests和BeautifulSoup爬虫开发发送请求解

Oracle存储过程里操作BLOB的字节数据的办法

《Oracle存储过程里操作BLOB的字节数据的办法》该篇文章介绍了如何在Oracle存储过程中操作BLOB的字节数据,作者研究了如何获取BLOB的字节长度、如何使用DBMS_LOB包进行BLOB操作... 目录一、缘由二、办法2.1 基本操作2.2 DBMS_LOB包2.3 字节级操作与RAW数据类型2.

MySQL使用binlog2sql工具实现在线恢复数据功能

《MySQL使用binlog2sql工具实现在线恢复数据功能》binlog2sql是大众点评开源的一款用于解析MySQLbinlog的工具,根据不同选项,可以得到原始SQL、回滚SQL等,下面我们就来... 目录背景目标步骤准备工作恢复数据结果验证结论背景生产数据库执行 SQL 脚本,一般会经过正规的审批