我的编程空间,编程开发者的网络收藏夹
学习永远不晚

怎样理解和实现KNN算法

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

怎样理解和实现KNN算法

今天就跟大家聊聊有关怎样理解和实现KNN算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。

knn介绍

邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻居来代表。平常生活中我们都会下意识的运用到我们的判断中,比如富人区和穷人区,判断一个人是富人还是穷人根据他的朋友的判断,就是运用了kNN的思想。

KNN是通过测量不同特征值之间的距离进行分类。它的的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。K通常是不大于20的整数。KNN算法中,所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。
在KNN中,通过计算对象间距离来作为各个对象之间的非相似性指标,避免了对象之间的匹配问题,在这里距离一般使用欧氏距离

 

KNN算法实现

 

主要参考刘建平Pinard的博文K近邻法(KNN)原理小结,刘建平Pinard的博文对每个算法有很深刻的见解,一般在看不懂李航的《统计学习方法》的时候,去看刘大大的博客会有豁然开朗的感觉。他博文中提到scikit-learn里只使用了蛮力实现(brute-force),KD树实现(KDTree)和球树(BallTree)实现,所以他的这篇文章中只讨论这几种算法的实现原理。其余的实现方法比如BBF树,MVP树等没有做讨论,需要对算法有更深一步了解的童鞋,移步刘建平Pinard的文章~

 

实战代码

 

这一部分主要是参考实战,然后主要讲解一些具体的实现~
下面的代码为运行程序导入所需要的库

from numpy import *
import operator

下面的程序主要实现了生成测试数据的功能

def createDataSet():
    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])
    labels = ['A','A','B','B']
    return group,labels
group,labels = createDataSet()

输出:

In [2]:group
Out[2]: array([[ 1. ,  1.1],
       [ 1. ,  1. ],
       [ 0. ,  0. ],
       [ 0. ,  0.1]])

In [3]: labels
Out[3]: ['A', 'A', 'B', 'B']

下面的代码主要实现了利用knn分类的功能

def classify0(inX,dataSet,labels,k):
    dataSetSize = dataSet.shape[0]
    #tile 扩展矩阵的函数
    diffMat = tile(inX,(dataSetSize,1))-dataSet
    sqdiffMat = diffMat**2
    sqDistances = sqdiffMat.sum(axis = 1)
    distances = sqDistances**0.5
    sortedDistIndicies = distances.argsort()
    print(sortedDistIndicies)
    classCount={}
    for i in range(k):
        voteLabels = labels[sortedDistIndicies[i]]
        #dict.get  获取指定键的值,默认返回none,键值不存在时,不同于dict['key']直接返回error,也可以指定,下面指定为0
        classCount[voteLabels] = classCount.get(voteLabels,0)+1
    print(classCount)
    #Python3.5中:iteritems变为items(python2  classCount.iteritems())
    #items可以输出dict中的(key,value)
    #sorted中的key参数传入函数,operator.itemgetterr函数获取的不是值,而是定义了一个函数,通过该函数作用到对象上才能获取值。
    #operator.itemgetter(1) 为获取classCount.items()中的第二个参数
    sortedClassCount = sorted(classCount.items(),key = operator.itemgetter(1),reverse = True)
    print(sortedClassCount)
    return sortedClassCount[0][0]

  • 给定输出,给出分类值

In [7]: classify0([0,0.2],group,labels,2)
[3 2 1 0]
{'B': 2}
[('B', 2)]
Out[6]: 'B'

 

深度解读实战代码

argsort函数

argsort()函数是将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y。
输出是按照从小到大的顺序输出的
例子:

import numpy as np
a = np.array([2,0,4,1,2,4,5])
a.argsort()

输出为a从小到大排序后的index:

Out[12]: array([1, 3, 0, 4, 2, 5, 6], dtype=int64)

输出为list的index,提取出来就是list从小到大的排序

 

 

排序解释

 


dict.get vs dict[‘key’]

a = {'name': 'wang'}

dict[‘key’]输出

a['age']
Out[16]: KeyError: 'age'

dict.get输出:

a.get('age')
a.get('age', 10)
Out[17]: 10

dict[‘key’]只能获取存在的值,如果不存在则触发KeyError
而dict.get(key, default=None)则如果不存在则返回一个默认值,如果设置了则是设置的,否则就是None


Python中sort 和 sorted函数

  • 用sort函数对列表排序时会影响列表本身,而sorted不会

a = [1,2,1,4,3,5]
a.sort()
aOut[18]: [1, 1, 2, 3, 4, 5]

sort函数改变了a的顺序

a = [1,2,1,4,3,5]
sorted(a)
aOut[19]: [1, 2, 1, 4, 3, 5]

sorted未改变a的顺序


sorted函数

  • sorted(iterable,cmp,key,reverse)(pyhton2的用法)

  • python3sorted取消了对cmp的支持。

list1 = [('david', 90), ('mary',90), ('sara',80),('lily',95)]
sorted(list1,cmp = lambda x,y: cmp(x[0],y[0]))
TypeError: 'cmp' is an invalid keyword argument for this function

  • 用key函数排序

sorted(list1,key = lambda list1: list1[0])
Out[23]: [('david', 90), ('lily', 95), ('mary', 90), ('sara', 80)]

list1[0]表示用list中的第一个元素排序

sorted(list1,key = lambda list1: list1[1])
Out[24]: [('sara', 80), ('david', 90), ('mary', 90), ('lily', 95)]

list1[1]表示用list中的第二个元素排序


三道sorted面试题

1)key函数的运用

students = [('john', 'A', 15), ('jane', 'B', 12), ('dave','B', 10)]
sorted(students,key=lambda s: s[2]) #按照年龄来排序


2)多个字符的排序

‘asdf234GDSdsf23’这是一个字符串排序,排序规则:小写<大写<奇数<偶数

s = 'asdf234GDSdsf23'  #排序:小写-大写-奇数-偶数
#解法1:
print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isdigit() and int(x) % 2 == 0,x.isupper(),x))))
Out[25]: addffssDGS33224
#解法2:
print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isupper(),x.isdigit() and int(x) % 2 == 0,x))))
Out[26]: addffssDGS33224

解释:

  • Boolean 的排序会将 False 排在前,True排在后 . 

  • 1.x.isdigit()的作用是把数字放在后边,字母放在前边.

  • 2.x.isdigit()and int(x) % 2 == 0的作用是保证奇数在前,偶数在后。

  • 3.x.isupper()的作用是在前面基础上,保证字母小写在前大写在后.

  • 4.最后的x表示在前面基础上,对所有类别数字或字母排序。

  • 若不进行第四步,每个内部是未排序的,但是整体顺序是按照要求排序的

print("".join(sorted(s, key=lambda x: (x.isdigit(),x.isupper(),x.isdigit() and int(x) % 2 == 0))))
Out[27]: asdfdsfGDS33242


3) 特殊需求的排序

list1=[7, -8, 5, 4, 0, -2, -5]

要求1.正数在前负数在后 2.整数从小到大 3.负数从大到小

#解法1:
sorted(list1,key = lambda x:(x<0,x<0 and -x,x))
Out[28]:  [0, 4, 5, 7, -2, -5, -8]
解法2:
sorted(list1,key=lambda x:(x<0,abs(x)))
Out[29]: [0, 4, 5, 7, -2, -5, -8]

看完上述内容,你们对怎样理解和实现KNN算法有进一步的了解吗?如果还想了解更多知识或者相关内容,请关注编程网行业资讯频道,感谢大家的支持。

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

怎样理解和实现KNN算法

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

怎样理解和实现KNN算法

今天就跟大家聊聊有关怎样理解和实现KNN算法,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。knn介绍邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数
2023-06-04

怎么用python代码实现knn算法

下面是一个简单的示例代码,实现了knn算法:```pythonimport numpy as npfrom collections import Counterdef knn(train_X, train_y, test_X, k):
2023-10-11

Java OpenCV中怎么用KNN算法实现图像背景移除

这篇文章主要讲解了“Java OpenCV中怎么用KNN算法实现图像背景移除”,文中的讲解内容简单清晰,易于学习与理解,下面请大家跟着小编的思路慢慢深入,一起来研究和学习“Java OpenCV中怎么用KNN算法实现图像背景移除”吧!实现步
2023-06-29

怎样深入理解vue中的虚拟DOM和Diff算法

怎样深入理解vue中的虚拟DOM和Diff算法,针对这个问题,这篇文章详细介绍了相对应的分析和解答,希望可以帮助更多想解决这个问题的小伙伴找到更简单易行的方法。真实DOM的渲染在讲虚拟DOM之前,先说一下真实DOM的渲染。浏览器真实DOM渲
2023-06-22

t-SNE算法的原理和Python代码实现详解

T分布随机邻域嵌入(t-SNE),是一种用于可视化的无监督机器学习算法,使用非线性降维技术,根据数据点与特征的相似性,试图最小化高维和低维空间中这些条件概率(或相似性)之间的差异,以在低维空间中完美表示数据点。因此,t-SNE擅长在二维或三
t-SNE算法的原理和Python代码实现详解
2024-01-23

排序算法及其C实现是怎样的

这期内容当中小编将会给大家带来有关排序算法及其C实现是怎样的,文章内容丰富且以专业的角度为大家分析和叙述,阅读完这篇文章希望大家可以有所收获。排序算法(Sorting Algorithm)是计算机算法的一个组成部分。排序的目标是将一组数据
2023-06-04

详解MD5算法的原理以及C#和JS的实现

MD5 是哈希算法(散列算法)的一种应用。这篇文章主要和大家介绍一下MD5算法的原理以及C#和JS的实现,文中的示例代码讲解详细,需要的可以参考一下
2023-03-19

怎样理解Java的泛型及实现

本篇文章为大家展示了怎样理解Java的泛型及实现,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。泛型基础泛型是对Java语言类型系统的一种扩展,有点类似于C++的模板,可以把类型参数看作是使用参数化类
2023-06-17

python中怎么实现一个抽样回归算法

本篇文章为大家展示了python中怎么实现一个抽样回归算法,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。12 抽查回归算法12.1 算法概要讨论以下算法 线性算法线性回归RIdge 岭回归LASSO
2023-06-19

Java贪心算法之Prime算法原理与实现方法详解

本文实例讲述了Java贪心算法之Prime算法原理与实现方法。分享给大家供大家参考,具体如下:Prime算法:是一种穷举查找算法来从一个连通图中构造一棵最小生成树。利用始终找到与当前树中节点权重最小的边,找到节点,加到最小生成树的节点集合中
2023-05-31

详解DES&3DES算法的原理以及C#和JS的实现

DES 全称为 Data Encryption Standard,即数据加密标准,是一种使用密钥加密的块算法。3DES 算法通过对 DES 算法进行改进,增加 DES 的密钥长度来避免类似的攻击。本文就来聊聊它们的原理与实现吧
2023-03-19

深入string理解Golang是怎样实现的

这篇文章主要为大家介绍了深入string理解Golang是怎样实现的原理详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
2023-05-17

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录