【python】机器学习-K-近邻(KNN)算法

        

目录

一 . K-近邻算法(KNN)概述 

二、KNN算法实现

三、 MATLAB实现

四、 实战


一 . K-近邻算法(KNN)概述 

        K-近邻算法(KNN)是一种基本的分类算法,它通过计算数据点之间的距离来进行分类。在KNN算法中,当我们需要对一个未知数据点进行分类时,它会与训练集中的各个数据点进行特征比较,并找到与之最相似的前K个数据点。然后根据这K个数据点的类别来确定未知数据点所属的类别。

        KNN算法的步骤非常简单: 1)计算未知数据点与训练集中各个数据点之间的距离。常用的距离度量包括欧氏距离和曼哈顿距离。 2)按照距离递增的顺序对数据点进行排序。 3)选择距离最小的K个数据点。 4)根据这K个数据点的类别来确定未知数据点的类别。通常采用多数表决的方式,即统计K个数据点中各个类别出现的次数,将出现次数最多的类别作为未知数据点的预测类别。

        KNN算法的特点是简单易懂,容易实现。它没有显式的训练过程,仅依赖于已有的训练数据。然而,KNN算法的计算复杂度较高,尤其是当训练集很大时。此外,KNN算法还对训练样本的质量和数量敏感,需要合理地选择K值和距离度量方法。

     在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离或曼哈顿距离:

    

        同时,KNN通过依据k个对象中占优的类别进行决策,而不是单一的对象类别决策。这两点就是KNN算法的优势。

   接下来对KNN算法的思想总结一下:就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类,其算法的描述为:

  1. 首先需要收集足够的带有标签的训练数据,这些数据包含了输入特征和相应的输出标签。

  2. 对于输入的测试数据,需要计算它与每个训练数据之间的距离(如欧氏距离、曼哈顿距离等)。

  3. 选取距离测试数据最近的K个训练数据,并统计它们中出现最多的标签类别。

  4. 将测试数据归类为出现次数最多的标签类别。

二、KNN算法实现

        KNN算法的实现通常可以使用Python等编程语言进行实现

        

import numpy as npclass KNN():def __init__(self, k=3, distance='euclidean'):self.k = kself.distance = distancedef fit(self, X, y):self.X_train = Xself.y_train = ydef predict(self, X):y_pred = []for x in X:distances = []for i, x_train in enumerate(self.X_train):if self.distance == 'euclidean':dist = np.linalg.norm(x - x_train)elif self.distance == 'manhattan':dist = np.sum(np.abs(x - x_train))distances.append((dist, self.y_train[i]))distances.sort()neighbors = distances[:self.k]classes = {}for neighbor in neighbors:if neighbor[1] in classes:classes[neighbor[1]] += 1else:classes[neighbor[1]] = 1max_class = max(classes, key=classes.get)y_pred.append(max_class)return y_pred

        这段代码实现了基本的KNN分类算法,包括fit函数进行训练集拟合,predict函数进行预测。其中k参数表示要选择的最近邻居数,distance参数为距离度量方法。在上述示例代码中,欧氏距离和曼哈顿距离两种距离度量方法均已实现。

        通过选择不同的数据集和参数,可以验证KNN算法的分类性能。在实现KNN算法时,还可以采用更加高效的数据结构(如kd树、球树)和距离度量方法等技巧,来对算法进行优化和改进。

三、 MATLAB实现

        

  1. 使用pdist2函数计算欧氏距离,而不是手动计算,可以极大地提高计算速度。

  2. 在计算距离之后,直接利用sort函数进行排序,并选择前k个最近邻。这样可以简化代码,并且使用向量化计算,计算速度更快。

  3. 使用mode函数求取邻居中出现次数最多的类别作为预测结果,并且使用2维输入方式保证正确性。

function y_pred = knn(X_train, y_train, X_test, k)n_train = size(X_train, 1);n_test = size(X_test, 1);y_pred = zeros(n_test, 1);% 计算欧氏距离distances = pdist2(X_train, X_test);% 选择前k个最近邻[~, indices] = sort(distances);neighbors = y_train(indices(1:k,:));% 使用投票法预测标签y_pred = mode(neighbors, 1)';
end

四、 实战

     在这里根据一个人收集的约会数据,根据主要的样本特征以及得到的分类,对一些未知类别的数据进行分类,大致就是这样。 

     我使用的是python 3.4.3,首先建立一个文件,例如date.py,具体的代码如下:

#coding:utf-8from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as plt###导入特征数据
def file2matrix(filename):fr = open(filename)contain = fr.readlines()###读取文件的所有内容count = len(contain)returnMat = zeros((count,3))classLabelVector = []index = 0for line in contain:line = line.strip() ###截取所有的回车字符listFromLine = line.split('\t')returnMat[index,:] = listFromLine[0:3]###选取前三个元素,存储在特征矩阵中classLabelVector.append(listFromLine[-1])###将列表的最后一列存储到向量classLabelVector中index += 1##将列表的最后一列由字符串转化为数字,便于以后的计算dictClassLabel = Counter(classLabelVector)classLabel = []kind = list(dictClassLabel)for item in classLabelVector:if item == kind[0]:item = 1elif item == kind[1]:item = 2else:item = 3classLabel.append(item)return returnMat,classLabel#####将文本中的数据导入到列表##绘图(可以直观的表示出各特征对分类结果的影响程度)
datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')
fig = plt.figure()
ax = fig.add_subplot(111)
ax.scatter(datingDataMat[:,0],datingDataMat[:,1],15.0*array(datingLabels),15.0*array(datingLabels))
plt.show()## 归一化数据,保证特征等权重
def autoNorm(dataSet):minVals = dataSet.min(0)maxVals = dataSet.max(0)ranges = maxVals - minValsnormDataSet = zeros(shape(dataSet))##建立与dataSet结构一样的矩阵m = dataSet.shape[0]for i in range(1,m):normDataSet[i,:] = (dataSet[i,:] - minVals) / rangesreturn normDataSet,ranges,minVals##KNN算法
def classify(input,dataSet,label,k):dataSize = dataSet.shape[0]####计算欧式距离diff = tile(input,(dataSize,1)) - dataSetsqdiff = diff ** 2squareDist = sum(sqdiff,axis = 1)###行向量分别相加,从而得到新的一个行向量dist = squareDist ** 0.5##对距离进行排序sortedDistIndex = argsort(dist)##argsort()根据元素的值从大到小对元素进行排序,返回下标classCount={}for i in range(k):voteLabel = label[sortedDistIndex[i]]###对选取的K个样本所属的类别个数进行统计classCount[voteLabel] = classCount.get(voteLabel,0) + 1###选取出现的类别次数最多的类别maxCount = 0for key,value in classCount.items():if value > maxCount:maxCount = valueclasses = keyreturn classes##测试(选取10%测试)
def datingTest():rate = 0.10datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet.txt')normMat,ranges,minVals = autoNorm(datingDataMat)m = normMat.shape[0]testNum = int(m * rate)errorCount = 0.0for i in range(1,testNum):classifyResult = classify(normMat[i,:],normMat[testNum:m,:],datingLabels[testNum:m],3)print("分类后的结果为:,", classifyResult)print("原结果为:",datingLabels[i])if(classifyResult != datingLabels[i]):errorCount += 1.0print("误分率为:",(errorCount/float(testNum)))###预测函数
def classifyPerson():resultList = ['一点也不喜欢','有一丢丢喜欢','灰常喜欢']percentTats = float(input("玩视频所占的时间比?"))miles = float(input("每年获得的飞行常客里程数?"))iceCream = float(input("每周所消费的冰淇淋公升数?"))datingDataMat,datingLabels = file2matrix('D:\python\Mechine learing in Action\KNN\datingTestSet2.txt')normMat,ranges,minVals = autoNorm(datingDataMat)inArr = array([miles,percentTats,iceCream])classifierResult = classify((inArr-minVals)/ranges,normMat,datingLabels,3)print("你对这个人的喜欢程度:",resultList[classifierResult - 1])

新建test.py文件了解程序的运行结果,代码:

#coding:utf-8from numpy import *
import operator
from collections import Counter
import matplotlib
import matplotlib.pyplot as pltimport sys
sys.path.append("D:\python\Mechine learing in Action\KNN")
import date
date.classifyPerson()

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

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

相关文章

TCP--拥塞控制

大家好,我叫徐锦桐,个人博客地址为www.xujintong.com。平时记录一下学习计算机过程中获取的知识,还有日常折腾的经验,欢迎大家来访。 TCP中另一个重要的点就是拥塞控制,TCP是无私的当它感受到网络拥堵了,就…

transformer理解

李宏毅老师讲解的Transformer,非常简单易懂:https://www.youtube.com/watch? RNN存在的问题是,只有得到t(i)时刻的向量信息才能够计算t(i1)时刻的向量信息,无法实现并行化。无法实现长序列的特征信息提取,超过一篇文章…

【C++】哈希应用——海量数据面试题

哈希应用——海量数据面试题 一、位图应用1、给定100亿个整数,设计算法找到只出现一次的整数?2、给两个文件,分别有100亿个整数,我们只有1G内存,如何找到两个文件交集?(1)用一个位图…

Node.js与npm版本比对

Node.js与npm版本比对 Node.js与npm版本比对版本对比表Node版本对比 Node.js与npm版本比对 我们在项目开发过程中,经常会遇到公司一些老的前端工程项目,而我们当前的node及npm版本都是相对比较新的了。 在运行以前工程时,会遇到相关环境不匹…

浅谈uniapp中开发安卓原生插件

其实官方文档介绍的比较清楚而且详细,但是有时候他太墨迹,你一下子找不到自己想要的,所以我总结了一下开发的提纲,也是为了自己方便下次使用。 1.第一步,下载官方提供的Android的示例工程,然后倒入UniPlugin-Hello-AS工程请在App离线SDK中查找,之后Android studio,编译运行项目…

不会用PS抠图?教你懒人抠图法,必须学会!

相信很多小伙伴都有遇到这样的窘境——好不容易找到得素材图片,中间的图案很好看,可是特别想去掉后面的背景,应该如何抠图呢? 能够将图片中的物品或人物抠出来是一种很有用的技巧,可以在很多场景下应用,比…

MySQL -- 环境安装(CentOS7)

MySQL – 环境安装(CentOS7) 文章目录 MySQL -- 环境安装(CentOS7)一、环境安装1.卸载不必要的环境2.检查系统安装包3.卸载默认安装包4.获取MySQL官方yum源6.看看yum源能不能正常工作7.安装mysql服务 二、MySQL登录与配置1.启动My…

论文阅读 - Coordinated Behavior on Social Media in 2019 UK General Election

论文链接: https://arxiv.org/abs/2008.08370 目录 摘要: Introduction Contributions Related Work Dataset Method Overview Surfacing Coordination in 2019 UK GE Analysis of Coordinated Behaviors 摘要: 协调的在线行为是信息…

造车先做三蹦子220101--机器学习字符(字母、和数字识别)的“小白鼠”与“果蝇”

“0”数字字符零 的图片(16*16点阵): #Letter23Digital23R231006d.pyimport torch import torch.nn as nn import torch.optim as optim #optimizer optim.SGD(model.parameters(), lr0.01) from PIL import Image from PIL import ImageDraw from PIL import Im…

取证之查看本机保存的WiFi密码

一、电脑保存有WiFi密码,且正常连接该WiFi 1、打开网络适配器高级选项 2、双击无线网卡,选择无线属性 3、点击安全,显示字符,即可看到WiFi密码。 二、电脑保存有密码,但是没有链接WiFi。 1、查看wlan接口上的配置文件…

OSPF的网络类型

1.3配置OSPF的网络类型 1.3.1实验3&#xff1a;配置P2P网络类型 实验需求 实现单区域OSPF的配置实现通过display命令查看OSPF的网络类型 实验拓扑 实验拓扑如图1-11所示 图1-11 配置P2P网络类型 实验步骤 步骤1&#xff1a;[1] 配置IP地址 路由器R1[2] 的配置 <Huawe…

【鸿蒙软件开发】文本显示(Text/Span)

文章目录 前言一、Text控件1.1 创建文本string字符串引用Resource资源 1.2 添加子组件创建Span文本装饰线和样式文本装饰线设置文字一直保持大写/小写添加事件。 1.3 自定义文本样式文本对齐长文本处理设置行高通过decoration属性设置文本装饰线样式及其颜色。通过baselineOffs…

Excel·VBA制作工资条

看到一篇博客《excel表头_Excel工资表怎么做&#xff1f;3分钟学会利用函数生成工资表》&#xff0c;使用排序功能、函数制作工资条。但如果需要经常制作工资条&#xff0c;显然使用VBA更加方便 VBA制作工资条 Sub 制作工资条()Dim title_row&, blank_row&, ws_new$,…

在 Python 中使用 Pillow 进行图像处理【3/4】

第三部分 一、腐蚀和膨胀 您可以查看名为 的图像文件dot_and_hole.jpg&#xff0c;您可以从本教程链接的存储库中下载该文件&#xff1a; 该二值图像的左侧显示黑色背景上的白点&#xff0c;而右侧显示纯白色部分中的黑洞。 侵蚀是从图像边界去除白色像素的过程。您可以通过使用…

【CANoe】文件处理_hex文件读取解析

hex文件里面只有00&#xff0c;01&#xff0c;04三种码。那么我们在解析的时候只需要对这三种不同状态的进行不同的解析即可。 hex文件格式的解析&#xff0c;可阅读&#xff1a;HEX文件格式详解 首先创建一个Block的结构体&#xff0c;根据经验我们知道&#xff0c;一个数据…

如何使用vim粘贴鼠标复制的内容

文章目录 一、使用步骤1.找到要编辑的配置文件2.找到目标文件3.再回到vim编辑器 一、使用步骤 1.找到要编辑的配置文件 用sudo vim /etc/apt/sources.list编辑软件源配置文件 sudo vim /etc/apt/sources.listvim 在默认的情况下当鼠标选中的时候进入的 Visual 模式&#xff…

开源WAF--Safeline(雷池)测试手册

长亭科技—雷池(SafeLine)社区版 官方网站:长亭雷池 WAF 社区版 (chaitin.cn) WAF 工作在应用层&#xff0c;对基于 HTTP/HTTPS 协议的 Web 系统有着更好的防护效果&#xff0c;使其免于受到黑客的攻击 1.1 雷池的搭建 1.1.1 配置需求 操作系统&#xff1a;Linux 指令架构&am…

【数据分享】2023年我国科技型中小企业数据(免费获取/Excel格式/Shp格式)

企业是经济活动的参与主体&#xff0c;一个城市的企业数量决定了这个城市的经济发展水平&#xff01;之前我们分享过2023年高新技术企业数据&#xff08;可查看之前的文章获悉详情&#xff09;&#xff0c;我国专精特新“小巨人”企业数据&#xff08;可查看之前的文章获悉详情…

基于SpringBoot的学生班级考勤管理系统

基于SpringBootVue的学生班级考勤管理系统的设计与实现~ 开发语言&#xff1a;Java数据库&#xff1a;MySQL技术&#xff1a;SpringBootMyBatisVue工具&#xff1a;IDEA/Ecilpse、Navicat、Maven 系统展示 管理员界面 课程管理 班级管理 学生管理 学生界面 考勤管理 摘要 学生…

zzy-project-cli,提供多个框架的脚手架

npm地址 install npm install zzy-project-cli -g做什么&#xff1f; 将多个可选的框架提供给使用者选择&#xff0c;选中后自动下载对应模板&#xff0c;快捷使用。 使用 step1 zzy-cli create [项目名称]step2 获取模板之后选取任一进行下载 下载完成之后即可使用 模…