数据清洗-缺失值填充-K-NN算法(K-Nearest Neighbors, K-NN算法)

目录

  • 一、安装所需的python包
  • 二、采用K-NN算法进行缺失值填充
    • 2.1可直接运行代码
    • 2.2以某个缺失值数据进行实战
      • 2.2.1代码运行过程截屏:
      • 2.2.2填充后的数据截屏:
  • 三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍
    • 3.1 K 近邻算法定义
    • 3.2 K 近邻算法的基本思想
    • 3.3 K 近邻算法的步骤
    • 3.4 K 近邻算法的距离度量
    • 3.5 K 近邻算法的优缺点
      • 3.5.1 优点
      • 3.5.2 缺点
    • 3.6 K 近邻算法的应用场景
    • 3.7 K 近邻算法的改进方法

感觉大家对原理性的东西不太感兴趣,那我就直接举例提供代码,以及详细的注释,大家自己对照改代码应用于你自己建立的模型吧。

这些代码全部是我自己做数模竞赛时候自己用的代码。可以直接运行,记得修改文件路径。

一、安装所需的python包

pip install pandas scikit-learn scipy numpy joblib

二、采用K-NN算法进行缺失值填充

注意代码需要把自己的数据文件格式转换为CSV文件,并且把路径修改为自己文件所在的路径,不会转换的参考我此教程文件格式转换:EXCEL和CSV文件格式互相转换。

我知道大家对原理性的东西不感兴趣,我把他的原理介绍放在文末,需要写论文的同学自己拿去用,记得修改,否则查重率过不去。

2.1可直接运行代码

"""
K-NN
1.**K-最近邻 (K-Nearest Neighbors, K-NN)**: K-NN是一种
基于实例的学习,或是局部而似和将所有计算推识到分类之
后的情性学习。整个训练数据集都存储在横型中。K-NN算
法比其他技术更适合用于多类目分类问题,如果你对填补缺
失值的速度和精度的平衡感兴趣,这是一个不错的选择。这个的效果比牛顿插值法差一点,,而那些训练模型的那个可能是因为数据量太少,效果差,这是我的一点经验。
"""import pandas as pd
from sklearn.experimental import enable_iterative_imputer
from sklearn.impute import IterativeImputer
from sklearn.impute import KNNImputer
from scipy.interpolate import interp1d
import numpy as np
import joblib# 读取数据,请将'缺失值填充.csv'替换为你的真实数据文件名
filename = '缺失值填充.csv'
data = pd.read_csv(filename, encoding='gbk')# 分离出有缺失值的列
missing_columns = data.columns[data.isnull().any()]# 使用KNN算法插补缺失值
imputer = KNNImputer(n_neighbors=3)
data_imputed = imputer.fit_transform(data)
data_imputed = pd.DataFrame(data_imputed, columns=data.columns)# 再次加载原始数据,将插补的值填充到相应的位置
original_data = pd.read_csv(filename, encoding='gbk')
missing_value_rows, missing_value_cols = np.where(original_data.isnull())# 替换缺失值为插补值
for row, col in zip(missing_value_rows, missing_value_cols):original_data.iloc[row, col] = data_imputed.iloc[row, col]# 输出处理后的数据
print(original_data)
original_data.to_csv('knn填充.csv', index=False)

2.2以某个缺失值数据进行实战

注意:数据量较少,由自己构建,均有规律,
如下图:
在这里插入图片描述

构造缺失值,如下图:
在这里插入图片描述

运行代码查看填充后的数据怎么样,
运行代码如下图+填充后的截图:

2.2.1代码运行过程截屏:

在这里插入图片描述

2.2.2填充后的数据截屏:

在这里插入图片描述

说明:估计是数据量太小,或者缺失值太多,导致填充的效果一般(对于这种规律的数据使用牛顿插值法倒是挺不错的,数据量大的,可以使用神经网络遗传算法来进行缺失值填充,下面我都会介绍),但是你在进行数模比赛时候,需要说明为什么你要选用knn算法,说明他的原理即可,不必纠结填充的数据是否正确,因为你本身也不知道数据的正确性。

接下来我将分享其他我参加数模时候常用的几种数据填充的代码,都是我自己调试跑通过的,大家直接复制粘贴使用。

三、K 近邻算法 (K-Nearest Neighbors, KNN) 介绍

3.1 K 近邻算法定义

K 近邻算法 (K-Nearest Neighbors, KNN) 是一种基本的监督学习算法,主要用于分类和回归问题。KNN 算法基于“相似的输入具有相似的输出”这一假设,通过计算给定数据点与训练数据集中其他点的距离,找出与其最接近的 K 个邻居,然后根据这些邻居的类别或数值进行预测。KNN 算法的核心思想是:相似的样本往往具有相似的输出。

3.2 K 近邻算法的基本思想

KNN 算法没有显式的学习过程,也不需要构建显式的模型,它属于 惰性学习算法。KNN 的主要步骤如下:

  1. 计算距离:对于一个需要分类或回归的数据点,计算它与训练集中每个数据点的距离。常用的距离度量方法包括欧几里得距离、曼哈顿距离和闵可夫斯基距离等。
  2. 选择最近的 K 个邻居:根据计算出的距离,选择距离最小的 K 个邻居。
  3. 投票或平均
    • 分类问题:在分类问题中,KNN 算法根据 K 个邻居中出现次数最多的类别进行投票决定待预测点的类别。
    • 回归问题:在回归问题中,KNN 算法通过 K 个邻居的数值平均来预测待预测点的值。

3.3 K 近邻算法的步骤

  1. 选择参数 K 的值:决定选择多少个邻居参与投票或计算平均值。
  2. 计算距离:对于待分类或回归的样本,计算它与训练数据集中每个样本的距离。
  3. 选择最近的 K 个邻居:根据距离对训练数据进行排序,选取距离最近的 K 个样本。
  4. 进行分类或回归
    • 分类:在 K 个邻居中,选择出现次数最多的类别作为预测结果。
    • 回归:在 K 个邻居中,取目标值的平均值作为预测结果。

3.4 K 近邻算法的距离度量

常用的距离度量方法有:

  • 欧几里得距离 (Euclidean Distance)
    d ( x , y ) = ∑ i = 1 n ( x i − y i ) 2 d(x, y) = \sqrt{\sum_{i=1}^n (x_i - y_i)^2} d(x,y)=i=1n(xiyi)2

  • 曼哈顿距离 (Manhattan Distance)
    d ( x , y ) = ∑ i = 1 n ∣ x i − y i ∣ d(x, y) = \sum_{i=1}^n |x_i - y_i| d(x,y)=i=1nxiyi

  • 闵可夫斯基距离 (Minkowski Distance)
    d ( x , y ) = ( ∑ i = 1 n ∣ x i − y i ∣ p ) 1 / p d(x, y) = \left( \sum_{i=1}^n |x_i - y_i|^p \right)^{1/p} d(x,y)=(i=1nxiyip)1/p

3.5 K 近邻算法的优缺点

3.5.1 优点

  • 简单易懂:KNN 算法简单直观,易于理解和实现。
  • 无需训练:由于 KNN 是惰性学习算法,它不需要显式的训练过程,计算开销集中在预测阶段。
  • 可用于分类和回归:KNN 算法既可以用于分类问题,也可以用于回归问题。

3.5.2 缺点

  • 计算复杂度高:对于大数据集,计算待预测点与所有训练数据点的距离需要大量的计算资源。
  • 内存开销大:需要存储所有的训练数据,在内存有限的情况下处理大规模数据可能存在困难。
  • 对不相关特征敏感:KNN 算法对数据中的不相关特征和噪声比较敏感,需要进行特征选择和数据预处理。
  • 参数选择困难:选择合适的 K 值是一个挑战,K 值过小容易导致过拟合,K 值过大容易导致欠拟合。

3.6 K 近邻算法的应用场景

KNN 算法广泛应用于以下场景:

  • 分类问题:例如,文本分类、图像分类、用户行为分类等。
  • 回归问题:例如,预测房价、预测股票价格等。
  • 异常检测:例如,检测信用卡欺诈、网络入侵检测等。
  • 推荐系统:例如,电影推荐、商品推荐等。

3.7 K 近邻算法的改进方法

  • 归一化或标准化数据:由于 KNN 算法对特征的尺度非常敏感,通常需要对数据进行归一化或标准化处理。
  • 使用加权 KNN:在基本的 KNN 中,所有邻居的权重相同,可以改进为对距离更近的邻居赋予更大的权重,以提高算法的准确性。
  • 使用降维方法:可以使用 PCA(主成分分析)或其他降维方法减少特征维数,以减少计算量和内存使用。

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

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

相关文章

福建科立讯通信 指挥调度管理平台 SQL注入漏洞

北峰通信-福建科立讯通信 指挥调度管理平台 SQL注入漏洞 厂商域名和信息收集 域名: 工具sqlmap python sqlmap.py -u "http://ip:端口/api/client/down_file.php?uuid1" --batch 数据包 GET /api/client/down_file.php?uuid1%27%20AND%20(SELECT%20…

替换 Oracle ,江河信息用 TDengine 解决高基数查询写入问题

在数字经济快速发展的背景下,智慧水利作为重要的基础设施之一,正逐步成为提升水资源管理效率、优化生态环境的重要力量。江西省水投江河信息技术有限公司(以下简称“江河信息”)作为高新技术国有企业,坚定致力于打造数…

Leetcode 每日一题:Longest Increasing Path in a Matrix

写在前面: 今天我们继续看一道 图论和遍历 相关的题目。这道题目的背景是在一个矩阵当中找寻最长的递增数列长度。思路上非常好想,绝对和 DFS 相关,但是题目的优化要求非常高,对于语言和内存特性的考察特别丰富,如果是…

15. Springboot集成Redis

目录 1、前言 2、为什么选择Spring Boot集成Redis? 3、快速上手 3.1、引入依赖 3.2、 配置连接信息 3.3、自定义配置类 4、RedisTemplate的使用 4.1、String类型操作 4.2、 Hash类型操作 4.3、List类型操作 4.4、Set类型操作 4.5、SortedSet类型操作 4…

第十一章 【后端】商品分类管理微服务(11.2)——Lombok

11.2 Lombok 官网:https://projectlombok.org/ 较新版本的 idea 已默认安装 lombok 插件 Lombok 工具提供一系列的注解,使用这些注解可以不用定义 getter、setter、equals、constructor 等,可以消除 java 代码的臃肿,编译时它会在字节码文件中自动生成这些通用的方法,简…

ElK 8 收集 Nginx 日志

1. 说明 elk 版本:8.15.0 2. 启个 nginx 有 nginx 可以直接使用。我这里是在之前环境下 docker-compose.yml 中启动了个 nginx: nginx:restart: alwaysimage: nginx:1.26.1ports:- "80:80"- "443:443"volumes:#- ./nginx/html:/…

【题解】—— LeetCode一周小结37

🌟欢迎来到 我的博客 —— 探索技术的无限可能! 🌟博客的简介(文章目录) 【题解】—— 每日一道题目栏 上接:【题解】—— LeetCode一周小结36 9.合并零之间的节点 题目链接:2181. 合并零之间…

Unity实战案例全解析:PVZ 植物放置分析

前篇:Unity实战案例全解析:PVZ 植物卡片状态分析-CSDN博客 植物应该如何从卡牌状态转为实物? 其实就只需要考虑两个步骤加一个后续处理: 1.点击卡牌后就实例化 需要一个植物状态枚举,因为卡牌分为拿在手上和种植下…

CS61C 2020计算机组成原理Lecture01-数字表示,溢出

1. 原码 原码就是符号化的数值,其编码规则简单直观:正数符号位用0表示,负数符号位用1表示,数值位保持不变。 x0.1101,则[x]原0.1101;x1101,则[x]原01101x -0.1111,则[x]原1.1111&…

Oracle从入门到放弃

Oracle从入门到放弃 左连接和右连接Where子查询单行子查询多行子查询 from子句的子查询select子句的子查询oracle分页序列序列的应用 索引PL/SQL变量声明与赋值select into 赋值变量属性类型 异常循环游标存储函数存储过程不带传出参数的存储过程带传出参数的存储过程 左连接和…

opencv之Canny边缘检测

文章目录 前言1.应用高斯滤波去除图像噪声2.计算梯度3.非极大值抑制4.应用双阈值确定边缘5.Canny函数及使用 前言 Canny边缘检测是一种流行的边缘检测算法,用于检测图像中的边缘。它通过一系列步骤将图像中的像素边缘突出显示出来,主要分为以下几个步骤…

PCL 点云随机渲染颜色

目录 一、概述 1.1原理 1.2实现步骤 1.3 应用场景 二、代码实现 2.1关键函数 2.2完整代码 三、实现效果 PCL点云算法汇总及实战案例汇总的目录地址链接: PCL点云算法与项目实战案例汇总(长期更新) 一、概述 本文将介绍如何使用PCL库…

uniapp升级Vue3:避坑指南与步骤详解

为什么要升级到 Vue3 Vue3 是 Vue.js 的最新版本,相比 Vue2,它带来了许多改进和新特性,比如更小的包体积、更好的性能、更强大的组合式 API 等。通过升级到 Vue3,我们可以享受到这些新特性带来的好处,提升项目的开发效…

模拟视频推到WVP推流列表

效果 1. wvp创建RTMP 2. 使用ffmpeg将本地的视频转为rtmp ffmpeg -re -i F:rtsp\123.mp4 -c copy -f flv rtmp://192.168.1.237:1935/cd/10001?sign=Z4Y3eYeSg

计算机网络408考研 2022

https://zhuanlan.zhihu.com/p/695446866 1 1 1SDN代表软件定义网络。它是一种网络架构,旨在通过将网络控制平面从数据转发平面分离出来,从而实现网络的灵活性和可编程性。在SDN中,网络管理员可以通过集中式控制器 来动态管理网络流量&…

Google高级应用

网站管理员中心 Google Search Console 谷歌高级搜索:https://www.google.com.hk/advanced_search?hlzh-CN&fg1 基础语法 AND/强迫包含NOT/-除去相关内容~搜索同义词*取代所有字符.取代一个字符" "双引号 强调OR/|或条件搜索()查询分组 高级语…

C#笔记10 Thread类怎么终止(Abort)和阻止(Join)线程

Thread类 C#笔记8 线程是什么?多线程怎么实现和操作?-CSDN博客 C#笔记9 对线程Thread的万字解读 小小多线程直接拿下!-CSDN博客 上次说过怎么简单的使用多线程,怎么创建多线程,但是没有具体分析它的终止和释放。 线…

【乐吾乐大屏可视化组态编辑器】使用手册

1 总览 开始设计:大屏可视化设计器 - 乐吾乐Le5le 1.1 画布 画布即绘画区域,将图形拖拽到画布进行编辑,绘制大屏。 1.2 菜单栏 顶部菜单导航,一级菜单可设置Logo、公司名称、文件编辑、常用编辑、查看、帮助,设置大…

text2sql(NL2Sql)综述《The Dawn of Natural Language to SQL: Are We Fully Ready?》

《The Dawn of Natural Language to SQL: Are We Fully Ready?》(github)出自2024年6月的NL2SQL(Natural language to SQL )综述论文。这篇论文尝试回答如下三个问题: 问题1:NL2SQL的现状是什么?(Q1:Where Are we Now?) 论文图1总结了近20年NL2SQL方法…

Cyber Weekly #24

赛博新闻 1、OpenAI发布最强模型o1 本周四(9月12日),OpenAI宣布推出OpenAIo1系列模型,标志着AI推理能力的新高度。o1系列包括性能强大的o1以及经济高效的o1-mini,适用于不同复杂度的推理任务。新模型在科学、编码、数…