加权 KNN 算法的原理与详解

加权kNN,k近邻算法的增强改进版本。

加权KNN算法

近邻算法(k-Nearest Neighbors, kNN)是一种用于分类和回归的非参数方法。它的基本思想是“看邻居”,即通过查找离目标点最近的 K 个数据点,来判断目标点的类别或数值。

举个例子,假设有一个训练集,其中有两类点:红色代表类别0,绿色代表类别1。现在有一个白色点,需要确定它的类别。我们选择k=3,计算白色点到所有红色点和绿色点的距离,选取距离最近的3个点。如果这3个点中有2个是绿色,1个是红色,我们就认为白色点属于绿色那一类,即类别1。

但是,KNN算法性能受到超参数k值选择的影响。如果k值过小,算法对离群点会更敏感;如果k值过大,邻域内可能包含过多来自其他类别的点。此外,考虑到一个普遍的认识,即:如果靠近的数据点之间在距离上差异很大,那么其中最靠近的那一个数据点更能可靠地表明对象的类别。 针对这一些情况,加权KNN算法随之诞生。

更直观的理解:

假设有以下训练集:

在这里插入图片描述

  • 红色标签表示类别0的点,绿色标签表示类别1的点。

此时,如果我们将白色点作为查询点(需要预测类别标签的点),并且将上述数据集交给一个基于KNN的分类器,分类器会基于前面提到的最邻近原则将查询点归为类别0。但是,从图中可以明显看出,该点应该更接近类别1的点。为了克服这一缺点,我们就可以使用加权kNN。

在这里插入图片描述

在加权kNN中,最近的k个点根据一个称为核函数的函数赋予权重。加权kNN的直觉是,给距离较近的点更多的权重,而给距离较远的点更少的权重。任何值随距离增加而减少的函数都可以用作加权kNN分类器的核函数,其中最简单的函数是反距离函数。

反距离函数是一种常用的加权函数,用于kNN算法中,通过距离的倒数来给近邻点赋予权重。公式如下:

w i = 1 d i w_i = \frac{1}{d_i} wi=di1

其中:

  • w i w_i wi是第 i i i 个近邻点的权重。
  • d i d_i di 是第 i i i 个近邻点到查询点的距离。

这个函数的直观理解是:距离越近的点,权重越大;距离越远的点,权重越小。这样可以更准确地反映近邻点对查询点的影响。

Python 代码实现如下:

# Python3 program to implement the 
# weighted K nearest neighbour algorithm. 

import math 

def weightedkNN(points,p,k=3): 
	''' 
	This function finds classification of p using 
	weighted k nearest neighbour algorithm. It assumes only two 
	two classes and returns 0 if p belongs to class 0, else 
	1 (belongs to class 1). 

	Parameters - 
		points : Dictionary of training points having two keys - 0 and 1 
			Each key have a list of training data points belong to that 

		p : A tuple ,test data point of form (x,y) 

		k : number of nearest neighbour to consider, default is 3 
	'''

	distance=[] 
	for group in points: 
		for feature in points[group]: 

			#calculate the euclidean distance of p from training points 
			euclidean_distance = math.sqrt((feature[0]-p[0])**2 +(feature[1]-p[1])**2) 

			# Add a tuple of form (distance,group) in the distance list 
			distance.append((euclidean_distance,group)) 

	# sort the distance list in ascending order 
	# and select first k distances 
	distance = sorted(distance)[:k] 

	freq1 = 0 # weighted sum of group 0 
	freq2 = 0 # weighted sum of group 1 

	for d in distance: 
		if d[1] == 0: 
			freq1 += (1 / d[0]) 
			
		elif d[1] == 1: 
			freq2 += (1 /d[0]) 
			

	return 0 if freq1>freq2 else 1

# Driver function 
def main(): 

	# Dictionary of training points having two keys - 0 and 1 
	# key 0 have points belong to class 0 
	# key 1 have points belong to class 1 

	points = {0:[(0, 4),(1, 4.9),(1.6, 5.4),(2.2, 6),(2.8, 7),(3.2, 8),(3.4, 9)], 
			1:[(1.8, 1),(2.2, 3),(3, 4),(4, 4.5),(5, 5),(6, 5.5)]} 

	# query point p(x,y) 
	p = (2, 4) 

	# Number of neighbours 
	k = 5

	print("The value classified to query point is: {}".format(weightedkNN(points,p,k))) 

if __name__ == '__main__': 
	main() 

参考链接:

  • https://www.geeksforgeeks.org/weighted-k-nn/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/770653.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

kimi,让论文写作不再是一场苦旅【下】

学境思源,一键生成论文初稿: AcademicIdeas - 学境思源AI论文写作 今天我们继续昨天的内容:kimi,让论文写作不在是一场苦旅【上】,为大家列举与Kimi互动的示例。 8. 文献综述: 1. 文献搜索策略&#xff1…

育才兴业,助力数字产业蓬勃发展

成都树莓集团通过校企合作、建设人才项目转化中心、推动一线多园战略以及提供全方位服务等举措,积极培养数字产业人才,为行业发展提供了有力支持。 一、校企合作,打造人才培养高地 树莓集团深知企业协同育人的重要性,积极与高校建…

ppt接单渠道大公开‼️

PPT 接单主要分两种:PPT 模板投稿和PPT 定制接单,我们先从简单的 PPT 模板投稿说起。 PPT 模板投稿 利用业余时间,做一些 PPT 模板上传到平台,只要有人下载你的模板,你就有收入。如果模板质量高,简直就是一…

Python特征工程 — 1.3 对数与指数变换

目录 1 对数变换 1.1 对数变换的概念 1.2 对数变换实战 2 指数变换 2.1 指数变换的概念 2.2 指数变换实战 3 Box-Cox变换 3.1 Box-Cox变换概念 3.2 Box-Cox变换实战 1 对数变换 1.1 对数变换的概念 特征对数变换和指数变换是数据预处理中的两种常用技术,…

制造企业真的需要数字化转型吗?一文讲透:为何做,如何做?

此前拜访了不少制造企业,其以中小型企业居多,在与企业负责人交流数字化转型话题时,感触最多的还是管理者对“数字化转型”的认知。 在数字化转型方面从国家层面到地方政府进行大量的宣传与政策支持,部分行业头部企业也从数字化转…

Appium Inspector介绍和使用

一、什么是Appium Inspector 官方介绍:Overview - Appium Inspector 检查器的主要目的是提供应用程序页面源代码的检查功能。它主要用于测试自动化开发,但也可用于应用程序开发 - 或者如果只是想查看应用程序的页面源代码! 从本质上讲&…

RK3568驱动指南|第十六篇 SPI-第192章 mcp2515驱动编写:完善write和read函数

瑞芯微RK3568芯片是一款定位中高端的通用型SOC,采用22nm制程工艺,搭载一颗四核Cortex-A55处理器和Mali G52 2EE 图形处理器。RK3568 支持4K 解码和 1080P 编码,支持SATA/PCIE/USB3.0 外围接口。RK3568内置独立NPU,可用于轻量级人工…

Reid系列论文学习——无人机场景下基于 Transformer 的轻量化行人重识别

今天介绍的一篇论文是针对无人机场景下的行人重识别,论文题目为:"无人机场景下基于 Transformer 的轻量化行人重识别"。该论文针对无人机场景下行人呈现多角度多尺度的特点、以及传统CNN网络在行人重识别任务中受限于感受野和下采样导致的无法…

Git 操作总结

1. 安装、Git 环境配置 1.1 安装 Git 官方版本可以在 Git 官方网站下载:打开 https://git-scm.com/download/win,选择相应版本即可。 Git 安装完成后,可以在开始菜单中看到 Git 的三个启动图标(Git Bash、Git CMD、Git GUI&…

关于5G和卫星

手机,已经串联起了我们生活中的一切环节。我们随时随地拿出手机,都能畅快地上网。 这一切是如此地理所当然,以至于我们甚至想不到这样不可思议的问题: 移动通信网络真的无处不在吗? 我们都知道,地球虽叫…

解决在【Tomcat服务器上报错java.lang.ClassNotFoundException: com.mysql.cj.jdbc.Driver】

目录 1. 添加驱动依赖:右键导入为库 2. 重新导入工件,注意看lib下有没有mysql的驱动包,没有的话需要导入。 3. 写代码的时候要注意对null值的处理,比如下面的截图,如果只是简单的获取生成的随机数,很有可…

Linux—KVM虚拟化中使用基本命令管理虚拟机(纯实例)

🏡作者主页:点击! 👨‍💻Linux高级管理专栏:点击! ⏰️创作时间:2024年7月2日11点11分 🀄️文章质量:94分 文章目录 前言 1.查看命令帮助 2.查看KVM 的…

MySQL 如何实现将数据实时同步到 ES ?

引言:在现代应用程序开发中,通常会将数据存储在 MySQL 中,用于事务性处理和数据持久化。而 Elasticsearch(ES)则是一种专门用于全文搜索和分析的强大工具。将这两者结合使用的一个常见需求是实时将 MySQL 中的数据同步…

Houdini 引用领域及20版本五大重点功能

Houdini是一款三维计算机图形软件,由加拿大Side Effects Software Inc.(简称SESI)公司开发,SESI公司由Kim Davidson和Greg Hermanovic创建于1987年。Houdini是在Prisms基础上重新开发而来,可运行于Linux, Windows, Mac…

Echarts折线图 自适应窗口大小

实现效果&#xff1a; 代码&#xff1a; <template><div class"echarts"><div class"select-box"><div v-for"(item,index) in trendList":key"index":class"[period item.id?active:,item]"click&…

从涟漪到波浪:资产代币化的变革力量

原文标题&#xff1a;《From ripples to waves: The transformational power of tokenizing assets》撰文&#xff1a;Anutosh Banerjee&#xff0c;Matt Higginson&#xff0c;Julian Sevillano&#xff0c;Matt Higginson编译&#xff1a;Chris&#xff0c;Techub News本文来…

最近,被“AI”狠狠刷屏了......

最近&#xff0c;被“AI”狠狠刷屏了。 作为时下最热门的话题&#xff0c;AI画图、AI配音、AI写文案、AI做视频......AI在最近两年可谓是火遍全球。ChatGPT、Midjourney和SORA等技术不断涌现&#xff0c;不仅深刻改变着我们的生活方式&#xff0c;也推动了AI技术的飞速发展。 …

Linux文件与日志

目录 1. Linux 文件系统 1.1 inode号 1.2 EXT类型文件恢复 1.3 xfs类型文件备份和恢复 2. 日志分析 2.1 日志类型 2.2日志配置文件 2.3 日志分析的重要性 在Linux系统中&#xff0c;文件和日志是管理和维护系统运行所不可或缺的。理解它们的工作原理和如何有效地管理和…

第三天:LINK3D核心原理讲解【第1部分】

第三天:LINK3D核心原理讲解 LINK3D学习笔记 目标 了解LINK3D velodyne64线激光雷达LINK3D质心点提取效果: 分布在车道与墙体的交界处。 课程内容 LINK3D论文精讲LINK3D聚合关键点提取代码讲解LINK3D描述子匹配代码讲解除了ALOAM的线特征、面特征,还有其他点云特征吗,是…

WSL——忘记root密码(Ubuntu)

1、问题描述 Windows下的WSL&#xff08;Ubuntu&#xff09;忘记了root密码&#xff0c;无法使用管理员权限。 2、解决方法 关闭 Ubuntu 窗口。打开 Windows 的 Powershell 或 cmd&#xff0c; 以 root 默认登陆 WSL。 wsl -u root 修改对应用户密码。 # xxx为要修改密码的用…