KNN最近邻节点算法分类回归预测基础算法、优化方案及python代码实现

news/2024/7/9 10:41:14 标签: 分类, 回归, 机器学习, KNN, sklearn

0.基本介绍

  • K-NearestNeighbor,最近邻节点算法
  • 一种惰性学习算法,存储已有数据样本,推理新样本时计算与其距离最近的K个已有样本点,通过投票(分类)或者加权平均(回归)的方式预测新样本点取值。

1.优点

  1. 简单
  2. 精度高
  3. 对异常值不敏感
  4. 无需数据独立性假设

2.缺点

  1. 时间复杂度高:要计算测试点与所有样本间的距离
  2. 空间复杂度高:要存储所有样本
  3. 数据分布不均匀时,会受到样本分布偏置的影响

3.应用

  1. 分类
  2. 回归

4.关键参数

  1. K值:越大,对数据集拟合程度越差,但泛化性能越好,对噪声越不敏感
  2. 距离度量:度量方式与待求解问题越接近效果越好

KNN_19">5.加权KNN

  • 通过给K个最近邻样本赋予一个与距离有关的权重,来平衡样本分布不平衡的问题。
  1. 反比例权重:最简单的形式是返回距离的倒数,有时候,完全一样或非常接近的样本权重会很大甚至无穷大。基于这样的原因,在距离求倒数时,在距离上加一个常量:weight = 1 / (distance + const),同时可以保证数值稳定性。
    这种方法的潜在问题是,它为近邻分配很大的权重,稍远一点的会衰减的很快,对噪声会更加敏感。

    weights = 1/(dist_topk+delta)
    
  2. 高斯权重:使用正态分布赋值权重,使用时要注意距离的取值范围,结合高斯函数里的标准差取值,理论上会有很大影响,这里有一些参数相关实验和简单的数学原理。

    import math
    sigma = 0.24 #越大越平缓
    weights = (math.e)**((-1*dist_topk**2/(2*sigma**2))) *(1/(sigma*1.732*3.14))
    
  3. sigmod函数加权

    import math
    alpha = 5 #越小越平缓
    weight = 1/(1+ (math.e)**(-dist_topk*alpha))
    
  4. 其他函数加权:根据实际任务的需求,综合考量加权函数斜率、凹凸性、拟合能力和泛化能力、距离分布等情况选取合适函数,或自己设计对应函数,cos等函数均可以。

6.距离优化几种距离的度量方式

  1. 欧式距离:两点间距离公式(对应维度作差的平方和开根号),
  2. 曼哈顿距离(城市街区距离):每个维度差的绝对值之和(走直角路线的路程)
  3. 切比雪夫距离:max(每个维度差的绝对值)
  4. 闵氏距离(闵可夫斯基距离):类似LP正则化,P=1:曼哈顿距离;P=2:欧氏距离;P无穷大:切比雪夫距离

上述距离都将各个维度分量的量纲、影响、分布相同看待了


  1. 标准化欧氏距离/加权欧氏距离:每个维度标准化后再进行欧氏距离(可以将方差的倒数看做一种加权,)
  2. 马氏距离:马氏距离是基于样本分布的一种距离。物理意义就是在规范化的主成分空间中的欧氏距离。所谓规范化的主成分空间就是利用主成分分析对一些数据进行主成分分解。再对所有主成分分解轴做归一化,形成新的坐标轴。由这些坐标轴张成的空间就是规范化的主成分空间。

马氏距离的特点
1.量纲无关,排除变量之间的相关性的干扰;
2.马氏距离的计算是建立在总体样本的基础上的,如果拿同样的两个样本,放入两个不同的总体中,最后计算得出的两个样本间的马氏距离通常是不相同的,除非这两个总体的协方差矩阵碰巧相同;
3.计算马氏距离过程中,要求总体样本数大于样本的维数,否则得到的总体样本协方差矩阵逆矩阵不存在,这种情况下,用欧式距离计算即可。

  1. 余弦距离:夹角余弦可用来衡量两个向量方向的差异;机器学习中,借用这一概念来衡量样本向量之间的差异。 取值范围为[-1,1]。余弦越大表示两个向量的夹角越小,余弦越小表示两向量的夹角越大。当两个向量的方向重合时余弦取最大值1,当两个向量的方向完全相反余弦取最小值-1。
  2. 汉明距离:两个等长字符串s1与s2的汉明距离为:将其中一个变为另外一个所需要作的最小字符替换次数。例如:
The Hamming distance between “1011101and1001001is 2.

(汉明重量:非零元素个数,即与0的汉明距离)

  1. 杰卡德距离:两个集合中不同元素占所有元素的比例来衡量两个集合的区分度
  2. 相关距离:1-相关系数(相关系数:衡量随机变量X与Y相关程度,取值范围是[-1,1],绝对值越大,越相关。当X与Y线性相关时,相关系数取值为1(正线性相关)或-1(负线性相关))

以上的距离度量方法度量的皆为两个样本(向量)之间的距离


  1. 信息熵:系统内部样本之间的一个距离,样本分布越分散(或者说分布越平均),信息熵就越大

7.速度优化

  1. 基本思想是在存储数据样本的时候通过特定的数据结构,提前完成部分比较大小或排序的相关工作,从而实现新样本推理的加速。
  2. KD树:二叉树,相当于不断用垂直与坐标轴的超平面将K维空间切分构成一系列K维超矩形区域;以中值作为切割点,划分左右子树
  3. BallTree:抛弃了kd树画的方形,而建立球形,去掉棱角。简而言之,就是使用超球面而不是超矩形划分区域

sklearn_81">8.sklearn实现

from sklearn.neighbors import KNeighborsRegressor
#使用KNN回归模型拟合数据,调整参数,使得预测方式为平均回归
uni_knr = KNeighborsRegressor(weights='uniform')
uni_knr.fit(X_train, y_train)
y_uni_knr_predict = uni_knr.predict(X_test)
r_squared['uniform weighted KNN'] = uni_knr.score(X_test, y_test)

9.参考:

  1. KNN算法及其改进
  2. KNN算法的高斯优化
  3. 几种距离的度量方式
  4. 【Python机器学习实战】一个案例迅速入门所有的Scikit-learn回归模型

http://www.niftyadmin.cn/n/300145.html

相关文章

界面控件DevExpress Blazor UI v22.2亮点:全新的Window组件

DevExpress拥有.NET开发需要的所有平台控件,包含600多个UI控件、报表平台、DevExpress Dashboard eXpressApp 框架、适用于 Visual Studio的CodeRush等一系列辅助工具,该组件拥有众多新产品和数十个具有高影响力的功能,可为桌面、Web和移动应…

企业遇到知识管理困境该怎么办?这里有解决方案!寻找Baklib

随着企业业务不断扩大,员工数量的增加,知识管理成为了企业面临的一个重要问题。企业需要管理大量的知识,如产品手册、流程规范、客户信息等,这些知识对企业的生产和经营至关重要。但是,如何高效地管理这些知识&#xf…

常见的PHP脚本漏洞漏洞修复之基础篇

​ 古人学问遗无力,少壮功夫老始成 〞:因为PHP是弱类型语言,所以内置的很多函数,在进行转换和比较的时候,会有各种漏洞需要格外关注。不然很容易在安全上造成各种各样的漏洞,当然平时可能问题不会显现&…

android基础小知识

android adb常用命令: 启动服务:adb shell am startservice com.loader/com.main.ForegroundService 查看jobservice:adb shell dumpsys jobscheduler | grep xxxx 禁止USB充电:adb shell dumpsys battery unplug 查看电池&#x…

【Python入门知识】NumPy 数组排序/过滤,案例+理论讲解

前言 嗨喽~大家好呀,这里是魔王呐 ❤ ~! 数组排序 排序是指将元素按有序顺序排列。 有序序列是拥有与元素相对应的顺序的任何序列,例如数字或字母、升序或降序。 NumPy ndarray 对象有一个名为 sort() 的函数,该函数将对指定的数组进行排…

798. 差分矩阵(C++和Python3)——2023.5.8打卡

文章目录 QuestionIdeasCode Question 输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的…

如何设计电商SPU与SKU表以及相关的表?

一、先了解SPU及SKU的相关概念: 我们在开发电商项目时,必须首先要了解两个概念,SPU与SKU是什么?这也是设计一个好的电商系统的必要前提。商系统实现了什么功能,大数情况下都是和商品模块相关联的。因此商品模块本身的…

研发效能系列 - 质量与速度能否兼得?

作者:冬哥 引言 我们的时间,应该是用于提高软件质量,还是专注在发布更有价值的功能?这貌似是软件研发中永恒的话题。 到底什么是质量?质量有什么特质? 质量与速度是什么关系,两者是一个硬币的…