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

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

👨‍💻作者简介:练习时长两年半的java博主

📖个人主页:君临๑

🎁 ps:点赞是免费的,却可以让写博客的作者开心好几天😎

文章目录

一、k-最近邻分类算法介绍

二、k-NN的特点

三、KNN算法的伪代码

四、KNN算法的python实现


一、k-最近邻分类算法介绍

K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一。该方法的思路是:在特征空间中,如果一个样本附近的k个最近(即特征空间中最邻近)样本的大多数属于某一个类别,则该样本也属于这个类别。

如图1所示,有两类不同的样本数据,分别用蓝色的小正方形和红色的小三角形表示,而图正中间的那个绿色的圆所标示的数据则是待分类的数据。也就是说,现在, 我们不知道中间那个绿色的数据是从属于哪一类(蓝色小正方形or红色小三角形),下面,我们就要解决这个问题:给这个绿色的圆分类。

 

                      图一 

我们常说,物以类聚,人以群分,判别一个人是一个什么样品质特征的人,常常可以从他/她身边的朋友入手,所谓观其友,而识其人。我们不是要判别图1中那个绿色的圆是属于哪一类数据么,好说,从它的邻居下手。但一次性看多少个邻居呢?从图1中,你还能看到:

  • 如果K=3,绿色圆点的最近的3个邻居是2个红色小三角形和1个蓝色小正方形,少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于红色的三角形一类。

  • 如果K=5,绿色圆点的最近的5个邻居是2个红色三角形和3个蓝色的正方形,还是少数从属于多数,基于统计的方法,判定绿色的这个待分类点属于蓝色的正方形一类。

于此我们看到,当无法判定当前待分类点是从属于已知分类中的哪一类时,我们可以依据统计学的理论看它所处的位置特征,衡量它周围邻居的权重,而把它归为(或分配)到权重更大的那一类。这就是K近邻算法的核心思想。

步骤:

1:令k是最近邻数目,D是训练样例的集合

2: for每个测试样例z=(x ',y) do


3:计算z和每个样例(x,y) ∈ D之间的距离d(x ', x)

4:选择离z最近的k个训练样例的集合Dz包含于D

5.

 6:end for

  •  距离加权表决

  •  其中,v是类标号,yi是一个最近邻的类标号。1()为指示函数,其中参数为真,返回值为1,否则为0


二、k-NN的特点
 

(一)是一种基于实例的学习

  • 需要一个邻近性度量来确定实例间的相似性或距离

(二)不需要建立模型,但分类一个测试样例开销很大

  • 需要计算与所有训练实例之间的距离

(三)基于局部信息进行预测,对噪声非常敏感

(四)最近邻分类器可以生成任意形状的决策边界

  • 决策树和基于规则的分类器通常是直线决策边界

(五)需要适当的邻近性度量和数据预处理

  • 防止邻近性度量被某个属性左右

(六)k值的选择:

  • 如果k太小,则对噪声点敏感
  • 如果k太大,邻域可能包含很多其他类的点

(七)定标问题(规范化)

  • 属性可能需要规范化,防止距离度量被具有很大值域的属性所左右

三、KNN算法的伪代码

输入参数:k值、trainingSamples(训练数据集,M*N矩阵,M为样本数,N为属性数)、trainingLabels (训练数据集的分类标签0、1、2...,M*1矩阵) , testingSample(测试数据,1*N矩阵)
输出参数: class(测试数据对应类别标签)

算法流程:
1、得到训练数据集trainingSamples的大小M,N
2、初始化Distance数组(M*1),用来存储每个训练样本与测试样本的距离

3、对每一个训练样本trainingSamples(i,:)【 for i in range(M)】,计算其与测试样本testingSample之间的距离,存储在Distance[i]中
4、对Distance数组排升序【argsort函数】
5、取得排序前K个距离对应的序号,将序号对应的训练数据的分类标签得到赋给labs
6、得到labs数组的不重复元素,存储在数组All_labs 【unique函数】

7、得到不重复元素(数组All_labs )的个数LabNum
8、( for i in range(LabNum))对每一个不重复的分类标签All_labs[i],查找最近的k个类别标签labs中,等于All_labs[i]的有几个,将该数目作为第i类的投票数Vote[i]

9、求投票数Vote[i]的最大值所在的索引ind
10、All_labs[ind]是最大投票数对应的类别标签,即为算法输出结果class


四、KNN算法的python实现

KNN_Classify_E:

import numpy as np
import math
def KNN_Classify_E(trainingSamples,trainingLabels,testingSample,k):M=trainingSamples.shape[0]N=trainingSamples.shape[1]Distance=np.zeros((M,1))for i in range(M):training = trainingSamples[i,:]Distance[i] = dist_E(training, testingSample)ind=np.argsort(Distance,axis=0)#axis=0 指明在列的方向排序labs = trainingLabels[ind[:k]]labs = np.array(labs)All_labs = np.unique(labs) # labs 要从mat转为array,否则unique返回结果有问题LabNum = All_labs.size;Vote = np.zeros((LabNum, 1))for i in range(LabNum):vect = labs[labs == All_labs[i]]Vote[i] = vect.sizeind = Vote.argmax(0) #默认c = All_labs[ind]return cdef dist_E(vect1,vect2):dist = -1if (vect1.size != vect2.size):print('length of input vectors must agree')else:t = np.multiply((vect1 - vect2), (vect1 - vect2))dist = math.sqrt(t.sum())return dist

TestE:

import numpy as np
from KNN_Classify_E import *def classify_data(Tr_file_path, Tst_file_path):Tr = np.loadtxt(Tr_file_path, delimiter=",", dtype="double")Tst = np.loadtxt(Tst_file_path, delimiter=",", dtype="double")Tr = np.mat(Tr)Tst = np.mat(Tst)trAttr = Tr[:, :-1]trLabels = Tr[:, -1]tstAttr = Tst[:, :-1]tstLabels = Tst[:, -1]trAttr=normalize(trAttr)tstAttr=normalize(tstAttr)k = 3predictlabel = np.zeros((tstLabels.size, 1))for i in range(tstLabels.size):predictlabel[i, 0] = KNN_Classify_E(trAttr, trLabels, tstAttr[i, :], k)predict_right = predictlabel[predictlabel == tstLabels]acc = predict_right.size / predictlabel.sizereturn accdef normalize2(Samples):meanValue = np.mean(Samples, axis=0)stdValue = np.std(Samples, axis=0)Samples2 = (Samples - meanValue)/stdValuereturn  Samples2def normalize(Samples):Samples = np.mat(Samples)M = Samples.shape[0]N = Samples.shape[1]Samples2 = np.mat(np.zeros((M, N)))for i in range(N):allAtr = Samples[:, i]STD = allAtr.std()MEAN = allAtr.mean()x = (allAtr - MEAN) / STD;Samples2[:, i] = xreturn Samples2if __name__ == "__main__":Tr_file_path = '0data/diabets_Tr.csv'Tst_file_path = '0data/diabets_Tst.csv'acc = classify_data(Tr_file_path, Tst_file_path)print(acc)

diabets_Tr:(训练数据)

 diabets_Tst:(测试数据)

 


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

相关文章

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;是要先先进行类型转…

【javaScript】JavaScript中一个等号、二个等号、 三个等号 的区别(详细例子)

一、单等于号 1.单等于号具有赋值作用 我们在定义变量时&#xff0c;会对变量进行赋值&#xff0c;例如a1&#xff0c;就是把1赋值给a。 这就是在初始化对象的时候进行赋值。 2.单等于号具有引用对象作用 比如我们写了 var a 1;var b a ,表示变量a指向的内存地址与b相同&…