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

news2024/12/30 1:42:09

👨‍💻作者简介:练习时长两年半的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.size
    ind = Vote.argmax(0) #默认
    c = All_labs[ind]
    return c

def dist_E(vect1,vect2):
    dist = -1
    if (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 = 3
    
    predictlabel = 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.size
    return acc


def normalize2(Samples):
    meanValue = np.mean(Samples, axis=0)
    stdValue = np.std(Samples, axis=0)
    Samples2 = (Samples - meanValue)/stdValue
    return  Samples2

def 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] = x
    return Samples2


if __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://www.coloradmin.cn/o/439081.html

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

相关文章

C++ 简介

C 完全支持面向对象的程序设计,包括面向对象开发的四大特性: 封装(Encapsulation):封装是将数据和方法组合在一起,对外部隐藏实现细节,只公开对外提供的接口。这样可以提高安全性、可靠性和灵活…

soot中存在的主要对象、soot的执行流

soot代码分析框架的基础知识(二)_soot 代码分析_小作坊中搬砖的博客-CSDN博客 Soot中的结构 本篇内容简单概括一下:soot中存在的主要对象、soot的执行流。 Soot中提供了几种对象,分别是:Scene、SootClass、SootMetho…

如何在 Windows WSL 上安装 k3s (Kubernetes / k8s)

WSL,全称Windows Subsystem for Linux,是微软在Windows 10操作系统上开发的一种运行Linux应用程序的子系统。它允许用户在Windows系统中直接运行Linux命令行工具和应用程序,无需双重引导或虚拟机。 相比虚机,WSL提供了更加高效、…

能量密度的必要性:城市比乡村具有更高的能量密度

文章目录 引言I 人口密度1.1 人口密度太低对于经济的发展的不利因素1.2 足够的人口密度带来的好处1.3 乌鲁克城II 农耕文明和商业文明2.1 农耕文明2.2 商业文明III 有效掌握动力的文明处于优势3.1 苏美尔人- 轮子&风能的利用3.2 英国人- 以蒸汽机为代表的工业革命引言 文明…

LeetCode——根据二叉树创建字符串与二叉树的最近公共祖先

606. 根据二叉树创建字符串 给你二叉树的根节点 root ,请你采用前序遍历的方式,将二叉树转化为一个由括号和整数组成的字符串,返回构造出的字符串。 空节点使用一对空括号对 “()” 表示,转化后需要省略所有不影响字符串与原始二…

C#医院体检管理系统源码,PEIS源码,C/S结构 oracle数据库

PEIS体检管理系统源码,医院体检系统源码PEIS源码,商业级源码 本套PEIS医院体检管理系统源码采用C/S结构,前台开发工具为Vs2012,后台数据库采用oracle大型数据库。 核心功能有:体检档案的录入、体检报告的输出、体检档…

震惊!ChatGPT可以用来炒股?

‍数据智能产业创新服务媒体 ——聚焦数智 改变商业 ChatGPT让我们见识了大模型技术的强大潜能,激发了市场的热情。 然而,对于大多数人而言,最关心的问题很可能是——如何用ChatGPT赚钱。谈到赚钱,最直接的就是金融,其…

word插入页码

word如何设置域http://zhidao.baidu.com/question/382747671/answer/3053706353 1、首先,我们打开我们电脑上面的word,然后我们点击插入。 2、然后我们点击工具栏中的文档部件,弹出的界面,我们点击域。 3、弹出的界面&#xff0c…

iOS设备和蓝牙模块连接基础知识

iOS设备和蓝牙模块连接基础知识 一:iOS连接外设的几种方式 如图下面几种方式: CoreBluetooth和ExternalAccessory,两个框架,基本上是蓝牙设备与iOS设备连接的方式 有图可知,EAP要MFi认证,要求设备的设计理…

pywebview搭建、运行、打包白屏

1、禁用微软商店引流 点击开始菜单输入管理应用执行别名搜索系统设置,将该列表划到最底部,找到python.exe和python3.exe,将其设置为关闭状态 这是微软搞的狗皮膏药,强制型环境变量 2、配置Python环境 1.考虑版本管理&#xff…

Docker原理与镜像管理

目录 一、虚拟化概述 虚拟架构 1、寄居架构 2、原生架构 两者的区别 虚拟化产品 虚拟化类型 二、Docker概述 Logo含义 Docker的设计宗旨 Docker与虚拟机的区别 Docker核心概念 镜像 容器 仓库 Docker Engine(引擎) Docker运行的原理 d…

组合设计模式解读

目录 问题引进 传统方案解决学校院系展示存在的问题分析 组合模式基本介绍 基本介绍 组合模式原理类图 对原理结构图的说明-即(组合模式的角色及职责) 应用实例 组合模式的注意事项和细节 问题引进 看一个学校院系展示需求 编写程序展示一个学校院系结构:需…

浏览器加 buff 指南-【超实用的浏览器工具】

今天这篇博客,说一说浏览器以及加 buff ,先说浏览器:地址:https://www.xduoyu.com/,里面的工具让你的浏览器变装为技术人员的专属利器。这里还要表扬一下,官网的宣传页做的越来越专业了,还打造了…

好的台灯和差的台灯的区别?盘点高品质的护眼台灯品牌

简单来说,好的台灯使用20分钟不会眼疲劳,可差的台灯使用10分钟就眼干涩、不舒服了。 这些年的LED灯具都做得非常成熟,台灯也是LED灯具,在频闪、蓝光、显色指数、均匀度等各种指标都将眼睛保护的很好,采用特殊的光学技…

Thinkphp+vued大学生租房管理系统mysql校园房屋租赁网站系统

学生租房管理系统是计算机技术和网络迅速发展的一个大学生租房信息应用解决方案。大学生租房平台将Internet网络技术与现代管理观念相融合,针对信息技术的特点对大学生租房平台进行规划和重构,对大学生租房信息流进行优化及合理配置,生成动态…

VNC 远程重装 Centos 系统

一、环境 1、环境准备 两台设备,一台为重装 Centos 机器( IP:192.168.206.30,hostname:centos1) ,确保 centos1本身开启了图形化界面GNOME,不是最小化安装的Linux 。一台为重装时,从获取安装程…

Django REST Framework(DRF)框架之视图集ViewSet与路由Router

DRF框架之视图集ViewSet 视图集ViewSet与路由Router视图集ViewSet路由Router视图集和路由的基本使用 视图集ViewSet的使用ViewSetGenericViewSetModelViewSetReadOnlyModelViewSet视图集添加其他方法视图集对象action属性 路由Router的使用SimpleRouterDefaultRouter基本使用自…

DELL R730 主板坏了,Raid5硬盘移到同型号服务器备忘

1、开机时按ctrlr进入raid设置页面 2、进入raid设置页面后可以看到没有找到虚拟磁盘,我们按F2打开操作菜单 3、选择菜单Foreign Config -> Import ,选择Yes开始导入硬盘中的raid配置 4、导入成功的话就可以看到虚拟盘了 5、按Esc退出 6、按ctrlaltd…

为什么网络安全缺口很大,招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万,就业人数却只有10多万,缺口高达了93%。这里就有人会问了: 1、网络安全行业为什么这么缺人? 2、明明人才那么稀缺,为什么招聘时招安全的人员却没有那么多呢&#xff1…

迅为RK3568核心板车载中控AVM一体机应用

RK3568M车载中控&AVM一体机方案搭载4核A55 CPU,G52-2EE GPU架构,1Tops算力NPU,支持1路4K 60fps或8路1080P 30fps的多格式解码和高达1080P 100fps的H.265编码,具备双千兆GMAC、三路CAN以及USB3.0/SATA3.0/PCIE3.0等丰富接口&am…