近临算法(个人总结版)

news2024/11/24 12:56:13

背景

近邻算法(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_score

class KNN:
    def __init__(self, k=3):
        self.k = k

    def fit(self, X, y):
        self.X_train = X
        self.y_train = y

    def 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.coloradmin.cn/o/1689673.html

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

相关文章

DVWA登录页面空白问题解决

问题: 创建完成后打开登录页面,发现打不开,一片空白 解决: php版本不对,更换版本即可

VueHooks Plus:Vue 3 Hooks 的全面解决方案

VueHooks Plus:Vue 3 Hooks 的全面解决方案 文章目录 VueHooks Plus:Vue 3 Hooks 的全面解决方案〇、元信息一、概述快速开始TypeScript 支持交互式 Demo 演示服务器端渲染(SSR)支持基于插件模式的请求函数按需加载安全性和测试 二…

PHP生成二维码+二维码包含logo图片展示

composer require chillerlan/php-qrcode 用到的扩展自己安装(注:只生成二维码只要开gd扩展就行) 仅生成二维码看这个: use chillerlan\QRCode\QRCode;public function QRCode(){$qrcode new QRCode();$url "http://ww…

如何利用51建模网,实现3D模型线上展示和应用?

按照下面的步骤,在51建模网上传3D模型,并编辑完成后,接下来就是如何让这些3D模型得到更好的展示、传播和应用。 一、3D内容快速分享与传播 3D模型在51建模网上传发布后,即可获得一个可分享的链接和二维码,直接分享给客…

jenkins插件之Warnings

Warnings插件,收集静态分析工具报告的编译器警告或问题,并将结果可视化。它内置了对许多编译器的支持(cpp,clang,java等)和工具(spotbugs,pmd,checkstyle,esl…

力扣226. 翻转二叉树(DFS的两种思路)

Problem: 226. 翻转二叉树 文章目录 题目描述思路复杂度Code 题目描述 思路 涉及二叉树的递归解法时往往需要考虑两种思路: 1.在递归遍历时执行题目需要的具体要求; 2.将一个大问题分解为多个小子问题 具体到本体: 思路1:遍历 先…

作业-day-240521

多点思维导图 面试题 1、项目中如何实现TCP的并发 1)、一般的TCP服务器通信,只能完成一个客户端的操作。要实现多客户端的通信,可使服务器端循环创建并收发客户端的通信。 2)、但仅循环服务器使用的情况,由于accept…

股指期权和股指期货的区别

今天期权懂带你了解股指期权和股指期货的区别。在金融衍生品市场,既有股指期货又有股指期权,期货与期权是两种不同的资产。 股指期权和股指期货的区别 权利与义务: 股指期货是一种协议,买卖双方都有义务在合约到期时按照约定的价…

CSS demo演示 20240524

说明&#xff1a;不修改父盒子的样式&#xff0c;只在子盒子上设置定位&#xff0c;让子盒子定位在父盒子右侧。 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>Document</title><style>…

CGAN|生成手势图像|可控制生成

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f366; 参考文章&#xff1a;TensorFlow入门实战&#xff5c;第3周&#xff1a;天气识别&#x1f356; 原作者&#xff1a;K同学啊|接辅导、项目定制 CGAN&#xff08;条件生成对抗网络&#xf…

项目十二:简单的python基础爬虫训练

许久未见&#xff0c;甚是想念&#xff0c;今日好运&#xff0c;为你带好运。ok&#xff0c;废话不多说&#xff0c;希望这门案例能带你直接快速了解并运用。&#x1f381;&#x1f496; 基础流程 第一步&#xff1a;安装需要用到的requests库&#xff0c;命令如下 pip inst…

Vue3实战笔记(41)—自己封装一个计时器Hooks

文章目录 前言计时器钩子总结 前言 在Vue项目中&#xff0c;封装一个计时器挂钩&#xff08;Hook&#xff09;是一种实用的技术&#xff0c;它允许你在组件中方便地管理定时任务&#xff0c;如倒计时、计时器等&#xff0c;而无需在每个使用场景重复编写相同的逻辑代码。 计时…

uniapp如何使用自定义的图标

http://t.csdnimg.cn/8KenC 以上是原文章,下面内容是从这篇文章转发的 一、导入 1.在官方&#xff08;iconfont-阿里巴巴矢量图标库&#xff09;选择自己想要的图标&#xff0c;加入购物车 2. 在点击购物车下载代码 3.解压文件夹 并更改名字 4.将文件夹&#xff08;iconfont&…

Xline社区会议Call Up|在 CURP 算法中实现联合共识的安全性

为了更全面地向大家介绍Xline的进展&#xff0c;同时促进Xline社区的发展&#xff0c;我们将于2024年5月31日北京时间11:00 p.m.召开Xline社区会议。 欢迎您届时登陆zoom观看直播&#xff0c;或点击“阅读原文”链接加入会议&#xff1a; 会议号: 832 1086 6737 密码: 41125…

软件开发成本估算 5大注意事项

一般来说&#xff0c;软件开发成本估算分为&#xff1a;软件规模估算、工作量估算、成本估算和确定软件开发成本等四个过程&#xff0c;其估算基本流程如下&#xff1a; 软件开发成本估算流程 为了进一步确保估算的准确性&#xff0c;提高资源规划和分配效率&#xff0c;确保软…

Redis篇 在linux系统上安装Redis

安装Redis 在Ubuntu上安装Redis 在Ubuntu上安装Redis 在linux系统中,我们安装Redis,必须先使它有root权限. 那么在linux中,如何切换到root用户权限呢? sudo su 就可切换到用户权限了. 在切换到用户权限后,我们需要用一条命令来搜索Redis相关的软件包 apt search redis 会出现非…

Labelme自定义数据集COCO格式【实例分割】

参考博客 labelme标注自定义数据集COCO类型_labelme标注coco-CSDN博客 LabelMe使用_labelme中所有的create的作用解释-CSDN博客 1制作自己的数据集 1.1labelme安装 自己的数据和上面数据的区别就在于没有.json标签文件&#xff0c;所以训练自己的数据关键步骤就是获取标签文…

x264 码率控制原理:rate_estimate_qscale 函数

rate_estimate_qscale 函数 原理 函数功能:根据目前使用的实际比特数更新一帧的qscale;是一个复杂的决策过程,需要考虑多种因素,如帧类型、编码的复杂度、目标比特率、缓冲区大小等,以确保视频质量和文件大小之间的平衡。函数参数分析:x264_t *h :编码器上下文信息结构…

UDEV规则配置usb摄像头

参考自:【linux】linux下摄像头设置固定的设备名-udev_linux 摄像头的设备文件名-CSDN博客 UDEV规则 在Linux系统中&#xff0c;UDEV&#xff08;Userspace DEV&#xff09;是一个用于管理设备节点和/dev目录下设备文件的动态设备管理器。当你连接USB摄像头或其他USB设备时&am…

【ai】chatgpt的plugin已经废弃

发现找不到按钮,原来是要申请: https://openai.com/index/chatgpt-plugins/ 发现申请已经跳转了,好像是废弃了? 不接受新插件了,但是openai的api 是可以继续用的。 https://openai.com/waitlist/plugins/We are no longer accepting new Plugins, builders can now create…