当前位置: 首页 > article >正文

机器学习之 KNN 算法

一、引言

在机器学习领域中,K 近邻(K-Nearest Neighbors,KNN)算法是一种简单而有效的分类和回归算法。它的基本思想是根据数据点之间的距离来确定它们的相似性,并根据其最近的邻居的类别或数值来预测新数据点的类别或数值。本文将对 KNN 算法进行详细解析,包括算法原理、数学基础、实现步骤以及实际例子讲解。

二、KNN 算法原理

1. 基本概念

KNN 算法是一种基于实例的学习算法,它不需要显式地学习一个模型,而是通过存储所有的训练数据,并在需要预测新数据点的类别或数值时,计算新数据点与训练数据点之间的距离,找到距离最近的 K 个邻居,然后根据这 K 个邻居的类别或数值来预测新数据点的类别或数值。

2. 距离度量

在 KNN 算法中,距离度量是用来衡量数据点之间的相似性的重要指标。常用的距离度量方法有欧氏距离、曼哈顿距离、余弦距离等。

3. K 值的选择

K 值是 KNN 算法中的一个重要参数,它决定了算法在预测新数据点时所考虑的邻居数量。K 值的选择对算法的性能有很大的影响。如果 K 值过小,算法容易受到噪声数据的影响,导致过拟合;如果 K 值过大,算法的预测结果可能会过于平滑,导致欠拟合。

一般来说,可以通过交叉验证等方法来选择合适的 K 值。在实际应用中,可以先尝试不同的 K 值,然后根据算法的性能指标(如准确率、召回率、F1 值等)来选择最佳的 K 值。

4. 分类和回归

KNN 算法可以用于分类和回归问题。在分类问题中,算法根据新数据点的 K 个最近邻居的类别来预测新数据点的类别。通常采用多数表决的方法,即新数据点的类别为其 K 个最近邻居中出现次数最多的类别。

在回归问题中,算法根据新数据点的 K 个最近邻居的数值来预测新数据点的数值。通常采用平均的方法,即新数据点的数值为其 K 个最近邻居的数值的平均值。

三、KNN 算法的数学基础

1. 向量空间模型

KNN 算法的数学基础之一是向量空间模型。在向量空间模型中,每个数据点都被表示为一个向量,向量的维度等于数据点的特征数量。通过计算向量之间的距离,可以衡量数据点之间的相似性。

2. 概率理论

3. 优化理论

在 KNN 算法中,选择合适的 K 值可以通过优化理论来解决。一种常用的方法是通过交叉验证来选择最佳的 K 值。交叉验证是一种将数据集分成多个子集,然后在每个子集上进行训练和测试的方法。通过比较不同 K 值下的算法性能,可以选择最佳的 K 值。

四、KNN 算法的实现步骤

1. 数据预处理

在应用 KNN 算法之前,需要对数据进行预处理,包括数据清洗、特征选择、特征缩放等。数据清洗是指去除数据中的噪声和异常值,特征选择是指选择对分类或回归任务最有帮助的特征,特征缩放是指将特征的值缩放到一个特定的范围内,以提高算法的性能。

2. 计算距离

对于一个新数据点,需要计算它与所有训练数据点之间的距离。根据选择的距离度量方法,可以使用相应的公式来计算距离。

3. 选择 K 个最近邻居

根据计算得到的距离,选择距离新数据点最近的 K 个训练数据点作为新数据点的邻居。可以使用排序算法来快速选择 K 个最近邻居。

4. 预测类别或数值

根据选择的 K 个最近邻居的类别或数值,采用多数表决或平均的方法来预测新数据点的类别或数值。

5. 评估算法性能

使用测试数据集来评估 KNN 算法的性能。可以使用准确率、召回率、F1 值等指标来评估分类算法的性能,使用均方误差、平均绝对误差等指标来评估回归算法的性能。

五、实际例子讲解

1. 分类问题实例

假设我们有一个鸢尾花数据集,其中包含三种不同类型的鸢尾花(Setosa、Versicolor 和 Virginica),每个鸢尾花样本都有四个特征(花萼长度、花萼宽度、花瓣长度、花瓣宽度)。我们的任务是使用 KNN 算法对新的鸢尾花样本进行分类。

以下是使用 Python 实现 KNN 分类的示例代码:

import numpy as np

import pandas as pd

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsClassifier

from sklearn.metrics import accuracy_score

# 加载鸢尾花数据集

iris = load_iris()

X = iris.data

y = iris.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 KNN 分类器

knn = KNeighborsClassifier(n_neighbors=3)

# 训练分类器

knn.fit(X_train, y_train)

# 预测测试集

y_pred = knn.predict(X_test)

# 计算准确率

accuracy = accuracy_score(y_test, y_pred)

print(f"准确率:{accuracy}")

在这个例子中,我们首先加载了鸢尾花数据集,然后将数据集划分为训练集和测试集。接着,我们创建了一个 KNN 分类器,并设置 K 值为 3。然后,我们使用训练集对分类器进行训练,并使用测试集进行预测。最后,我们计算了预测结果的准确率。

2. 回归问题实例

假设我们有一个房价数据集,其中包含房屋的面积、卧室数量、卫生间数量等特征,以及房屋的价格。我们的任务是使用 KNN 算法对新的房屋样本进行价格预测。

以下是使用 Python 实现 KNN 回归的示例代码:

import numpy as np

import pandas as pd

from sklearn.datasets import load_boston

from sklearn.model_selection import train_test_split

from sklearn.neighbors import KNeighborsRegressor

from sklearn.metrics import mean_squared_error

# 加载房价数据集

boston = load_boston()

X = boston.data

y = boston.target

# 划分训练集和测试集

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 创建 KNN 回归器

knn = KNeighborsRegressor(n_neighbors=3)

# 训练回归器

knn.fit(X_train, y_train)

# 预测测试集

y_pred = knn.predict(X_test)

# 计算均方误差

mse = mean_squared_error(y_test, y_pred)

print(f"均方误差:{mse}")

在这个例子中,我们首先加载了房价数据集,然后将数据集划分为训练集和测试集。接着,我们创建了一个 KNN 回归器,并设置 K 值为 3。然后,我们使用训练集对回归器进行训练,并使用测试集进行预测。最后,我们计算了预测结果的均方误差。

六、总结

KNN 算法是一种简单而有效的机器学习算法,它基于数据点之间的距离来进行分类和回归。在实际应用中,需要对数据进行预处理,选择合适的距离度量方法和 K 值,并评估算法的性能。通过本文的介绍,相信读者对 KNN 算法有了更深入的理解,可以在实际项目中应用 KNN 算法来解决分类和回归问题。


http://www.kler.cn/a/450189.html

相关文章:

  • 汽车IVI中控开发入门及进阶(44):杰发科智能座舱芯片
  • JAVA开发入门学习七- 数组
  • conda 环境报错error while loading shared libraries: libpython3.9.so.1.0
  • 本科阶段最后一次竞赛Vlog——2024年智能车大赛智慧医疗组准备全过程——13使用Resnet-Bin
  • 我用Cursor+DeepSeek做了个飞书文档一键同步插件,免费使用!
  • 工业摄像机基于电荷耦合器件的相机
  • Axios 取消上一次重复请求
  • DELL EMC Unity 存储系统扩容之如何查看pool类型
  • Java 异常
  • Next.js 14 数据处理:从服务端组件到状态管理的最佳实践
  • Vue.js前端框架教程11:Vue监听器watch和watchEffect
  • MATLAB直接推导函数的导函数和积分形式(具体方法和用例)
  • JAVA开发 在 Spring Boot 中集成 Swagger
  • 人的心理特征
  • PMO转型提升汽车销售效率:看板工具的关键作用
  • 关于 K8s 的一些基础概念整理-补充【k8s系列之二】
  • 石岩基督教福音堂
  • 【CryptoJS库AES加密】
  • 蓝牙协议——音乐启停控制
  • sward - 一款国产开源免费的企业级知识库管理工具
  • SOME/IP 协议详解——信息格式
  • 构建安全的用户认证系统:PHP实现
  • Ubuntu下通过Docker部署NGINX服务器
  • 如何实现一个充满科技感的官网(一)
  • kafka sasl和acl之间的关系
  • LeNet网络搭建