KNN(k-Nearest Neighbor)算法原理

2023-10-17 18:28

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

KNN(k-Nearest Neighbor)算法是一种基于实例的学习方法,常用于分类和回归问题。下面是KNN算法的原理和步骤,以及欧式距离和曼哈顿距离的计算原理:

  1. 原理

KNN算法基于一个假设:与一个样本最相似的其他k个样本的类别可以用来预测该样本的类别。KNN算法将所有的训练数据看作一个点集,根据他们与新样本之间的距离进行分类。

  1. 步骤

KNN算法的实现步骤如下:

  • 计算测试数据与训练数据之间的距离(可以使用欧式距离或曼哈顿距离)。
  • 选取距离测试数据最近的k个点。
  • 统计k个点中各类别出现的次数。
  • 将出现次数最多的类别作为测试数据的预测结果。
  1. 欧式距离计算原理

欧式距离,也称L2距离,是一种常用的距离度量方式,其计算公式为:

d ( x , y ) = s q r t ( s u m ( x i − y i ) 2 ) d(x,y) = sqrt(sum(xi-yi)^2) d(x,y)=sqrt(sum(xiyi)2)

其中,x和y是两个向量,xi和yi分别表示向量中的第i个元素。

简单来说,欧式距离就是把两个点的各个坐标分别相减后平方再相加,最后再取平方根。

  1. 曼哈顿距离计算原理

曼哈顿距离,也称L1距离,也叫城市街区距离,其计算公式为:

d ( x , y ) = s u m ( ∣ x i − y i ∣ ) d(x,y) = sum(|xi-yi|) d(x,y)=sum(xiyi)

其中,x和y是两个向量,xi和yi分别表示向量中的第i个元素。

简单来说,曼哈顿距离就是把两个点的各个坐标分别相减后取绝对值再相加。

KNN(K-Nearest Neighbors,K近邻算法)是一种基本的分类和回归算法,它的原理非常简单直观,即通过计算待分类数据点与已有数据集中所有数据点的距离,选择其中距离最小的K个数据点(最近邻),并把它们的类别作为待分类数据点的类别进行分类。

以下是KNN算法的代码实现示例:

import numpy as np
from collections import Counterdef euclidean_distance(x1, x2):return np.sqrt(np.sum((x1 - x2)**2))class KNN:def __init__(self, k=3):self.k = kdef fit(self, X, y):self.X_train = Xself.y_train = ydef predict(self, X):y_pred = [self._predict(x) for x in X]return np.array(y_pred)def _predict(self, x):#Compute distances between x and all examples in the training setdistances = [euclidean_distance(x, x_train) for x_train in self.X_train]#Sort by distance and return indices of the first k neighborsk_idx = np.argsort(distances)[:self.k]#Extract the labels of the k nearest neighbor training samplesk_neighbor_labels = [self.y_train[i] for i in k_idx]  #Return the most common class labelmost_common = Counter(k_neighbor_labels).most_common(1)return most_common[0][0]

这个代码实现的KNN类可以接受一个超参数K和训练数据集(X_train,y_train),并且能够对给定的测试数据集X做出预测。可以使用以下代码进行测试:

from sklearn import datasets
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoredata = datasets.load_iris()
X = data.data
y = data.targetX_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=123)knn = KNN(k=3)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)print("Accuracy:", accuracy_score(y_test, y_pred))

这个示例使用Iris数据集进行分类,随机选择了20%的数据作为测试集。结果将打印出测试集上的准确度分数。

这篇关于KNN(k-Nearest Neighbor)算法原理的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

MySQL中的MVCC底层原理解读

《MySQL中的MVCC底层原理解读》本文详细介绍了MySQL中的多版本并发控制(MVCC)机制,包括版本链、ReadView以及在不同事务隔离级别下MVCC的工作原理,通过一个具体的示例演示了在可重... 目录简介ReadView版本链演示过程总结简介MVCC(Multi-Version Concurr

Redis主从/哨兵机制原理分析

《Redis主从/哨兵机制原理分析》本文介绍了Redis的主从复制和哨兵机制,主从复制实现了数据的热备份和负载均衡,而哨兵机制可以监控Redis集群,实现自动故障转移,哨兵机制通过监控、下线、选举和故... 目录一、主从复制1.1 什么是主从复制1.2 主从复制的作用1.3 主从复制原理1.3.1 全量复制

Python中的随机森林算法与实战

《Python中的随机森林算法与实战》本文详细介绍了随机森林算法,包括其原理、实现步骤、分类和回归案例,并讨论了其优点和缺点,通过面向对象编程实现了一个简单的随机森林模型,并应用于鸢尾花分类和波士顿房... 目录1、随机森林算法概述2、随机森林的原理3、实现步骤4、分类案例:使用随机森林预测鸢尾花品种4.1

Redis主从复制的原理分析

《Redis主从复制的原理分析》Redis主从复制通过将数据镜像到多个从节点,实现高可用性和扩展性,主从复制包括初次全量同步和增量同步两个阶段,为优化复制性能,可以采用AOF持久化、调整复制超时时间、... 目录Redis主从复制的原理主从复制概述配置主从复制数据同步过程复制一致性与延迟故障转移机制监控与维

SpringCloud配置动态更新原理解析

《SpringCloud配置动态更新原理解析》在微服务架构的浩瀚星海中,服务配置的动态更新如同魔法一般,能够让应用在不重启的情况下,实时响应配置的变更,SpringCloud作为微服务架构中的佼佼者,... 目录一、SpringBoot、Cloud配置的读取二、SpringCloud配置动态刷新三、更新@R

Redis主从复制实现原理分析

《Redis主从复制实现原理分析》Redis主从复制通过Sync和CommandPropagate阶段实现数据同步,2.8版本后引入Psync指令,根据复制偏移量进行全量或部分同步,优化了数据传输效率... 目录Redis主DodMIK从复制实现原理实现原理Psync: 2.8版本后总结Redis主从复制实

不懂推荐算法也能设计推荐系统

本文以商业化应用推荐为例,告诉我们不懂推荐算法的产品,也能从产品侧出发, 设计出一款不错的推荐系统。 相信很多新手产品,看到算法二字,多是懵圈的。 什么排序算法、最短路径等都是相对传统的算法(注:传统是指科班出身的产品都会接触过)。但对于推荐算法,多数产品对着网上搜到的资源,都会无从下手。特别当某些推荐算法 和 “AI”扯上关系后,更是加大了理解的难度。 但,不了解推荐算法,就无法做推荐系

康拓展开(hash算法中会用到)

康拓展开是一个全排列到一个自然数的双射(也就是某个全排列与某个自然数一一对应) 公式: X=a[n]*(n-1)!+a[n-1]*(n-2)!+...+a[i]*(i-1)!+...+a[1]*0! 其中,a[i]为整数,并且0<=a[i]<i,1<=i<=n。(a[i]在不同应用中的含义不同); 典型应用: 计算当前排列在所有由小到大全排列中的顺序,也就是说求当前排列是第

深入探索协同过滤:从原理到推荐模块案例

文章目录 前言一、协同过滤1. 基于用户的协同过滤(UserCF)2. 基于物品的协同过滤(ItemCF)3. 相似度计算方法 二、相似度计算方法1. 欧氏距离2. 皮尔逊相关系数3. 杰卡德相似系数4. 余弦相似度 三、推荐模块案例1.基于文章的协同过滤推荐功能2.基于用户的协同过滤推荐功能 前言     在信息过载的时代,推荐系统成为连接用户与内容的桥梁。本文聚焦于

csu 1446 Problem J Modified LCS (扩展欧几里得算法的简单应用)

这是一道扩展欧几里得算法的简单应用题,这题是在湖南多校训练赛中队友ac的一道题,在比赛之后请教了队友,然后自己把它a掉 这也是自己独自做扩展欧几里得算法的题目 题意:把题意转变下就变成了:求d1*x - d2*y = f2 - f1的解,很明显用exgcd来解 下面介绍一下exgcd的一些知识点:求ax + by = c的解 一、首先求ax + by = gcd(a,b)的解 这个