统计学习-KNN

2024-08-31 21:32
文章标签 统计 学习 knn

本文主要是介绍统计学习-KNN,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

KNN是一种基本的分类(由与该样本最近的k个样本进行投票表决)与回归方法(回归问题:可以将一个样本的k个近邻的平均属性或者加权平均属性赋予该样本)。k值的选择,距离度量以及分类决策规则是KNN的三个基本要素。KNN1968年由Cover和Hart提出。

1.距离的度量

1.1闵可夫斯基距离
闵可夫斯基距离不是距离,是一组距离的定义。
Lp(xi,yi)=(nl=1xlixljp)1p

1.2当 p=2 时,称为欧式距离,即有:
Lp(xi,yi)=(nl=1xlixlj2)12

1.3当 p=1 时,称为曼哈顿距离,即有:
Lp(xi,yi)=nl=1xlixlj

1.4当 p= 时,称为切比雪夫距离,即有:
Lp(xi,yi)=maxl=1xlixlj

1.5夹角余弦
cos(θ)=xixj|xi||xj|

1.6汉明距离
两个特征向量之间的汉明距离定义为将其中一个变为另外一个所需要作的最小替换次数。例如特征向量“1111”与“1001”之间的汉明距离为2。应用:信息编码(为了增强容错性,应使得编码间的最小汉明距离尽可能大)

2.K值得选择

k值较小的时候,只有与测试样本较近的训练实例才会对预测结果起作用,但是缺点是泛化能力较差,因为如果离测试样本最近的训练实例刚好是噪声,预测就会出错。换句话说,k值得减小意味着整体模型变得复杂,容易发生过拟合。
k值较大的时候,比如k=N(训练样本总数),这种模型就过于简单,无论来了什么样本都将其预测为训练样本中最多的类别。这种模型忽略了训练实例中大量有用的信息。
在实际应用中,k的取值一般较小,然后是通过交叉验证的方法来确定最优k值。

3.分类决策规则

一般用投票的机理决定样本的类别,而多数表决等价于经验风险最小化。

4.kNN的实现:kd树

kNN最简单的实现就是线性扫面,假若存在N个样本,那么时间复杂度就是 ON ,利用kd树可以使得时间复杂度为 O(logN)

算法:构建k-d树(createKDTree)  
输入:数据点集Data-set和其所在的空间Range(感觉这个Range应该就是split域的值)  
输出:Kd,类型为k-d tree  
1.If Data-set为空,则返回空的k-d tree  
2.调用节点生成程序:  (1)确定split域:对于所有描述子数据(特征矢量),统计它们在每个维上的数据方差。假设每条数据记录为64维,可计算64个方差。挑选出最大值,对应的维就是split域的值。数据方差大表明沿该坐标轴方向上的数据分散得比较开,在这个方向上进行数据分割有较好的分辨率;  (2)确定Node-data域:数据点集Data-set按其第split域的值排序。位于正中间的那个数据点被选为Node-data。此时新的Data-set' = Data-set \ Node-data(除去其中Node-data这一点)。  
3.dataleft = {d属于Data-set' && d[split] ≤ Node-data[split]}  Left_Range = {Range && dataleft}  dataright = {d属于Data-set' && d[split] > Node-data[split]}  Right_Range = {Range && dataright}  
4.left = 由(dataleft,Left_Range)建立的k-d tree,即递归调用createKDTree(dataleft,Left_Range)。并设置left的parent域为Kd;  right = 由(dataright,Right_Range)建立的k-d tree,即调用createKDTree(dataleft,Left_Range)。并设置right的parent域为Kd。 

如果想详细了解KNN以及相关拓展可以参考该文。

这篇关于统计学习-KNN的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

在Linux终端中统计非二进制文件行数的实现方法

《在Linux终端中统计非二进制文件行数的实现方法》在Linux系统中,有时需要统计非二进制文件(如CSV、TXT文件)的行数,而不希望手动打开文件进行查看,例如,在处理大型日志文件、数据文件时,了解... 目录在linux终端中统计非二进制文件的行数技术背景实现步骤1. 使用wc命令2. 使用grep命令

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

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

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

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

详解如何使用Python从零开始构建文本统计模型

《详解如何使用Python从零开始构建文本统计模型》在自然语言处理领域,词汇表构建是文本预处理的关键环节,本文通过Python代码实践,演示如何从原始文本中提取多尺度特征,并通过动态调整机制构建更精确... 目录一、项目背景与核心思想二、核心代码解析1. 数据加载与预处理2. 多尺度字符统计3. 统计结果可

重新对Java的类加载器的学习方式

《重新对Java的类加载器的学习方式》:本文主要介绍重新对Java的类加载器的学习方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录1、介绍1.1、简介1.2、符号引用和直接引用1、符号引用2、直接引用3、符号转直接的过程2、加载流程3、类加载的分类3.1、显示

Pandas中统计汇总可视化函数plot()的使用

《Pandas中统计汇总可视化函数plot()的使用》Pandas提供了许多强大的数据处理和分析功能,其中plot()函数就是其可视化功能的一个重要组成部分,本文主要介绍了Pandas中统计汇总可视化... 目录一、plot()函数简介二、plot()函数的基本用法三、plot()函数的参数详解四、使用pl

Java学习手册之Filter和Listener使用方法

《Java学习手册之Filter和Listener使用方法》:本文主要介绍Java学习手册之Filter和Listener使用方法的相关资料,Filter是一种拦截器,可以在请求到达Servl... 目录一、Filter(过滤器)1. Filter 的工作原理2. Filter 的配置与使用二、Listen

Pandas统计每行数据中的空值的方法示例

《Pandas统计每行数据中的空值的方法示例》处理缺失数据(NaN值)是一个非常常见的问题,本文主要介绍了Pandas统计每行数据中的空值的方法示例,具有一定的参考价值,感兴趣的可以了解一下... 目录什么是空值?为什么要统计空值?准备工作创建示例数据统计每行空值数量进一步分析www.chinasem.cn处

openCV中KNN算法的实现

《openCV中KNN算法的实现》KNN算法是一种简单且常用的分类算法,本文主要介绍了openCV中KNN算法的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的... 目录KNN算法流程使用OpenCV实现KNNOpenCV 是一个开源的跨平台计算机视觉库,它提供了各

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA