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

1、KNN算法原理

KNN,全称k-NearestNeighbor,即常说的k邻近算法。

该算法的核心思想:一个样本x与样本集中的k个最相邻的样本中的大多数属于某一个类别yLabel,那么该样本x也属于类别yLabel,并具有这个类别样本的特性。简而言之,一个样本与数据集中的k个最相邻样本中的大多数的类别相同

由其思想可以看出,KNN是通过测量不同特征值之间的距离进行分类,而且在决策样本类别时,只参考样本周围k个“邻居”样本的所属类别。因此比较适合处理样本集存在较多重叠的场景,主要用于聚类分析、预测分析、文本分类、降维等,也常被认为是简单数据挖掘算法的分类技术之一。

2、KNN流程框图

在建立训练集时,就要确定训练数据及其对应的类别标签;然后把待分类的测试数据与训练集数据依次进行特征比较;从训练集中挑选出最相近的k个数据,这k个数据中投票最多的分类,即为新样本的类别。

为了方便阅读算法流程,将其描述为如下流程框图:

3、KNN代码实现

参考《视觉机器学习 20讲》,整理KNN算法的伪代码如下:

Algorithm KNN(A[n], k)
{Input: A[n]为N个训练样本的分类特征;k为近邻个数;Initialize:选择A[1]至A[k]作为x的初始近邻;计算初始近邻与测试样本x间的欧氏距离d(x, A[i]), i=1,2,...k;按d(x, A[i])从小到大排序;计算最远样本与x间的距离D,即max{d(x, A[j]) | j=1,2...k};for(i=k+1; i<n+1; i++)计算A[i]与x间的距离d(x, A[i]);if  (d(x, A[i]) < D ) then用A[i]代替最远样本;按照d(x, A[i])从小到大排序;计算最远样本与x间的距离D,即max{d(x, A[j]) | j=1,...i};计算前k个样本A[i]所属类别的概率,i=1,2,...k;具有最大概率的类别即为样本x的类;end forOutput: x所属的类别。
}

参照麦子学院彭亮主讲机器学习课程中,KNN的Python代码,实现了KNN算法的分类功能。

import csv
import random
import math
import operator#导入数据,并分为训练集和测试集
def loadDataset(filename, split, trainingSet = [], testSet = []):with open(filename, 'rt') as csvfile:lines = csv.reader(csvfile)dataset = list(lines)for x in range(len(dataset)-1):for y in range(4):dataset[x][y] = float(dataset[x][y])if random.random() < split:trainingSet.append(dataset[x])else:testSet.append(dataset[x])#求欧拉距离
def euclideanDistance(instance1, instance2, length):distance = 0for x in range(length):distance += pow((instance1[x]-instance2[x]), 2)return math.sqrt(distance)#计算最近邻(K个数据集),testInstance是实例
def getNeighbors(trainingSet, testInstance, k):distances = []length = len(testInstance)-1for x in range(len(trainingSet)):#testinstancedist = euclideanDistance(testInstance, trainingSet[x], length)distances.append((trainingSet[x], dist))#distance是一个多个元组的list#distances.append(dist)distances.sort(key=operator.itemgetter(1))#按照dist排序neighbors = []for x in range(k):neighbors.append(distances[x][0])#要的是数据集return neighbors#投票法找出最近邻的结果哪种最多
def getResponse(neighbors):classVotes = {}#key--花名字 value--个数for x in range(len(neighbors)):response = neighbors[x][-1]if response in classVotes:classVotes[response] += 1else:classVotes[response] = 1sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True)return sortedVotes[0][0]#求出精确性
def getAccuracy(testSet, predictions):correct = 0for x in range(len(testSet)):if testSet[x][-1] == predictions[x]:correct += 1return (correct/float(len(testSet)))*100.0def main():#prepare datatrainingSet = []testSet = []split = 1/3loadDataset(r'E:\pycharmcode\irisdata.txt', split, trainingSet, testSet)print('Train set: '+ repr(len(trainingSet)))print('Test set: ' + repr(len(testSet)))#generate predictionspredictions = []k = 3for x in range(len(testSet)):# trainingsettrainingSet[x]neighbors = getNeighbors(trainingSet, testSet[x], k)result = getResponse(neighbors)predictions.append(result)print ('>predicted=' + repr(result) + ', actual=' + repr(testSet[x][-1]))accuracy = getAccuracy(testSet, predictions)print('Accuracy: ' + repr(accuracy) + '%')

4、KNN算法优缺点

4.1、优点

(1)理论成熟简单,易于理解及算法实现;

(2) 可以用于多分类分类、回归等;

4.2、缺点

(1)需要计算待分类样本与所有已知样本的距离,计算量大;

(2)样本容量小或样本分布不均衡时,容易分类错误,后者可通过施加距离权重进行改善

5、参考资料

1、《视觉机器学习 20讲》;

2、K-近邻(KNN)算法;

3、机器学习实战之kNN算法;

4、KNN(k-nearest neighbor的缩写)最近邻算法原理详解;

5、麦子学院在线课程;

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

  1. 【机器学习】K-Means算法的原理流程、代码实现及优缺点

    分类是根据样本某些属性或某类特征(可以融合多类特征),把样本类型归为已确定的某一类别中.机器学习中常见的分类算法有:SVM(支持向量机).KNN(最邻近法).Decision Tree(决策树分类法) ...

  2. 机器学习算法(二十四):最近邻算法 KNN(k-nearest neighbor)

    目录 1 基于实例的学习 2 k-最近邻法 2.1 算法概述 2.2 kNN算法的一般流程 2.3 距离公式 2.4 k值的选择 2.5 KNN特点 2.5.1 特点 2.5.2 KNN算法的优势和劣 ...

  3. python机器学习案例系列教程——K最近邻算法(KNN)、kd树

    全栈工程师开发手册 (作者:栾鹏) python数据挖掘系列教程 K最近邻简介 K最近邻属于一种估值或分类算法,他的解释很容易. 我们假设一个人的优秀成为设定为1.2.3.4.5.6.7.8.9.10 ...

  4. 邻近算法(KNN)原理简单解析

    邻近算法(KNN)原理简单解析 一.什么是邻近算法 1.1简介 1.2核心思想 1.3 算法流程 1.4 优缺点 二.实例演示KNN算法 一.什么是邻近算法 1.1简介 邻近算法,或者说K最近邻(KN ...

  5. 4列的计算机代码,干货 | 10分钟带你彻底了解column generation(列生成)算法的原理附java代码...

    OUTLINE 前言 预备知识预警 什么是column generation 相关概念科普 Cutting Stock Problem CG求解Cutting Stock Problem 列生成代码 ...

  6. 机器学习-分类之K近邻算法(KNN)原理及实战

    k近邻算法(KNN) 简介 KNN算法是数据挖掘分类技术中最简单的方法之一.它通过测量不同特征值之间的距离进行分类的.其基本思路为:如果一个样本在特征空间中的k个最近邻样本中的大多数属于某一个类别,则 ...

  7. 分类算法-KNN(原理+代码+结果)

    KNN,即K最邻近算法,是数据挖掘分类技术中比较简单的方法之一,简单来说,就是根据"最邻近"这一特征对样本进行分类. 1.K-means和KNN区别 K-means是一种比较经典的 ...

  8. 教你掌握经典机器学习算法背后原理,解决代码模型参数问题!

    限时限量98元   每过50人涨价一次! 扫码报名↑ 现加入13小时无监督学习课程! 共计40+节视频课.20+节作业讲解课 现在加入,仅需198元 想要逃避总有借口,想要成功总有方法 10周,你能收 ...

  9. 掌握经典机器学习算法背后原理,解决代码模型参数问题!

    限时限量98元   每过50人涨价一次! 扫码报名↑ 现加入13小时无监督学习课程! 共计40+节视频课.20+节作业讲解课 总计800多分钟视频课! 现在加入,仅需198元 想要逃避总有借口,想要成 ...

最新文章

  1. TensorFlow、PyTorch夹缝之下:后浪的进击和野望
  2. Linux下SVN安装配置全程实录(转)
  3. 普通人和程序员看到的树
  4. 【剑指offer - C++/Java】7、斐波那契数列
  5. HDU 1828:Picture(扫描线+线段树 矩形周长并)
  6. 韩国浦项化学在中国斥资超2800亿韩元投建电动车电池材料厂
  7. html报错页面,多页面配置生成的html报错
  8. Python人工智能入门(修订版)
  9. 文件传输工具WinSCP下载安装教程
  10. Use of @OneToMany or @ManyToMany targeting an unmapped class
  11. 《FPGA设计实战演练》学习笔记(二)FPGA核心板电路设计
  12. telegram bot : 自动下载youtube视频 发送到电报客户端
  13. 利用PHP的特性做免杀Webshell
  14. [转]Go语言(Golang)的Web框架比较:gin VS echo
  15. 最后几张票,送完即止:KubeCon 2021中国大会
  16. flash打印纸张设置
  17. .c和.h文件的区别
  18. C++重载相等运算符operator==的两种方式
  19. GitHub 前 CTO:全面微服务是最大的架构错误!网友:这不是刚改完吗...
  20. 网狐、6878、EWIN后台管理员帐号密码 对应数据库表

热门文章

  1. Matlab实用程序--图形应用-填充图
  2. 2020-12-11 图片格式互转:base64、PIL Image opencv cv2互转
  3. 解决在IOS系统及微信中audio、video不能自动播放的问题
  4. weex的实践踩坑日常(一)
  5. C~K的班级_JAVA
  6. 学习鸟哥的Linux私房菜笔记(3)——基础使用
  7. java7新特性之Try-with-resources statement
  8. CouncurrentHashMap源码解析
  9. JVM内存管理–GC算法精解(五分钟让你彻底明白标记/清除算法)
  10. 分布式消息系统:Kafka