KNN算法回归问题介绍和实现

news2025/1/12 19:47:44

上篇博客中,介绍了使用KNN算法实现分类问题,本篇文章介绍使用KNN算法实现回归问题。介绍思路是先使用sklearn包提供的方法实现一个KNN算法的回归问题。再自定义实现一个KNN算法的回归问题工具类。

一、sklearn包使用KNN算法

1. 准备数据

使用sklearn包提供的make_regression模块制作回归类型数据。

from sklearn.datasets import make_regression

除了make_regession外,sklearn包还提供了制作分类问题的数据等方法,如下图:
在这里插入图片描述
我们在需要测试数据时,可以根据需求引入不同的模块来创建数据。
生成数据:

X, y = make_regression(n_samples=10000, n_features=20, n_informative=15, random_state=0)

其中,n_samples是样本数,n_features是每个样本的特征数,n_informative是有效特征数,random_state是随机生成数的种子,种子相同,生成的X和y的值都相同。
回归问题生成的X,均值接近0,标准差接近1,是去中心化后的数据。而分类问题生成的数据,就不具有此特点,如下所示为make_regression生成的数据:

X.mean() #0.0033349709157105382
X.std() #0.998015035291231

2. 切分数据

使用sklearn提供的train_test_split方法对生成的数据进行切分:

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=0)

3. 使用sklearn包进行KNN回归问题的验证

from sklearn.neighbors import KNeighborsRegressor
# 第一步,构建模型
knn = KNeighborsRegressor(n_neighbors=7)
# 第二步,训练模型
knn.fit(X=X_train, y=y_train)
#第三步,模拟测试
y_pred = knn.predict(X =X_test)
#第四步,使用MSE评测预测结果
((y_test - y_pred)**2).mean()

首先需要知道的是,单独看最后MSE的计算结果的大小,不代表预测准确与否。而是要通过调整进邻的参数,来比较不同近邻下MSE的结果,来看选择哪个近邻参数最合适。而对于现实问题,是否要用KNN的回归问题算法来解决,是另当别论的,不能通过MSE的结果去判断是否用KNN算法正确与否。

MSE: 求预测结果与实际结果的差值的绝对值(平方),然后再求差值绝对值的平均数。具体MSE的含义和定义,参考通俗易懂讲解均方误差 (MSE)

在回归问题中,一般使用MSE表示预测结果。在分类问题中,使用预测值=实际值的平均数[(y_predict == y_test).mean()]表示预测结果。

二、自定义回归问题实现

class MyKNeighborsRegressor(object):
    """
        自定义KNN 回归器
    """
    def __init__(self, n_neighbors=5):
        """
            挂载超参数
        """
        self.n_neighbors=n_neighbors
    
    def fit(self, X, y):
        """
            训练过程
        """
        self.X = np.array(X)
        self.y = np.array(y)
    
    def predict(self, X):
        X = np.array(X)
        results = []
        for x in X:
        	# 计算两个向量之间的距离,sqrt((x1-x2)**2+(y1-y2)**2+......)。x是行向量,self.X是测试用例的矩阵,self.X-x用到了向量的广播机制,进行对齐然后相减。由此计算出来的距离是测试集中单个向量与训练集中所有行向量的距离
            distances = ((self.X - x) ** 2).sum(axis=1)
            #选出距离最近的向量的脚标
            indices = distances.argsort(axis=0)[:self.n_neighbors]
            #根据脚标获取训练集中的对应脚本的元素
            labels = self.y[indices]
            # 取距离最近的训练集的标签,然后求均值,就是回归问题的预测结果
            y_pred = labels.mean()
            results.append(y_pred)
        return np.array(results)

三、总结

对比KNN算法的分类问题和回归问题的自定义实现,需要捋清楚几点:

  1. 对于上面的例子而言,样本矩阵就是一个二维数组,二维数组中的每个一维数组,就是一行,每列都代表一个特征。而一行样本数据,都会对应一个标签值,即y。
  2. 使用KNN算法,就是将训练数据中的样本数据和标签数据提供给模型后,在预测测试数据时,模型根据测试数据的每行样本,去查找之前提供的训练数据中所有的样本中,距离这个测试数据样本最近的n个训练样本数据。
  3. 找到邻近的n个训练样本数据后,找出这n个训练样本数据对应的标签值。然后在分类问题中,找出n个训练样本对应标签值中最多的那个标签,就认为是测试这条测试样本的标签值。在回归问题中,找出n个训练样本对应的标签后,求这些标签的均值,就认为是当前测试样本的标签。
  4. 上述是针对测试样本中每个向量的处理逻辑,当循环找出所有测试样本的标签值后,就可以返回总体的预测数据了。
  5. 最后通过预测数据与真实数据比对,查看是否适合用KNN算法以及近邻参数如何设置最准确。

因此,KNN算法的核心理念是通过找邻近训练样本的标签,来推算测试样本的标签进行返回。

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

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

相关文章

【C++基础】观察者模式(“发布-订阅”模式)

本文参考:观察者模式 - 摩根斯 | 爱编程的大丙 观察者模式允许我们定义一种订阅机制,可在对象事件发生时通知所有的观察者对象,使它们能够自动更新。观察者模式还有另外一个名字叫做“发布-订阅”模式。 发布者: 添加订阅者&…

【数据关联(1)】Tracking-by-detection 多目标跟踪范式与“数据关联”的关系说明

这个领域有一些专有名词需要大家清楚! 文章目录 1 Tracking-by-detection multi-object tracking(MOT) 范式跟踪器是什么?1.1 关系图(个人理解,如有错误请指正)1.2 跟踪器有哪些? 2、核心部分“数据关联”…

Python格式化字符串(格式化输出)

print() 函数的用法,这只是最简单最初级的形式,print() 还有很多高级的玩法,比如格式化输出,这就是本节要讲解的内容。 熟悉C语言 printf() 函数的读者能够轻而易举学会 Python print() 函数,它们是非常类似的。 pri…

SegNetr: 重新思考 U 形网络中的局部-全局交互和跳过连接

SegNetr 会议分析摘要贡献方法整体框架1. SegNetr Block2.Information Retention Skip Connection 实验1.对比实验2.消融实验2.1 Effect of local-global interactions.2.2 Effect of patch size2.3 Effect of IRSC 可借鉴参考 会议分析 论文出处: arXiv预印版 除了…

C++在C语言基础上的优化

目录 一、命名空间 1、命名空间的定义 2、命名空间的使用 二、输入&输出 三、缺省参数 1、缺省参数的概念 2、缺省参数的分类 四、函数重载 五、引用 1.引用的概念 2.引用的特性 3、引用和指针的区别 六、内联函数 七、基于范围的for循环 一、命名空间 命名空…

计算机网络第六章——应用层(下)

等闲变却故人心,却道故人心易变 文章目录 用户代理就是用户和电子邮件系统之间的一个接口,通常都是运行在电脑中的一个程序,用户代理又可以称为电子邮件客户端软件,用户代理可以为用户提供一个比较友好的接口,邮件服务…

详解初阶数据结构之顺序表(SeqList)——单文件实现SeqList的增删查改

目录 一、线性表 二、顺序表 2.1概念及结构 2.2接口实现 2.3动态顺序表的创建 2.3动态顺序表的初始化 2.3.1传值初始化 2.3.2传址初始化 2.4动态顺序表的清空 2.5动态顺序表的扩容 2.6动态顺序表内容的打印 三、动态顺序表的使用 3.1尾插尾删 3.1.1尾插 3.1.2尾删…

集合框架和泛型二

一、Set接口 1. Set接口概述 java.util.Set 不包含重复元素的集合、不能保证存储的顺序、只允许有一个 null。 public interface Set<E> extends Collection<E>抽象方法&#xff0c;都是继承自 java.util.Collection 接口。 Set 集合的实现类有很多&#xff0c;…

分布式AKF拆分原则

目录 1 前言2 什么是AKF3 如何基于 AKF X 轴扩展系统&#xff1f;4 如何基于 AKF Y 轴扩展系统&#xff1f;5 如何基于 AKF Z 轴扩展系统&#xff1f;6 小结 1 前言 当我们需要分布式系统提供更强的性能时&#xff0c;该怎样扩展系统呢&#xff1f;什么时候该加机器&#xff1…

网络安全(黑客)技术自学

前言 一、什么是网络安全 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 无论网络、Web、移动、桌面、云等哪个领域&#xff0c;都有攻与防…

高忆管理:突破22万亿!五大保险巨头总资产创历史新高

阅历了几年深度转型的稳妥业正在冲破迷雾。 券商我国记者统计显现&#xff0c;本年上半年&#xff0c;我国人寿、我国人保、我国安全、我国太保、新华稳妥等五大A股上市险企总财物破22万亿元&#xff0c;半年度营收1.5万亿元。从3至5年中长周期来看&#xff0c;稳妥集团公司体…

【大数据】Kafka 入门指南

Kafka 入门指南 1.Kafka 简介2.Kafka 架构3.分区与副本4.偏移量5.消费者组6.总结 1.Kafka 简介 Apache Kafka 是一种高吞吐、分布式的流处理平台&#xff0c;由 LinkedIn 开发并于 2011 年开源。它具有 高伸缩性、高可靠性 和 低延迟 等特点&#xff0c;因此在大型数据处理场景…

“JSR303和拦截器在Java Web开发中的应用与实践“

目录 引言JSR303什么是JSR303?为什么要使用JSR303?常用注解快速入门JSR303 拦截器什么是拦截器拦截器与过滤器应用场景快速入门拦截器 总结 引言 在Java Web开发过程中&#xff0c;我们经常会遇到需要对输入数据进行验证和处理&#xff0c;同时需要对请求进行拦截与控制的需…

纷享销客受邀出席CDIE2023数字化创新博览会 助力大中型企业增长

2023年&#xff0c;穿越周期&#xff0c;用数字化的力量重塑企业经营与增长的逻辑&#xff0c;再次成为企业数字化技术应用思考的主旋律&#xff0c;以数字经济为主线&#xff0c;数字技术融入产业发展与企业增长为依据&#xff0c;推动中国企业数字化升级。 9月5日&#xff0c…

Git多人开发解决冲突案例

准备工作&#xff1a; 1.创建一个gitee远程仓库https://gitee.com/xxxxxxx.git 2.初始化两个本地git仓库用户&#xff0c;目的是模拟多人协作开发时提交代码发生冲突的场景 3.解决冲突并提交。 进入正题&#xff1a; lisi 通过vim指令修改readme.md文件内容&#xff0c;推送到…

合宙Air724UG LuatOS-Air LVGL API控件-表格(Table)

表格&#xff08;Table&#xff09; 示例代码 --创建表格Table1 lvgl.table_create(lvgl.scr_act(),nil)--设置表格为4行5列lvgl.table_set_row_cnt(Table1,4)lvgl.table_set_col_cnt(Table1,5)--给每个单元格赋值lvgl.table_set_cell_value(Table1, 0, 0, "选手")l…

QT生成ICO文件

生成ICO文件 #include <QApplication> #include <QImage> #include <QIcon> #include <QFile> #include <QDebug> #include <QPixmap>int main(int argc, char* argv[]) {QApplication app(argc, argv);// 读取图片文件QImage image(&quo…

Python类的概念

类 类的技术名词解释 ● 类(Class): 用来描述具有相同的属性和方法的对象的集合。它定义了该集合中每个对象所共有的属性和方法。对象是类的实例。 ● 类变量&#xff1a;类变量在整个实例化的对象中是公用的。类变量定义在类中且在函数体之外。类变量通常不作为实例变量使用…

功率放大器的定义详解

功率放大器是一种电子放大器&#xff0c;主要用于将输入信号的功率放大到足以驱动负载或输出器件所需的水平。通常&#xff0c;功率放大器会将低电平高电流的输入信号转换成高电平低电流的输出信号&#xff0c;以便给负载提供足够的功率。 功率放大器广泛应用于各种应用场合&am…

(Note)中文EI检索期刊目录

ei和sci、ssci一样是国际知名的期刊数据库&#xff0c;ei不仅收录国际知名的刊物&#xff0c;也收录了一些国内期刊&#xff0c;为方便投稿选刊&#xff0c;Elsevier官网更新了的EI Compendex期刊目录&#xff0c;那么 国内ei期刊有哪些? 经查询共有250余种期刊&#xff0c;新…