KNN简介

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

1.计算测试数据与各个训练数据之间的距离,选用欧式距离,计算每个点到数据集(训练集)的所有距离,

  1. distance=((x1-x2)**2+(y1-y2)**2)**0.5

2.按照距离的递增关系进行排序,使用argsort(distances.argsort())函数,返回数据集从小到大排列的数据下表,
3.选取距离最小的K个点,与输入k值有关,使用for函数遍历k
4.确定前K个点所在类别的出现频率,class_count[label]=class_count.get(label,0)+1

5.返回前K个点中出现频率最高的类别作为测试数据的预测分类,sorted_class=sorted(class_count.items(),key=operator.itemgetter(1),reverse=True),sorted_class[0][0]。

代码如下:我们把收入工资和年龄作为数据集,进行判别某个年龄和对应收入,有没有资格谈恋爱!

  1. #!/usr/bin/python
  2. # -*- coding:<utf-8> -
  3.  
  4. import numpy as np
  5. import operator
  6.  
  7. def createDateset():
  8. group=np.array([[5000,25],[2200,32],[7000,32],[26000,29],[20000,35]])
  9. labels=('没有资格谈恋爱','有资格谈恋爱','没有资格谈恋爱','有资格谈恋爱','有资格谈恋爱')
  10. return group,labels
  11.  
  12. def classfy(input,dataSet,labels,k):
  13.  
  14. datasize=dataSet.shape[0] #计算数组集的行数,numpy中shape[0]返回数组的行数,shape[1]返回列数
  15. diffdata=np.tile(input,(datasize,1))-dataSet#np.tile(input,(datasize,1)),对测试数据进行横向复制,使其拥有与其数据集一样的维度
  16. squrdata=diffdata**2#计算相减后的平方,欧式距离,distance=((x1-x2)**2+(y1-y2)**2)**0.5
  17. sum_squr_data=squrdata.sum(axis=1)
  18. distances=sum_squr_data**0#.欧式距离:distance=((x1-x2)**2+(y1-y2)**2)**0.5
  19. print('测试的数据距离数据集的距离分别是:',distances)
  20.  
  21. sorted_distance=distances.argsort()
  22. print('距离从小到大的下标为:',sorted_distance)
  23.  
  24. class_count={}
  25. for i in range (k):
  26. label=labels[sorted_distance[i]]
  27. class_count[label]=class_count.get(label,0)+1#a[b]=a.get(b,0)+1,对字典a赋值,当在字典a中找到
  28. #key为b的键值的时候,取1,找不到的时候取0并加1,即等号坐标为key,右边为value
  29. print('class_count:',class_count)
  30. sorted_class=sorted(class_count.items(),key=operator.itemgetter(1),reverse=True)##key=operator.itemgetter(1)根据字典的值进行排序
  31. #key=operator.itemgetter(0)根据字典的键进行排序
  32. print('sorted_class:',sorted_class)
  33. return sorted_class[0][0]
  34.  
  35. if __name__ == '__main__':
  36. group,labels=createDateset()
  37. test=(6000,36)
  38. test_class=classfy(test,group,labels,5)
  39. print(test_class)
  1. #运行结果如下:
    测试的数据距离数据集的距离分别是: [1 1 1 1 1]
  2. 距离从小到大的下标为: [0 1 2 3 4]
  3. class_count: {'没有资格谈恋爱': 1}
  4. class_count: {'没有资格谈恋爱': 1, '有资格谈恋爱': 1}
  5. class_count: {'没有资格谈恋爱': 2, '有资格谈恋爱': 1}
  6. class_count: {'没有资格谈恋爱': 2, '有资格谈恋爱': 2}
  7. class_count: {'没有资格谈恋爱': 2, '有资格谈恋爱': 3}
  8. sorted_class: [('有资格谈恋爱', 3), ('没有资格谈恋爱', 2)]
  9. 有资格谈恋爱
  10.  
  11. Process finished with exit code 0

KNN算法的优点:

1.KNN理论简单,容易实现,简单,有效。

2、KNN是一种在线技术,新数据可以直接加入数据集而不必进行重新训练

KNN算法缺点:

1.KNN算法是懒散学习方法(lazy learning,基本上不学习),一些积极学习的算法要快很多。

2.对于样本容量大的数据集计算量比较大。

3.样本不平衡时,预测偏差比较大。如:某一类的样本比较少,而其它类样本比较多。

4.KNN每一次分类都会重新进行一次全局运算。

5.k值大小的选择。

机器学习算法(KNN)的更多相关文章

  1. Python机器学习算法 — KNN分类

    KNN简介 K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.KNN分类算法属于监督学习. 最简单最初级的分类器是将全部的训练 ...

  2. 机器学习算法-K-NN的学习 /ML 算法 (K-NEAREST NEIGHBORS ALGORITHM TUTORIAL)

    1为什么我们需要KNN 现在为止,我们都知道机器学习模型可以做出预测通过学习以往可以获得的数据. 因为KNN基于特征相似性,所以我们可以使用KNN分类器做分类. 2KNN是什么? KNN K-近邻,是 ...

  3. 机器学习算法·KNN

    机器学习算法应用·KNN算法 一.问题描述 验证码目前在互联网上非常常见,从学校的教务系统到12306购票系统,充当着防火墙的功能.但是随着OCR技术的发展,验证码暴露出的安全问题越来越严峻.目前对验 ...

  4. 机器学习算法——kNN

    顶级数据挖掘会议ICDM于2006年12月评选出了数据挖掘领域的十大经典算法,kNN便是其中一个. kNN算法的思想是:在训练集中选取与输入数据最近的k个邻居,统计k个邻居中出现次数最多的类别,以此作 ...

  5. 机器学习算法——kNN(k-近邻算法)

    算法概述 通过测量不同特征值之间的距离进行 [分类] 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围: 数值型 和 标称型 . 算法流程 数据 样本数 ...

  6. 机器学习算法K-NN的一个使用实例:预测一个人是否患有糖尿病 (KNN-Predict whether a person will have diabetes or not )

    学习中...不断更新. 在糖尿病人的数据库中有几列是不能为0的 比如葡萄糖 胰岛素 身体指数和皮肤厚度.所以在数据预处理阶段需要对这些列的数据进行替换. remeber we did 12 minus ...

  7. 【机器学习】kNN

    机器学习算法--kNN 目录 机器学习算法--kNN 1. 算法原理 2. 算法实现 2.1 kd-tree构造 2.2 kd-tree查询 2.3 kNN算法实现 3. 算法测试 Ref 1. 算法 ...

  8. JavaScript机器学习之KNN算法

    译者按: 机器学习原来很简单啊,不妨动手试试! 原文: Machine Learning with JavaScript : Part 2 译者: Fundebug 为了保证可读性,本文采用意译而非直 ...

  9. 机器学习:k-NN算法(也叫k近邻算法)

    一.kNN算法基础 # kNN:k-Nearest Neighboors # 多用于解决分裂问题 1)特点: 是机器学习中唯一一个不需要训练过程的算法,可以别认为是没有模型的算法,也可以认为训练数据集 ...

随机推荐

  1. 解决Could not load file or assembly CefSharp.Core.dll的问题

    这个问题的中文提示是: 未能加载文件或程序集“CefSharp.Core.dll”或它的某一个依赖项.找不到指定的模块 具体原因是因为CefSharp运行时需要Visual C++ Redistrib ...

  2. 理解LSTM

    本文基于Understanding-LSTMs进行概括整理,对LSTM进行一个简单的介绍 什么是LSTM LSTM(Long Short Term Memory networks)可以解决传统RNN的 ...

  3. C#异步编程の-------异步编程模型(APM)

    术语解释: APM               异步编程模型, Asynchronous Programming Model EAP                基于事件的异步编程模式, Event ...

  4. Android——Intent和Intent过滤器

    http://www.cnblogs.com/XP-Lee/p/3613830.html Intent就是一个激活组件的消息对象,用于组件之间的通信.需要注意的是,能被Intent激活通信的组件只有三 ...

  5. WebService 的CXF框架 WS独立服务之HelloWorld

    WebService:不同系统不同语言的数据交互, CXF主要分为两种服务方式: 1 )JAX-WS:传输数据, xml格式,基于SOAP协议(规范:规定了xml传递数据的编码规范) ; 2 )JAX ...

  6. leetcode701. Insert into a Binary Search Tree

    https://www.cnblogs.com/grandyang/p/9914546.html 类似于二分查找的方法,用迭代的方法去做 注意:无论是进入左子树还是右子树,左右子树都变成了新的数,所以 ...

  7. springboot+mybatis+springmvc整合实例

    以往的ssm框架整合通常有两种形式,一种是xml形式,一种是注解形式,不管是xml还是注解,基本都会有一大堆xml标签配置,其中有很多重复性的.springboot带给我们的恰恰是“零配置”,&quo ...

  8. SSM框架之整合(Maven实例)

    有不少朋友在maven中因为pom文件依赖的事导致报错 今天我这个快速搭建ssm框架,确保在jdk7或者jdk8的环境,tomcat没什么要求.但如果要用jdk8的话,最好用run as中的serve ...

  9. 深入浅出的webpack4构建工具--webpack4+vue+vuex+mock模拟后台数据(十九)

    mock的官网文档 mock官网 关于mockjs的优点,官网这样描述它:1)可以前后端分离.2)增加单元测试的真实性(通过随机数据,模拟各种场景).3)开发无侵入(不需要修改既有代码,就可以拦截 A ...

  10. 原生js函数的伪重载

    一.我们在学习java的时候,其中方法有一个比较的重要的特性重载,根据传入的参数的个数来执行不同的方法,而方法其根据签名来判断,而JavaScript却不能根据方法的签名来进行重载,只能通过参数的个数 ...