白手起家学习数据科学 ——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

相关文章

MySQL快速复制一张表的四种核心方法(包括表结构和数据)

《MySQL快速复制一张表的四种核心方法(包括表结构和数据)》本文详细介绍了四种复制MySQL表(结构+数据)的方法,并对每种方法进行了对比分析,适用于不同场景和数据量的复制需求,特别是针对超大表(1... 目录一、mysql 复制表(结构+数据)的 4 种核心方法(面试结构化回答)方法 1:CREATE

详解C++ 存储二进制数据容器的几种方法

《详解C++存储二进制数据容器的几种方法》本文主要介绍了详解C++存储二进制数据容器,包括std::vector、std::array、std::string、std::bitset和std::ve... 目录1.std::vector<uint8_t>(最常用)特点:适用场景:示例:2.std::arra

MySQL中的DELETE删除数据及注意事项

《MySQL中的DELETE删除数据及注意事项》MySQL的DELETE语句是数据库操作中不可或缺的一部分,通过合理使用索引、批量删除、避免全表删除、使用TRUNCATE、使用ORDERBY和LIMI... 目录1. 基本语法单表删除2. 高级用法使用子查询删除删除多表3. 性能优化策略使用索引批量删除避免

MySQL 数据库进阶之SQL 数据操作与子查询操作大全

《MySQL数据库进阶之SQL数据操作与子查询操作大全》本文详细介绍了SQL中的子查询、数据添加(INSERT)、数据修改(UPDATE)和数据删除(DELETE、TRUNCATE、DROP)操作... 目录一、子查询:嵌套在查询中的查询1.1 子查询的基本语法1.2 子查询的实战示例二、数据添加:INSE

Linux服务器数据盘移除并重新挂载的全过程

《Linux服务器数据盘移除并重新挂载的全过程》:本文主要介绍在Linux服务器上移除并重新挂载数据盘的整个过程,分为三大步:卸载文件系统、分离磁盘和重新挂载,每一步都有详细的步骤和注意事项,确保... 目录引言第一步:卸载文件系统第二步:分离磁盘第三步:重新挂载引言在 linux 服务器上移除并重新挂p

使用MyBatis TypeHandler实现数据加密与解密的具体方案

《使用MyBatisTypeHandler实现数据加密与解密的具体方案》在我们日常的开发工作中,经常会遇到一些敏感数据需要存储,比如用户的手机号、身份证号、银行卡号等,为了保障数据安全,我们通常会对... 目录1. 核心概念:什么是 TypeHandler?2. 实战场景3. 代码实现步骤步骤 1:定义 E

使用C#导出Excel数据并保存多种格式的完整示例

《使用C#导出Excel数据并保存多种格式的完整示例》在现代企业信息化管理中,Excel已经成为最常用的数据存储和分析工具,从员工信息表、销售数据报表到财务分析表,几乎所有部门都离不开Excel,本文... 目录引言1. 安装 Spire.XLS2. 创建工作簿和填充数据3. 保存为不同格式4. 效果展示5

Python多任务爬虫实现爬取图片和GDP数据

《Python多任务爬虫实现爬取图片和GDP数据》本文主要介绍了基于FastAPI开发Web站点的方法,包括搭建Web服务器、处理图片资源、实现多任务爬虫和数据可视化,同时,还简要介绍了Python爬... 目录一. 基于FastAPI之Web站点开发1. 基于FastAPI搭建Web服务器2. Web服务

MySQL 批量插入的原理和实战方法(快速提升大数据导入效率)

《MySQL批量插入的原理和实战方法(快速提升大数据导入效率)》在日常开发中,我们经常需要将大量数据批量插入到MySQL数据库中,本文将介绍批量插入的原理、实现方法,并结合Python和PyMySQ... 目录一、批量插入的优势二、mysql 表的创建示例三、python 实现批量插入1. 安装 PyMyS

关于MySQL将表中数据删除后多久空间会被释放出来

《关于MySQL将表中数据删除后多久空间会被释放出来》MySQL删除数据后,空间不会立即释放给操作系统,而是会被标记为“可重用”,以供未来插入新数据时使用,只有满足特定条件时,空间才可能真正返还给操作... 目录一、mysql数据删除与空间管理1.1 理解MySQL数据删除原理1.3 执行SQL1.3 使用