KNN数据缺失值填充(附源码和数据)不调用包

article/2025/9/7 7:52:54

KNN估计

  • 数据缺失值填充—KNN估计
  • 一、基本思想
  • 二、步骤
    • 1.导入数据
    • 2.查看空缺值
    • 3.取出要分析的数据
    • 4.计算平均值
    • 5.计算标准差
    • 6.规范化
    • 7.计算欧几里得距离
    • 8.最优解
    • 9.画图
  • 总结


数据缺失值填充—KNN估计

运行环境
python3.6
jupyter notebook

一、基本思想

先将数据标准化,然后对缺失值的数据点做k邻近填充,计算含缺失值的数据点与其他不含缺失值的数据点的距离矩阵,选出欧氏距离最近的k个数据点。
用选中的k个近邻的数据点对应的字段均值来填充数据中的空缺值。

二、步骤

1.导入数据

import pandas as pd
data = pd.read_csv('iris-带空格数据.csv')
data['id'] = [i for i in range(0,150)]		#加入id列

2.查看空缺值

index = [] #存放空缺值的位置
for i in data.columns:a=data[data[i] == ' '].index.tolist()index.append(a)
index#一共有七列数据,空缺值在第5列,第三行

输出结果为:[[], [], [], [], [2], [], []]

3.取出要分析的数据

data.iloc[2,4] = 0 #将空值变为0
new_data = data.iloc[:,1:4]#计算空缺值只需要前三列数据

4.计算平均值

#平均值
avg =[]#用来存放平均值
for i in new_data.columns:#遍历dataframe列名a = new_data[i].values.tolist()#取出每一列的数据,转成列表sum = 0for i in range(0,len(a)):sum = sum + float(a[i])#求每一列数据之和avg.append(sum/len(a))#求平均
avg

结果为:[1.199333333333334, 3.7580000000000027, 3.057333333333334]

5.计算标准差

#标准差
all_value=[]
for i in new_data.columns:a = new_data[i].values.tolist()#每一列的数据转成列表
all_value.append(a)#每一列的列表加入到all_value
biaozhuncha = []
for i in range(0,new_data.shape[1]):#一共三列,所以遍历三次。sum = 0for j in all_value[i]:sum = sum + ((float(j)-avg[j])*(float(j)-avg[j]))#计算每一列数据减去对应列的平均值的平方之和b = (sum/new_data.shape[0]) ** 0.5#计算每一列数据的标准差biaozhuncha.append(b)#把标准差加入到biaozhuncha列表中
biaozhuncha

在这里插入图片描述

6.规范化

#z_score规范化
result = []
for i in range(0,new_data.shape[1]):#遍历三次,因为有三列数据z_score=[]for j in all_value[i]:#all_value列表,就是上面用到了存放所有列数据的二维列表c = (float(j)-avg[i])/biaozhuncha[i]#计算出某一列规范化后的结果z_score.append(c)#结果保存在z_score列表中
result.append(z_score)#把三列的结果汇总
new_data['Petal_width'] = result[0]#接着,把规范化得到的结果替换new_data中的值
new_data['Petal_length'] = result[1]
new_data['Sepal_width'] = result[2]

7.计算欧几里得距离

value_result=[]
for i in new_data.columns:lie_value = []for j in new_data[i].values.tolist():lie_value.append(j)value_result.append(lie_value)
#此处,将上面得到的规范化结果保存成二位列表,方便后面的计算。
d_list=[]
for i in range(0,new_data.shape[0]):d = 0for j in range(0,new_data.shape[1]):d = d+((new_data.iloc[i,j]-new_data.iloc[2,j])*(new_data.iloc[i,j]-new_data.iloc[2,j]))d_list.append(d**0.5) result = d_list
df = pd.DataFrame(d_list)#将结果转成dataframe方便我排序。

8.最优解

all_data_result = []
for i in range(3,20):all_data=[]for j in df.drop(2).sort_values(by=0).head(i).index:all_data.append(data.iloc[j,4])#print(all_data)
all_data_result.append(all_data)
b_list = []
for i in range(len(all_data_result)):sum = 0for j in all_data_result[i]:sum = sum + float(j)b = sum/len(all_data_result[i])
b_list.append(b)

在这里插入图片描述

9.画图

对3到50的预测结果进行可视化。
import matplotlib.pyplot as plt
%matplotlib inline
#把图插在网页里
plt.plot([i for i in range(3,50)],b_list)
在这里插入图片描述

总结

本次实验学习到了很多关于dataframe的操作,有一些对于列表的操作我不是很熟练,但是我可以把列表转成dataframe类型在进行操作。此外,我也很少调用一些对数据计算的函数,让我更加了解到计算平均、标准差和欧几里得距离的方法。对于k-means的算法也有了一定的认识,可以使用一些基本的方法来预测数据并填充空缺值。
数据和源码:链接:https://pan.baidu.com/s/1TPwte04gxkk0Rmna6BQ6iw
提取码:1025


http://chatgpt.dhexx.cn/article/B2haihCy.shtml

相关文章

数据挖掘——KNN算法的实现

👨‍💻作者简介:练习时长两年半的java博主 📖个人主页:君临๑ 🎁 ps:点赞是免费的,却可以让写博客的作者开心好几天😎 文章目录 一、k-最近邻分类算法介绍 二、k-NN的特…

KNN算法调优

1.所用方法: 交叉验证与网格搜索 交叉验证(为了让被评估的模型更加精确可信): 所有训练集数据分成N等分,几等分就是几折交叉验证 网格搜索:调参数 K-近邻:超参数K 2.API: sklearn.model_selection.GridSearchCV: CV即cross validation…

计算机编程—必备基础知识点

目录: 1. 编程语言1.1 编程1.2 计算机语言1.3 编程语言1.4 翻译器1.5 编程语言和标记语言区别 2. 计算机基础2.1 计算机组成2.2 数据存储2.3 数据存储单位2.4 程序运行 1. 编程语言 1.1 编程 编程:就是让计算机为解决某个问题而使用某种程序设计语言编…

计算机概论--计算机基础知识快速入门

0.前言1.计算机:辅助人脑的好工具 1.1计算机硬件的五大单元1.2CPU的种类1.3接口设备1.4运作流程 2.个人计算机架构与接口设备 2.1CPU2.2内存2.3显卡2.4硬盘与存储设备2.5主板 3.软件程序执行 3.1机器程序与编译程序3.2操作系统 3.2.1操作系统内核3.2.2系统调用 3.3小…

0基础如何开始学习计算机知识?

一、计算机的基本操作 计算机中只有文件和文件夹 计算机中,只有两样东西,文件和文件夹。 文件夹:本身不存储数据内容。文件夹是用来组织和管理文件的。 文件: 所有的txt文本文档,音乐,视频,图…

【电脑讲解】电脑知识入门大全,超详细电脑基础知识讲解

这是一个新坑,希望大家喜欢 电脑的基础知识大全,你确定都知道? 一、软件系统 软件系统包括:操作系统、应用软件等。应用软件中电脑行业的管理软件,IT电脑行业的发展必备利器,电脑行业的erp软件。 二、硬件系统 硬件系…

计算机知识01:计算机基础知识入门

1. 计算机运行流程 如果不是很了解电脑运行流程的话,我们可以类比一下,假设电脑是一个人体,那么每个元件对应到哪个地方呢?可以这样思考: CPU脑袋:每个人会做的事情都不一样(微指令集的差异&a…

IP地址(IP Address)

IP Address在网络中,通信节点都需要一个IP地址 以点分十进制表示,有32位二进制构成(大约43亿) 分为两个部分:网络位和主机位 网络位:代表IP地址所属的网段 主机位:代表网点上的某个节点 由子…

IP地址构成 ,以及如何求“网络地址“以及“广播地址“

IP地址(英语:IP Address, 全称:Internet Protocol Address)又称互联网协议地址。当设备连接网络,设备将被分配一个IP地址,用作标识。通过IP地址,设备间可以互相通讯,如果没有IP地址&…

电话号码对应的英语单词

问题: 电话的号码盘一般可以用于输入字母,如用2可以输入a,b,c,用3可以输入d,e,f等。 对于号码5869872,可以依次输出其代表的所有字母组合。如:jtmwtpa,jtmwtpb......... 1、您能否可以根据这样的对应关系设计一个程序&#xff…

地址的概念

前言:地址的概念 1. 地址概念及各个单位换算1.1 地址的概念1.2 单位换算1.3 举例说明,加深理解1.4 关于地址的宽度 1. 地址概念及各个单位换算 1.1 地址的概念 计算机内的数据是存储在地址里面的,地址又是以字节(Byte&#xff09…

地址的地址?

在visual studio 2019中 #include <stdio.h> #include <stdlib.h> typedef struct student { int value; struct student* next_stu; }Student; Student * creatlist(); void insertlist(Student * list,int value); int main() { Student *my_list…

GoldenDict 上的那些精美版权词典(附下载地址)(英语、俄语、梵语、印地语)

转载▼ 标签&#xff1a; 杂谈 国内的有道词典和金山词典由于使用方便、宣传到位得到了许多同学的喜爱。在开源软件的领域&#xff0c;也有一款非常好用的词典GoldenDict&#xff0c;它的强项在于可以直接使用众多词典厂商的词库。那些正规的词典厂商通常购买了词典的版权…

【GO】map转json

咔咔博客之map转json 跟结构体转json一样都使用的是json.Marshal()方法 最后需要就是把字节转为字符串使用string即可 案例 func main() {// 定义了interface 后边就可以跟任意类型了mMap : make(map[string]interface{})mMap["博客地址"] "blog.fangkang.to…

Json4s的一些用法 JSon转对象实体 Json转Map Map转Json

Json4s 全称就是Json For Scala&#xff0c;为Scala而生 首先上Maven依赖配置&#xff0c;其实Spark中自带了Json4s如果是编写Spark代码,并不需要单独引用Json4s的依赖了 <dependency><groupId>org.json4s</groupId><artifactId>json4s-jackson_2.11&…

map转json字符串字段排序

需求&#xff1a;map转成json字符串&#xff0c;要求字段按字母升序排列 package com.data.test;import java.util.HashMap; import java.util.Map; import java.util.TreeMap; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFe…

Map与JSON数据之间的互相转化

Map与JSON mapmap转JSON字符串JSON字符串转JSON对象Map转JSON对象JSON字符串转MapJSON对象转MapJSON对象转JSON字符串IDEA功能快捷键 map 此内容是方便博主自己记忆内容&#xff0c;不用于公开学习资料&#xff0c;若发现语法错误&#xff0c;自行更正&#xff0c;勿喷 map转…

Map和JSON之间的转化

Map和JSON之间的转化 1 添加依赖 <dependency><groupId>com.alibaba</groupId><artifactId>fastjson</artifactId><version>1.2.47</version></dependency>2 测试 2.1 Map转JSON //1.map转jsonTestpublic void testJson01()…

js中三个等号

&#xff1a;三个等号我们称为等同符&#xff0c;当等号两边的值为相同类型的时候&#xff0c;直接比较等号两边的值&#xff0c;值相同则返回true&#xff0c;若等号两边的值类型不同时直接返回false。

两个等号(==)和三个等号(===)的区别

2019独角兽企业重金招聘Python工程师标准>>> 两个等号()和三个等号()的区别&#xff1a; 1. ""表示&#xff1a;equality -> 等同 的意思&#xff0c;""使用两个等号时&#xff0c;如果两边值的类型不同的时候&#xff0c;是要先先进行类型转…