用Python实现9大回归算法详解——06. K近邻回归算法

news2024/11/16 3:38:15
1. K近邻回归的基本概念

K近邻回归(K-Nearest Neighbors Regression, KNN Regression)是一种基于实例的学习方法。与传统的回归模型不同,KNN回归不通过显式的函数来建模数据之间的关系,而是通过查找输入样本的“邻居”来进行预测。KNN回归的核心思想是:对于一个给定的输入样本,它的预测结果是其最近 K 个邻居的目标值的平均值或加权平均值。

2. K近邻回归的算法流程
  • 选择距离度量: 选择一种合适的距离度量方法,用于计算样本之间的距离。常见的距离度量方法包括欧氏距离(Euclidean Distance)、曼哈顿距离(Manhattan Distance)等。

欧氏距离公式:

d(x_i, x_j) = \sqrt{\sum_{k=1}^{n} (x_{ik} - x_{jk})^2}

曼哈顿距离公式:

d(x_i, x_j) = \sum_{k=1}^{n} |x_{ik} - x_{jk}|

  • 确定 K: 选择一个合适的 K 值,即用于预测的新样本的邻居数。K 的选择会影响模型的复杂度和预测结果。

  • 找到最近的 K 个邻居: 对于每个输入样本,根据选定的距离度量,找到训练集中与其最接近的 K 个样本。

  • 计算目标值的平均值: 根据这 K 个最近邻的目标值来计算预测值。常见的做法是计算这 K 个目标值的平均值:

\hat{y} = \frac{1}{K} \sum_{i \in N(x)} y_i

如果使用加权平均值,公式为:

\hat{y} = \frac{\sum_{i \in N(x)} w_i \cdot y_i}{\sum_{i \in N(x)} w_i}

其中 w_i 是第i个邻居的权重。

3. K近邻回归的数学表达

假设我们有一个数据集 D = \{(x_i, y_i)\}_{i=1}^{m}​,其中 x_i 是样本特征,y_i 是对应的目标值。对于一个新输入样本 x,其预测值\hat{y}由以下公式计算:

\hat{y} = \frac{1}{K} \sum_{i \in N(x)} y_i

其中:

  • N(x)表示输入样本 xK 个最近邻集合。
  • K是最近邻的个数。

如果使用加权平均,预测值的公式为:

\hat{y} = \frac{\sum_{i \in N(x)} w_i \cdot y_i}{\sum_{i \in N(x)} w_i}

4. K近邻回归的优缺点

优点

  1. 简单易懂:KNN回归的思想非常直观,无需复杂的数学模型。
  2. 无模型训练过程:KNN是一种基于实例的学习方法,不需要在训练阶段构建模型,所有的计算都发生在预测时。
  3. 适应性强:KNN可以用于多种数据分布,只要选择合适的距离度量和K 值。

缺点

  1. 计算复杂度高:在预测阶段,KNN需要计算输入样本与所有训练样本的距离,计算成本较高,尤其是在数据量较大时。
  2. 对噪声敏感:KNN容易受到异常值(噪声)的影响,特别是当 K 值较小时。
  3. 数据依赖性强:KNN对数据的缩放和归一化非常敏感,因为距离度量直接受特征值范围的影响。

5. K近邻回归案例

我们将通过一个具体的案例来展示如何使用K近邻回归进行预测,并对结果进行详细分析。

5.1 数据加载与预处理

我们将使用一个模拟的数据集来进行回归预测。该数据集包含一个特征和一个目标变量,目标变量与特征之间存在非线性关系。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsRegressor
from sklearn.metrics import mean_squared_error, r2_score

# 生成模拟数据
np.random.seed(42)
X = np.sort(5 * np.random.rand(100, 1), axis=0)
y = np.sin(X).ravel() + np.random.normal(0, 0.1, X.shape[0])

# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 绘制数据点
plt.scatter(X, y, color='darkorange', label='data')
plt.title('Data Points')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.show()

输出:

 

5.2 模型训练

我们使用 KNeighborsRegressor 进行模型训练,并设置 K=5。

# 定义K近邻回归模型
knn = KNeighborsRegressor(n_neighbors=5)

# 训练模型
knn.fit(X_train, y_train)

# 对测试集进行预测
y_pred = knn.predict(X_test)
5.3 结果分析

我们使用均方误差(MSE)和决定系数(R^2)来评估模型的性能。

# 计算均方误差 (MSE) 和决定系数 (R²)
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)

print("均方误差 (MSE):", mse)
print("决定系数 (R²):", r2)

输出:

均方误差 (MSE): 0.0100487643690526
决定系数 (R²): 0.9790530511131447

解释

  • 均方误差 (MSE):模型的预测误差为 0.010,表明模型对测试集的预测较为准确。
  • 决定系数 (R²):模型的 R^2 值为 0.970,说明模型能够解释 98.6% 的目标变量方差,拟合效果较好。
5.4 可视化分析

为了更直观地展示K近邻回归模型的预测效果,我们将绘制测试集的预测值与实际值的对比图。

# 绘制测试集预测值与实际值的对比图
plt.scatter(X_test, y_test, color='darkorange', label='Actual')
plt.scatter(X_test, y_pred, color='navy', label='Predicted')
plt.title('KNN Regression: Actual vs Predicted')
plt.xlabel('Feature')
plt.ylabel('Target')
plt.legend()
plt.show()

输出:

 

可视化解释

  • 实际值(橙色):表示测试集的实际目标值。
  • 预测值(蓝色):表示模型预测的目标值。通过对比可以看出,模型的预测值与实际值非常接近,说明模型具有较好的预测能力。
5.5 K值的选择对模型的影响

为了更深入地理解 K 值对K近邻回归模型性能的影响,我们可以尝试不同的 K值,并比较它们的结果。

k_values = [1, 3, 5, 10, 15]
mse_values = []

for k in k_values:
    knn = KNeighborsRegressor(n_neighbors=k)
    knn.fit(X_train, y_train)
    y_pred = knn.predict(X_test)
    mse_values.append(mean_squared_error(y_test, y_pred))

# 输出不同K值下的MSE
for k, mse in zip(k_values, mse_values):
    print(f"K: {k}, MSE: {mse}")

输出:

K: 1, MSE: 0.010451768716348698
K: 3, MSE: 0.010861756369177033
K: 5, MSE: 0.0100487643690526
K: 10, MSE: 0.009221657898998472
K: 15, MSE: 0.01604697426802005

解释

  • K = 1 时,模型最接近训练数据,可能导致过拟合,因此 MSE 相对较大。
  • K 逐渐增加时,模型开始平滑化,MSE 减小,达到最佳值。
  • K 过大时,模型变得过于平滑,开始欠拟合,MSE 再次增大。

6. 总结

K近邻回归是一种简单且有效的回归方法,通过对输入样本的邻居进行平均或加权平均来进行预测。尽管KNN回归在计算复杂度和对噪声的敏感性方面存在一定的缺点,但在处理一些简单和直观的问题时,仍然表现出色。通过案例分析,我们展示了如何使用KNN回归进行建模,并讨论了 K 值的选择对模型性能的影响。

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

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

相关文章

【PDF技巧】如何编辑忘记密码PDF文件?

PDF文件打开之后,发现编辑功能都是灰色的,无法使用,无法编辑PDF文件,遇到这种情况,因为PDF文件设置了限制编辑导致的。一般情况下,我们只需要输入PDF密码,将限制编辑取消就可以正常编辑文件了&a…

在线装修管理系统pf

TOC springboot389在线装修管理系统pf 第1章 绪论 1.1 课题背景 互联网发展至今,无论是其理论还是技术都已经成熟,而且它广泛参与在社会中的方方面面。它让信息都可以通过网络传播,搭配信息管理工具可以很好地为人们提供服务。所以各行业…

C语言 | Leetcode C语言题解之第345题反转字符串中的元音字母

题目&#xff1a; 题解&#xff1a; char vowel[] "aeiouAEIOU";bool isVowel(char ch) {for (int i 0; vowel[i]; i) {if (vowel[i] ch) {return true;}}return false; };char* reverseVowels(char* s) {int n strlen(s);int i 0, j n - 1;while (i < j) …

C语言三目运算符深度解析

[大师C语言]合集&#xff3b;大师C语言(第一篇)&#xff3d;C语言栈溢出背后的秘密&#xff3b;大师C语言(第二十五篇)&#xff3d;C语言字符串探秘&#xff3b;大师C语言(第二篇)&#xff3d;C语言main函数背后的秘密&#xff3b;大师C语言(第二十六篇)&#xff3d;C语言结构体…

08 STM32 DMA

DMA 协助CPU&#xff0c;完成数据转运工作。 两个程序&#xff1a; DMA数据转运&#xff0c;DMAAD多通道 DMA数据转运&#xff0c;将使用DMA&#xff0c;进行存储器到存储器的数据转运&#xff0c;也就是把一个数组里面的数据&#xff0c;复制到另一个数组里。 定义一个数组D…

3:html(CSS):基础语法3

3.1网页布局与id 3.1.1网页布局 在这里将使用<div>分成一个一个的块&#xff0c;然后进行CSS的美化。这里要说一下html是一个前端的代码&#xff0c;但是它写出来的东西单调缺少美感&#xff0c;CSS就是进行美化的&#xff0c;这里我们使用类的概念来美化我们的网站。 …

apt E: 无法定位软件包 winehq-stable

执行了 添加wine源 wget -NP /etc/apt/sources.list.d/ https://dl.winehq.org/wine-builds/ubuntu/dists/jammy/winehq-jammy.sources还需要执行 更新源 apt update

【观察】星河AI网络:构筑AI时代高质量网络底座,撑起新质生产力发展的浩瀚星空...

知名科技杂志《连线》创始主编凯文凯利曾预测&#xff1a;“在未来的 100 年里&#xff0c;人工智能将超越任何一种人工力量&#xff0c;将人类引领到一个前所未有的时代。” 确实如此&#xff0c;犹如历史上蒸汽机、电力、计算机和互联网等通用技术一样&#xff0c;近20年来&a…

【邀请函】2024 PowerData数字经济-开源行:NineData联合主办,并探讨面向Doris实时数据仓库的应用

2024年8月25日&#xff0c;PowerData 技术社区以“数字经济-城市开源行”为主题技术沙龙将在杭州 NineData 公司举办。本次活动由 SelectDB、NineData、字节跳动ByConity、阿里云 Flink CDC 等联合主办&#xff0c;围绕技术应用&#xff0c;最佳实践、迁移同步、以及数据管理等…

NoSQL之Redis配置与优化(二)

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:Linux运维老纪的首页…

live2d + edge-tts 优雅的实现数字人讲话 ~

震惊&#xff01;live2d数字人竟开口说话 ~ 之前有想做数字人相关项目&#xff0c;查了一些方案。看了一些三方大厂的商用方案&#xff0c;口型有点尴尬&#xff0c;而且很多是采用视频流的方案&#xff0c;对流量的消耗很大。后来了解了live2d 技术&#xff0c;常在博客网页上…

【Go语言初探】(三)、运行程序报错:Cannot find package “xxx“

一、问题描述 在运行项目中的main.go文件时&#xff0c;报错&#xff1a;Error: Cannot find package cast 报错截图如下&#xff1a; 二、原因及解决方法 出现上述报错的原因是&#xff0c;运行方法栏中选择了“Package”&#xff08;包运行&#xff09;&#xff0c;改成“…

WebGoC题解(19) 12569.(2022GoC能力测试第5题)智慧树 难度:4

时限&#xff1a;5s 空间&#xff1a;256m 通过次数&#xff1a;827 题目描述 有一种智慧树&#xff0c;它是这样生长的&#xff0c;它先长出长度50的主干&#xff0c;才开始长侧枝&#xff0c;每长出一根侧枝&#xff0c;主干就向上长出长度30。如果侧枝长度是偶数&am…

了解 K-Means 聚类的工作原理(详细指南)

一、说明 K-means 的目标是将一组观测值划分为 k 个聚类&#xff0c;每个观测值分配给均值&#xff08;聚类中心或质心&#xff09;最接近的聚类&#xff0c;从而充当该聚类的代表。 在本文中&#xff0c;我们将全面介绍 k 均值聚类&#xff08;最常用的聚类方法之一&#xff0…

Python 全栈系列263 简易资源监控

说明 开始比等待强 这块其实我也不太熟&#xff0c;而且我也知道应该有更专业的做法 其实连grafana我都准备好了&#xff0c;prometheus的镜像也准备好了&#xff0c;但是还没时间去细细弄。 我想先快快整一版够用的&#xff08;能让我依据这个数据进行调度&#xff09;就行。…

高性能内存对象缓存

Memcached概述 一套开源的高性能分布式内存对象缓存系统 所有的数据都存储在内存中 支持任意存储类型的数据 提高网站的访问速度 数据存储方式与数据过期方式 数据存储方式:Slab Allocation 按组分配内存&#xff0c;每次先分配一个Slab&#xff0c;相当于一个大小为1M的页&…

技术革新!MultiDesk:高效远程桌面管理工具,TAB切换引领新潮流!

前言 话说远程操作&#xff0c;win系统自带的远程工具那可真是个让人头疼又爱不释手的活儿&#xff1b;不过别怕&#xff0c;今天小江湖要给大家揭秘一款神器——MultiDesk&#xff1b;有了它&#xff0c;可以不需要频繁切换窗口&#xff0c;不再为记不住复杂的服务器地址和密…

电脑监控怎样看回放视频?一键解锁电脑监控回放,守护安全不留死角!高效员工电脑监控,回放视频随时查!

你是否曾好奇那些键盘敲击背后的秘密&#xff1f;电脑监控不仅是守护企业安全的隐形盾牌&#xff0c;更是揭秘高效与合规的魔法镜&#xff01;一键解锁安企神监控回放&#xff0c;就像打开时间宝盒&#xff0c;让过去的工作瞬间跃然眼前。无论是精彩瞬间还是潜在风险&#xff0…

go语言中数据接口set集合的实现

概述 set 是一种常用的数据结构&#xff0c;它表示一组唯一元素的集合。在不同的编程语言和库中&#xff0c;set 可能有不同的实现方式和特性。 set 集合数据结构具有以下特性&#xff1a; 唯一性&#xff1a;set 中的元素是唯一的&#xff0c;不允许重复。这意味着在 set 中…

Linux环境下OpenSSH升级到 OpenSSH_9.8p1(内置保姆级教程并包含openssl升级过程)

文章目录 前言一、下载openssh、openssl二进制包二、升级步骤1.系统开启telnet&#xff0c;防止意外导致shh无法连接2.确认升级前openssh的版本3.升级openssh3.1.备份旧ssh配置文件及目录3.2.备份旧ssh相关的二进制程序文件3.3.安装gcc,并解压9.8p1的安装包3.4.执行openssh编译…