一、KNN最近邻算法原理

1.KNN(k-nearest neighbor)最近邻算法是一种有监督学习(存在特征标签)能够解决分类与回归问题的方法,是一个理论上比较成熟的、也是最简单的机器学习算法之一。KNN算法中在给定的一个数据集中,其中数据集实例分类已经确定。对于已知某新的特征实例且未知分类时,根据其K个最近邻居训练样本实例进行统计分析类别,有多数表决进行决策新实例的分类。

图中K个最近邻居的值、相似度计量决定了圆域半径,在圆域中进行训练样本实例分类统计,有类别占比多数决定新实例的分类。

二、KNN算法关键参数

2.KNN最近邻法三要素:距离度量(相似度计量)、K值的选择和分类决策规则。

距离度量(相似度计量) 

分类之间相似度的计算采用距离度量,常见的距离度量:欧氏距离、曼哈顿距离、明科夫斯基距离。一般采用欧氏距离。

 K值的选择

k值的选项表示对分类甄别条件的宽松或严苛。当K值过小时,k近邻模型更复杂,新实例的分类容易受到局部少数训练实例的影响,容易发生欠拟合;当K值过大时,k近邻模型更简单,容易发生过拟合,导致泛化性能下降。因此k 值得选择会对分类结果产生重大影响。k 值的选择反映了对近似误差与估计误差之间的权衡,通常由交叉验证选择最优的k值 。

(交叉验证)

交叉验证的基本想法是重复地使用数据,把给定的数据进行切分,将切分的数据组合为训练集与测试集,在此基础上反复进行训练测试以及模型的选择。在实现过程中将采用sklearn.model_selection.cross_val_score()实现交叉验证选取k kk值。

分类决策规则

分类决策规则往往是多数表决,即由输入实例的k kk个邻近输入实例中的多数类决定输入实例的类

如果K=3,那么离绿色点最近的有2个红色三角形和1个蓝色的正方形,这3个点投票,于是绿色的这个待分类点属于红色的三角形。

如果K=5,那么离绿色点最近的有2个红色三角形和3个蓝色的正方形,这5个点投票,于是绿色的这个待分类点属于蓝色的正方形。

三、KNN算法实践(KNN实现鸢尾花分类)

步骤:

算距离:给定待分类样本,计算它与已分类样本中的每个样本的距离;

找邻居:圈定与待分类样本距离最近的K个已分类样本,作为待分类样本的近邻;

做分类:根据这K个近邻中的大部分样本所属的类别来决定待分类样本该属于哪个分类;

数据集:鸢尾花数据集

KNN算法文件:KnnAlgorithm.py

# -*- coding: utf-8 -*-
"""
Created on Tue Jul 19 10:10:40 2022@author: 文浩
"""import numpy as npdef knn(inX,DataSet,Label,K):#欧几里得距离计算样本之间的相似度dist = (((DataSet-inX)**2).sum(1))**0.5#返回后排序的索引值 sortedDist = dist.argsort()#统计训练样本分类次数classCount = {}for i in range(K):voteLabel = Label[sortedDist[i]]classCount[voteLabel] = classCount.get(voteLabel,0)+1#找出训练样本中类别频次最高maxtype = 0maxcount = -1for key,value in classCount.items():if value > maxcount:maxtype = keymaxcount = valuereturn maxtype

主体代码

# -*- coding: utf-8 -*-
"""
Created on Mon Jul 25 10:08:07 2022@author: 文浩
"""
import numpy as np
import KnnAlgorithm as K#特征矩阵函数实现
#将数据集中的数据提炼出特征矩阵,标签向量
def filematrix(filename):fr = open(filename)numberfileLines = len(fr.readlines())returnMatrix = np.zeros((numberfileLines,4))classLabelVector = []fr = open(filename)index = 0for line in fr.readlines():line = line.strip() listFromLine = line.split(",")returnMatrix[index,:] = listFromLine[0:4]if listFromLine[-1] == 'Iris-setosa':classLabelVector.append(1)elif listFromLine[-1] == 'Iris-versicolor':classLabelVector.append(2)elif listFromLine[-1] == 'Iris-virginica':classLabelVector.append(3)index += 1return returnMatrix,classLabelVector#归一化(当测试集中某个特征向量对测试样本模型计算结果远远大于其他特征时需要进行)
#数据归一化的目的就是为了把不同来源的数据统一到同一数量级
#0-1标准化
#线性归一化,也称min-max标准化、离差标准化;
#是对原始数据的线性变换,使得结果值映射到[0,1]之间。转换函数如下
def autoNorm(dataSet):#min(0) 参数0 代表是按照列 进行运算   1 代表按照行 进行运算minVals = dataSet.min(0)  maxVals = dataSet.max(0)#初始化 zero 0 矩阵normDataSet = np.zeros(dataSet.shape)  normDataSet = (dataSet - minVals)/(maxVals - minVals)return normDataSetdatingDataMatrix,datingLabels = filematrix('iris.txt')
print("特征矩阵:\n",datingDataMatrix)
print("标签向量:",datingLabels)#归一化后的特征矩阵
#dataSet=autoNorm(datingDataMat)
#print(dataSet)#划分测试集和训练集  分占比例
m = 0.9
dataSize = datingDataMatrix.shape[0]
print("样本总的行数:",dataSize)
trainSize=int(m*dataSize)
testSize=int((1-m)*dataSize)
print("训练样本数:%d,测试样本%d"%(trainSize,testSize))
k=5
error=0
for i in range(testSize):#调用knn 最近邻算法result=K.knn(datingDataMatrix[trainSize+i,:],datingDataMatrix[0:trainSize,:],datingLabels[0:trainSize],k)if result!=datingLabels[trainSize+i-1]:error=error+1
print("error:",error/testSize)

运行结果:(当训练样本与测试样本为9:1时,KNN算法分类效果最好,错误率几乎可以达到0)

四、KNN算法总结

KNN算法优点:

操作简单易用,相比其他算法,KNN算是比较简洁明了的算法。
模型训练时间快,
对于分类预测效果好。
对异常值不敏感

KNN算法缺点:

对内存要求较高,因为该算法存储了所有训练数据
预测阶段可能很慢
对不相关的功能和数据规模敏感

机器学习-KNN最近邻算法原理及实践相关推荐

  1. 【机器学习】最近邻算法KNN原理、流程框图、代码实现及优缺点

    通过机器学习教学视频,初识KNN算法,对原理和算法流程通过小应用进行Python实现,有了自己的一些理解.因此在此整理一下,既是对自己学习的阶段性总结,也希望能和更多的朋友们共同交流学习相关算法,如有 ...

  2. 3. KNN最近邻算法详解与关键技术剖析(理论篇)

    一.KNN算法概述 K最近邻(K-Nearest-Neighbour,KNN)算法可以说是最简单的分类算法,易于理解,其核心思想就是距离的比较,即离谁最近,就被归类于谁(群体投票的方式). 通俗解释: ...

  3. opencv(python)使用knn最近邻算法识别手写数字

    knn最近邻算法是一种分类以及回归算法,算法原理是一个样本与样本集中k个样本最相似,如果这k个样本的大多数也属于同一个类别,则该样本也属于这一类.关于knn算法的详细原理读者可以在网上找一些资料了解下 ...

  4. kmeans算法原理以及实践操作

    原文:http://www.cnblogs.com/dudumiaomiao/p/5839905.html kmeans算法原理以及实践操作(多种k值确定以及如何选取初始点方法) kmeans一般在数 ...

  5. 【操作系统】进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践

    0 前言 接上一篇文章:进程调度(2a):SJF(短任务优先) 算法 原理与实践 1 前提铺垫 与上一篇同. 2 STCF 原理 STCF(Shortest Time-to-Completion Fi ...

  6. 【操作系统】进程调度(2a):SJF(短任务优先) 算法 原理与实践

    0 前言 接上一篇文章:进程调度(1):FIFO(先进先出)算法 原理与实践 1 前提铺垫 请参考上一篇文章的前提铺垫部分,本文与之完全一致. 2 SJF 原理 SJF(Shortest Job Fi ...

  7. LSA/LSI算法原理和实践

    本篇文章主要转载自LSI/LSA算法原理与实践Demo 目录: 1.使用场景 2.优缺点 3.算法原理 3.1.传统向量空间模型的缺陷 3.2.Latent Semantic Analysis (La ...

  8. OpenCV4学习笔记(55)——基于KNN最近邻算法实现鼠标手写数字识别

    在上一篇博客<OpenCV4学习笔记(54)>中,整理了关于KNN最近邻算法的一些相关内容和一个手写体数字识别的例子.但是上次所实现的手写体数字识别,每次只能固定地输入测试图像进行预测,而 ...

  9. 【操作系统】进程调度(3):RR(轮转) 算法 原理与实践

    0 前言 接上一篇文章:进程调度(2b):STCF(最短完成时间优先) 算法 原理与实践 1 前提铺垫 除了与上一篇相同的,这里介绍新的基础知识. 1.1 三种类型的程序 计算密集型(CPU导向) 输 ...

最新文章

  1. CocoaPod 使用之后知后觉
  2. rust外服组建战队_[新手教程]模组服服务器指令大全(最新版)
  3. c语言程序设计函数6,C语言程序设计》第6章函数-XiamenUniversity.PDF
  4. Docker的运行机制
  5. 仪征市第二中学计算机老师,静心倾听花自开 ——仪征市第二中学徐丞老师
  6. 学php还是golang,学swoole还是golang
  7. 103. 二叉树的锯齿形层次遍历/102. 二叉树的层序遍历
  8. HTML5个人求职简历模板下载
  9. 一个德国设计奖,怎么就成了中国品牌的财富密码
  10. 使用TASM时报错extra characters on line的解决办法
  11. python占位符_Python(2)——Python的基础语句
  12. 11.微服务设计 --- 规模化微服务
  13. 1299: Problem 1
  14. 第二章 2.群中的等价关系 -- 陪集,共轭,正规子群与商群
  15. 英语读音(一) English Pronounciation
  16. Python3输出所有大小写字母(字母表)、数字
  17. 我的MATLAB学习之路
  18. 手把手教学 | Jenkins安装与环境搭建,附细节图。百度也比不上我
  19. 在 iPhone 上体验安卓系统,无需越狱,免费
  20. 上海博物馆——古代的邂逅

热门文章

  1. 成人用品的UML建模
  2. 小孩几岁学计算机合适,孩子几岁学电脑最合适?
  3. 写作小技能:开篇制胜的首段:写序言的故事模板(SCQA: Situation情境, Conflict冲突, Question问题, Answer回答。)
  4. 【java后端学习路线3】SSM+Linux+Git学习指南,985本海硕自学转码
  5. 俯仰角,赤经赤纬,望远镜
  6. 【网络】Wireshark对远程主机抓包|过滤|原理
  7. 七年级上学期计算机测试题,七年级英语上学期期末测试题及答案
  8. 软考 - 软件设计师 - 下午-案例分析 做题技巧与考点整理
  9. 平板电脑必装十大软件_知乎高赞回答:职场新人必装的电脑软件有哪些?太全了!...
  10. dubbo源码之拦截调用