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

相关文章

SQL Server修改数据库名及物理数据文件名操作步骤

《SQLServer修改数据库名及物理数据文件名操作步骤》在SQLServer中重命名数据库是一个常见的操作,但需要确保用户具有足够的权限来执行此操作,:本文主要介绍SQLServer修改数据... 目录一、背景介绍二、操作步骤2.1 设置为单用户模式(断开连接)2.2 修改数据库名称2.3 查找逻辑文件名

canal实现mysql数据同步的详细过程

《canal实现mysql数据同步的详细过程》:本文主要介绍canal实现mysql数据同步的详细过程,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的... 目录1、canal下载2、mysql同步用户创建和授权3、canal admin安装和启动4、canal

使用SpringBoot整合Sharding Sphere实现数据脱敏的示例

《使用SpringBoot整合ShardingSphere实现数据脱敏的示例》ApacheShardingSphere数据脱敏模块,通过SQL拦截与改写实现敏感信息加密存储,解决手动处理繁琐及系统改... 目录痛点一:痛点二:脱敏配置Quick Start——Spring 显示配置:1.引入依赖2.创建脱敏

Go学习记录之runtime包深入解析

《Go学习记录之runtime包深入解析》Go语言runtime包管理运行时环境,涵盖goroutine调度、内存分配、垃圾回收、类型信息等核心功能,:本文主要介绍Go学习记录之runtime包的... 目录前言:一、runtime包内容学习1、作用:① Goroutine和并发控制:② 垃圾回收:③ 栈和

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

Python数据分析与可视化的全面指南(从数据清洗到图表呈现)

《Python数据分析与可视化的全面指南(从数据清洗到图表呈现)》Python是数据分析与可视化领域中最受欢迎的编程语言之一,凭借其丰富的库和工具,Python能够帮助我们快速处理、分析数据并生成高质... 目录一、数据采集与初步探索二、数据清洗的七种武器1. 缺失值处理策略2. 异常值检测与修正3. 数据

pandas实现数据concat拼接的示例代码

《pandas实现数据concat拼接的示例代码》pandas.concat用于合并DataFrame或Series,本文主要介绍了pandas实现数据concat拼接的示例代码,具有一定的参考价值,... 目录语法示例:使用pandas.concat合并数据默认的concat:参数axis=0,join=

Android学习总结之Java和kotlin区别超详细分析

《Android学习总结之Java和kotlin区别超详细分析》Java和Kotlin都是用于Android开发的编程语言,它们各自具有独特的特点和优势,:本文主要介绍Android学习总结之Ja... 目录一、空安全机制真题 1:Kotlin 如何解决 Java 的 NullPointerExceptio

C#代码实现解析WTGPS和BD数据

《C#代码实现解析WTGPS和BD数据》在现代的导航与定位应用中,准确解析GPS和北斗(BD)等卫星定位数据至关重要,本文将使用C#语言实现解析WTGPS和BD数据,需要的可以了解下... 目录一、代码结构概览1. 核心解析方法2. 位置信息解析3. 经纬度转换方法4. 日期和时间戳解析5. 辅助方法二、L

使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)

《使用Python和Matplotlib实现可视化字体轮廓(从路径数据到矢量图形)》字体设计和矢量图形处理是编程中一个有趣且实用的领域,通过Python的matplotlib库,我们可以轻松将字体轮廓... 目录背景知识字体轮廓的表示实现步骤1. 安装依赖库2. 准备数据3. 解析路径指令4. 绘制图形关键