近临算法(个人总结版)

背景

近邻算法(Nearest Neighbor Algorithm)是一种基本但非常有效的分类和回归方法。最早由Fix和Hodges在1951年提出,经过几十年的发展和改进,已成为数据挖掘、模式识别和机器学习领域的重要工具。近邻算法基于相似性原则,通过查找最接近的样本进行预测。其核心思想是相似的样本具有相似的特征,因而在预测时可以参考相似样本的类别或数值。常见的近邻算法包括k近邻算法(k-Nearest Neighbors, k-NN)、KD树(KD-Tree)和球树(Ball Tree)。

一、近邻算法的基本概念

近邻算法通过比较样本之间的距离来进行分类或回归。其核心思想是相似的样本具有相似的特征,因而在预测时可以参考相似样本的类别或数值。

1.1 距离度量

常用的距离度量包括:

  • 欧氏距离(Euclidean Distance):最常用的距离度量,适用于连续型数据。公式为:

  • 曼哈顿距离(Manhattan Distance):适用于高维空间和稀疏数据。公式为:

  • 闵可夫斯基距离(Minkowski Distance):欧氏距离和曼哈顿距离的推广,适用于多种情况。公式为:

  • 余弦相似度(Cosine Similarity):用于度量两个向量之间的夹角,相似度越大,距离越小。公式为:

1.2 算法类型

  • 分类:将新样本分类到与其最相似的样本所属的类别。
  • 回归:预测新样本的数值为与其最相似的样本数值的加权平均。

二、k近邻算法(k-NN)

2.1 基本原理

k近邻算法通过查找与目标样本最近的k个样本进行预测。对于分类任务,k个邻居中的多数类作为预测结果;对于回归任务,k个邻居的平均值作为预测结果。k近邻算法无需训练过程,直接利用所有训练数据进行预测,因此也被称为懒惰学习算法(Lazy Learning)。

2.2 具体实现

以下是k近邻算法的分类实现:

import numpy as np
from collections import Counter
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_scoreclass KNN:def __init__(self, k=3):self.k = kdef fit(self, X, y):self.X_train = Xself.y_train = ydef predict(self, X):predictions = [self._predict(x) for x in X]return np.array(predictions)def _predict(self, x):distances = [np.sqrt(np.sum((x - x_train)**2)) for x_train in self.X_train]k_indices = np.argsort(distances)[:self.k]k_nearest_labels = [self.y_train[i] for i in k_indices]most_common = Counter(k_nearest_labels).most_common(1)return most_common[0][0]# 加载示例数据集
iris = load_iris()
X, y = iris.data, iris.target
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练和预测
knn = KNN(k=3)
knn.fit(X_train, y_train)
predictions = knn.predict(X_test)# 计算准确率
print("Accuracy:", accuracy_score(y_test, predictions))

2.3 优劣势

优势

  • 简单易懂:k近邻算法的基本思想简单直观,易于理解和实现。
  • 无训练过程:无需训练过程,直接利用所有训练数据进行预测。

劣势

  • 计算复杂度高:对每个测试样本都需要计算与所有训练样本的距离,因此预测过程的计算复杂度较高,适合小规模数据集。
  • 对噪声数据敏感:k近邻算法对噪声数据较为敏感,可能影响预测结果。
  • 数据标准化要求:不同特征的量纲不同时,需对数据进行标准化处理,否则距离计算可能会受到影响。

三、KD树(KD-Tree)

3.1 基本原理

KD树是一种对k近邻算法进行优化的数据结构,通过将数据划分到k维空间中的子区域,实现高效的最近邻搜索。KD树通过递归地将数据空间划分为k维超矩形,适用于低维数据的最近邻搜索。

3.2 具体实现

以下是KD树的实现和最近邻搜索:

from scipy.spatial import KDTree# 示例数据
X = np.random.rand(10, 2)# 构建KD树
kd_tree = KDTree(X)# 查询最近邻
point = np.random.rand(1, 2)
distance, index = kd_tree.query(point)print("Nearest neighbor:", X[index])
print("Distance:", distance)

3.3 优劣势

优势

  • 提高了k近邻搜索的效率:KD树通过分割数据空间,实现了快速的最近邻搜索,特别适合低维数据。
  • 支持动态插入和删除操作:KD树允许动态插入和删除数据点,适用于数据集动态变化的场景。

劣势

  • 构建和维护树结构的复杂度较高:构建KD树需要较高的计算复杂度,插入和删除操作也较为复杂。
  • 维度灾难:随着维度增加,KD树的性能提升有限,高维数据的最近邻搜索效果不佳。

四、球树(Ball Tree)

4.1 基本原理

球树是一种替代KD树的结构,通过使用超球体代替超矩形来划分空间,适用于高维数据和度量空间。球树通过递归地将数据空间划分为球形区域,实现高效的最近邻搜索。

4.2 具体实现

以下是球树的实现和最近邻搜索:

from sklearn.neighbors import BallTree# 示例数据
X = np.random.rand(10, 2)# 构建球树
ball_tree = BallTree(X)# 查询最近邻
point = np.random.rand(1, 2)
dist, ind = ball_tree.query(point)print("Nearest neighbor:", X[ind])
print("Distance:", dist)

4.3 优劣势

优势

  • 适用于高维数据:球树在高维空间中表现良好,比KD树更适合高维数据。
  • 支持多种距离度量:球树支持多种距离度量,如欧氏距离、曼哈顿距离等。

劣势

  • 构建和维护树结构的复杂度较高:构建和维护球树需要较高的计算复杂度,插入和删除操作也较为复杂。
  • 构建时间较长:随着数据规模增加,构建球树的时间较长。

五、应用实例

5.1 手写数字识别

使用k-NN算法进行手写数字识别:

from sklearn.datasets import load_digits
from sklearn.preprocessing import StandardScaler
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
from sklearn.neighbors import KNeighborsClassifier# 加载数据
digits = load_digits()
X, y = digits.data, digits.target# 预处理数据
scaler = StandardScaler()
X = scaler.fit_transform(X)# 分割数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)# 训练k-NN分类器
knn = KNeighborsClassifier(n_neighbors=3)
knn.fit(X_train, y_train)# 预测并计算准确率
predictions = knn.predict(X_test)
print("Accuracy:", accuracy_score(y_test, predictions))

5.2 图像检索

使用KD树进行图像特征的最近邻搜索:

from sklearn.decomposition import PCA
from sklearn.datasets import fetch_olivetti_faces
from scipy.spatial import KDTree# 加载数据
faces = fetch_olivetti_faces()
X, y = faces.data, faces.target# 降维
pca = PCA(n_components=50)
X_pca = pca.fit_transform(X)# 构建KD树
kd_tree = KDTree(X_pca)# 查询最近邻
query_image = X_pca[0].reshape(1, -1)
dist, ind = kd_tree.query(query_image, k=5)# 输出最近邻结果
print("Nearest neighbors:", ind)
print("Distances:", dist)

5.3 文章推荐

使用球树进行文章推荐:

from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.neighbors import BallTree# 示例文章
documents = ["The quick brown fox jumps over the lazy dog.","Never jump over the lazy dog quickly.","Bright vixens jump; dozy fowl quack.","Jinxed wizards pluck ivy from the big quilt.","The five boxing wizards jump quickly."
]# 计算TF-IDF特征
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(documents).toarray()# 构建球树
ball_tree = BallTree(X, metric='cosine')# 查询最近邻
query = vectorizer.transform(["Jumping over dogs is fun."]).toarray()
dist, ind = ball_tree.query(query, k=3)# 输出最近邻结果
print("Nearest neighbors:", ind)
print("Distances:", dist)

六、总结

近邻算法是一类基础且强大的分类和回归方法,广泛应用于图像识别、推荐系统等领域。本文详细介绍了k近邻算法(k-NN)、KD树(KD-Tree)、球树(Ball Tree)的基本原理、具体实现、优劣势及应用实例。通过这些算法的学习和应用,可以有效提高分类和回归任务的性能和精度。

拓展阅读与参考文献

  1. 《统计学习方法》 - 李航
  2. 《机器学习》 - 周志华
  3. 《模式分类》 - Duda, Hart, Stork
  4. Efficient Algorithms for Nearest Neighbor Search in High Dimensions - Arya, Mount, Netanyahu, Silverman, Wu (1998)
  5. Nearest Neighbors in High-Dimensional Data: The Efficiency-Accuracy Tradeoff - Indyk, Motwani (1998)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

通过el-tree自定义渲染网页版工作目录,实现鼠标悬浮显示完整名称、用icon区分文件和文件夹等需求

目录 一、通过el-tree自定义渲染网页版工作目录 1.1、需求介绍 1.2、使用el-tree生成文档目录 1.2.1、官方基础用法 ①效果 ②代码: 1.2.2、自定义文档目录(实现鼠标悬浮显示完整名称、用icon区分文件和文件夹) ①效果(直接效…

find 几招在 Linux 中高效地查找目录

1. 介绍 在 Linux 操作系统中,查找目录是一项常见的任务。无论是系统管理员还是普通用户,都可能需要查找特定的目录以执行各种操作,如导航文件系统、备份数据、删除文件等。Linux 提供了多种命令和工具来帮助我们在文件系统中快速找到目标目…

浅谈后端整合Springboot框架后操作基础配置

boot基础配置 现在不访问端口8080 可以吗 我们在默认启动的时候访问的是端口号8080 基于属性配置的 现在boot整合导致Tomcat服务器的配置文件没了 我们怎么去修改Tomcat服务器的配置信息呢 配置文件中的配置信息是很多很多的... 复制工程 保留工程的基础结构 抹掉原始…

朴素贝叶斯+SMSSpamCollections

1. 打开 Jupyter 后,在工作目录中,新建一个文件夹命名为 Test01 ,并且在文件夹中导入数据 集。在网页端界面点击 “upload” 按钮,在弹出的界面中选择要导入的数据集。然后数据集出现 在 jupyter 文件目录中,此时…

Vue.js Promise 与 async/await 的比较

在现代 Web 开发中,异步操作是不可避免的。在处理异步数据获取时,开发人员通常会使用 Promise 或 async/await。虽然两者都可以实现相同的功能,但它们在代码风格、可读性和错误处理等方面有所不同。本文将对这两种方法进行比较,并…

初识Qt:从Hello world到对象树的深度解析

Qt中的对象树深度解析 Hello world1.图形化界面创建命令行式创建在栈上创建在堆上创建为什么传文本需要QString,std::string不行吗?那为什么要传入this指针?为什么new后不用显示调用delete函数呢,不会造成内存泄漏问题吗&#xff…

python:__class_getitem__使用以及cached_property源码分析

python:__class_getitem__使用以及cached_property源码分析 1 前言 Python中如何模拟泛型类型? 当使用类型标注时,使用 Python 的方括号标记来形参化一个 generic type 往往会很有用处。 例如,list[int] 这样的标注可以被用来表…

深入 OpenFeign:探索缓存、QueryMap、MatrixVariable 和 CollectionFormat 的高级用法以实现优雅的远程调用

免费多模型AI网站,支持豆包、GPT-4o、谷歌Gemini等AI模型,无限制使用,快去白嫖👉海鲸AI 一、OpenFeign简介 OpenFeign 是一个声明式的 HTTP 客户端,它使得我们可以通过简单的注解和接口定义来调用远程 HTTP 服务。与传统的 HTTP …

K8S集群再搭建

前述:总体是非常简单的,就是过程繁琐,不过都是些重复的操作 master成员: [controller-manager, scheduler, api-server, etcd, proxy,kubelet] node成员: [kubelet, proxy] master要修改的配置文件有 1. vi /etc/etcd/etcd.conf # 数…

Mokito的一些API

Mockito是一个Java单元测试框架,它允许开发者创建和配置模拟对象(mock objects),以便在隔离的环境中测试代码,尤其是当实际对象难以构造或其行为不确定时。下面是一些核心的Mockito API及其使用场景和代码示例。 基础…

wordpress教程视频 wordpress教程网盘 wordpress教程推荐wordpress教程网

WordPress,作为一款强大且灵活的开源内容管理系统,已成为许多网站开发者与运营者的首选。其强大的功能、丰富的插件以及易于上手的特点,使得无论是初学者还是专业开发者都能轻松构建出个性化的网站。然而,对于初学者来说&#xff…

JUnit5标记测试用例

使用场景: 通过Tag对用例分组: 环境分组:测试环境、预发布环境阶段分组:冒烟用例版本分组:V1.1、V1.2 Tag标记用例: 设置标签根据标签执行 结合Maven执行结合测试套件执行 设置标签: 通过T…

NER 数据集格式转换

NER 数据集格式 格式一 某些地方的数据和标签拆成两个文件了 sentences.txt 如 何 解 决 足 球 界 长 期 存 在 的 诸 多 矛 盾 , 重 振 昔 日 津 门 足 球 的 雄 风 , 成 为 天 津 足 坛 上 下 内 外 到 处 议 论 的 话 题 。 该 县 一 手 抓 农 业…

【Spring Cloud】全面解析服务容错中间件 Sentinel 持久化两种模式

文章目录 推送模式本地文件持久化(拉模式)配置yml编写处理类添加配置演示 配置中心持久化(推模式)修改nacos在sentinel中生效引入依赖配置文件 修改sentinel在nacos中生效下载源码更改代码演示 总结 推送模式 Sentinel 规则的推送…

allegro 无法删除Xnet

allegro 无法删除Xnet Orcad中打开Constraint Manager之后,再生成网表,导入PCB后就会出现一堆Xnet网络。无法去除Xnet。 解决办法 在原理图ORCAD中, 1、打开Edit Object properties 2、选择Filter by:Capture 3、点击New Property 4、设置…

火山引擎边缘云亮相 Force 原动力大会,探索 AI 应用新范式

5月15日,2024 春季火山引擎 FORCE 原动力大会在北京正式举办。大会聚焦 AI 主题,以大模型应用为核心、以 AI 落地为导向,展示了火山引擎在大模型、云计算领域的实践应用,携手汽车、手机终端、金融、消费、互联网等领域的专家和企业…

2024042102-array-list

数组 Array 一、前言 数组是数据结构还是数据类型? 数组只是个名称,它可以描述一组操作,也可以命名这组操作。数组的数据操作,是通过 idx->val 的方式来处理。它不是具体要求内存上要存储着连续的数据才叫数据,而…

js积累三(web页面一段时间未操作,退出登录)

//核心代码,已封装function CountDownLogout() {/* if 30 seconds no operation then logout */var maxTime 30; // seconds,可自行修改时长var time_time maxTime;/* 鼠标点击事件 */$(document).mousedown(function(){time_time maxTime; //…

Spring Aop对本地事务的影响

1.Transactional声明式事物也是基于aop实现的,public方法加了Transactional注解后,已经成功的创建了事务,但是当前方法仍在方法拦截器中 2.业务方法发生异常之后的处理 判断回滚条件: 如果自定义了RollbackRuleAttribute列表&am…

EI会议的最佳论文奖是什么?如何申请?

EI会议的最佳论文奖通常是指在EI(工程索引,Engineering Index)收录的学术会议中,评选出的表现最优秀的论文奖项。以下是关于该奖项的一些基本信息及申请步骤: 最佳论文奖的含义 评选标准:最佳论文奖通常基…