机器学习之k-最近邻(kNN)算法
一、kNN(k-nearest neighbor)算法原理
事物都遵循物以类聚的思想,即有相同特性的事物在特征空间分布上会靠得更近,所以kNN的思路是:一个样本在特征空间中k个靠的最近的样本中,大多数属于某个类别,这个样本就属于某个类别。
如图所示,蓝色方框和橙色三角分别代表不同的类别,此时来了一个未知类别的样本绿色圆,如何判断绿圆的类别,步骤如下:

- 计算绿圆和特征空间中的每一个点的距离。
- 设定k的值。
- 选取与当前绿圆距离最近的k个点。
- 统计前k个点所在的类别出现的频率。
- 返回出现频率最高的类别作为绿圆的预测类别。
如果k=3,则距离绿圆最近的三个点是黑色实线圆圈里的点,而橙色三角个数最多,故判断绿圆的类别是橙色三角。
如果k=5,则距离绿圆最近的5个点是黑色虚线圆圈里的点,此时蓝色方框个数最多,故判断绿圆的类别是蓝色方框。
样本点之间距离的一般使用欧氏距离来计算:

二、kNN算法python实现
- 计算各向量点之间的距离
- 选择距离最小的k个点
- 统计k个点中的类别,并从大到小排序
- 返回出现频率最高的类别
目前坐标中有两个黄点类和两个紫点类,需要判断蓝点属于哪个类别?

from numpy import *
import operator # knn algorithm
def classify0(inX, dataSet, labels, k):
dataSetSize = dataSet.shape[0] # 将inX重复dataSetSize行,便于做向量计算
diffMat = tile(inX, (dataSetSize, 1)) - dataSet
sqDiffMat = diffMat ** 2
sqDistinces = sqDiffMat.sum(axis=1)
distinces = sqDistinces ** 0.5
# 以上求向量点之间的欧氏距离 # 从小到大返回距离的索引值
sortedDistIndicies = distinces.argsort()
# 创建一个字典,用来存放类别和出现的频次
classCount = {}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1
# classCount.iteritems()={'A': 1, 'B': 2}
# 用classCount中iteritems的第二项作为比较的数值(类别的统计频次),然后对iteritems逆序排序
sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0] def createDataSet():
group = array([[10, 11], [9, 8], [2, 3], [3, 1]])
labels = ['A', 'A', 'B', 'B']
return group, labels if __name__ == '__main__':
group, labels = createDataSet()
classLabel = classify0([3.5, 2], group, labels, 3)
print "the classifier came back with: %c" % classLabel
返回的结果是:
the classifier came back with: B
参考资料:《机器学习实战》
机器学习之k-最近邻(kNN)算法的更多相关文章
- kNN算法:K最近邻(kNN,k-NearestNeighbor)分类算法
一.KNN算法概述 邻近算法,或者说K最近邻(kNN,k-NearestNeighbor)分类算法是数据挖掘分类技术中最简单的方法之一.所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它 ...
- 机器学习经典算法具体解释及Python实现--K近邻(KNN)算法
(一)KNN依旧是一种监督学习算法 KNN(K Nearest Neighbors,K近邻 )算法是机器学习全部算法中理论最简单.最好理解的.KNN是一种基于实例的学习,通过计算新数据与训练数据特征值 ...
- K最近邻(KNN,k-Nearest Neighbor)准确理解
K最近邻(KNN,k-Nearest Neighbor)准确理解 用了之后,发现我用的都是1NN,所以查阅了一下相关文献,才对KNN理解正确了,真是丢人了. 下图中,绿色圆要被决定赋予哪个类,是红色三 ...
- 机器学习-K近邻(KNN)算法详解
一.KNN算法描述 KNN(K Near Neighbor):找到k个最近的邻居,即每个样本都可以用它最接近的这k个邻居中所占数量最多的类别来代表.KNN算法属于有监督学习方式的分类算法,所谓K近 ...
- day-9 sklearn库和python自带库实现最近邻KNN算法
K最近邻(k-Nearest Neighbor,KNN)分类算法,是一个理论上比较成熟的方法,也是最简单的机器学习算法之一.该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的 ...
- 理解KNN算法中的k值-knn算法中的k到底指的是什么 ?
2019-11-09 20:11:26为方便自己收藏学习,转载博文from:https://blog.csdn.net/llhwx/article/details/102652798 knn算法是指对 ...
- python机器学习(2:KNN算法)
1.KNN 简介:knn算法是监督学习中分类方法的一种.它又被叫k近邻算法,是一个概念极其简单而分类效果又很优秀的分类算法. 核心思想:在训练集中选出离输入的数据最近的k个数据,根据这k个数据的类别判 ...
- 机器学习实战---K均值聚类算法
一:一般K均值聚类算法实现 (一)导入数据 import numpy as np import matplotlib.pyplot as plt def loadDataSet(filename): ...
- 机器学习第一篇——最近邻kNN
机器学习监督学习中,根据解决问题的连续性和离散型,分为分类问题和回归问题.最邻近算法kNN是一种最为直接和简便的分类方法. kNN本质上,是计算目标到模型的欧式距离,从而判定目标所属的类别. 首先,在 ...
- SVM(支持向量机)与统计机器学习 & 也说一下KNN算法
因为SVM和统计机器学习内容很多,所以从 http://www.cnblogs.com/charlesblc/p/6188562.html 这篇文章里面分出来,单独写. 为什么说SVM和统计学关系很大 ...
随机推荐
- Java并发编程--2.synchronized
前言 synchronized关键字是互斥锁,也称为内部锁 每个对象都有自己的monitor(锁标记),它是为了分配给线程,最多一个线程可以拥有对象的锁 使用 synchronized修饰成员方法,锁 ...
- C 六学家的困惑 【YY】 (2019年华南理工大学程序设计竞赛(春季赛))
冲鸭,去刷题:https://ac.nowcoder.com/acm/contest/625/C 小六喜欢两全其美的事情,今天就正好有一个这样的机会. 小六面前有两根管子,管子里面放满了数字为1到9的 ...
- 分别编写两个类Point2D,Point3D来表示二维空间和三维空间的点,使之满足下列要求:
(1) Point2D有两个整型成员变量x, y (分别为二维空间的X,Y方向坐标),Point2D的构造方法要实现对其成员变量x, y的初始化. (2)Point2D有一个void型成员方法offs ...
- Kafka设计解析(二)Kafka High Availability (上)
转载自 技术世界,原文链接 Kafka设计解析(二)- Kafka High Availability (上) Kafka从0.8版本开始提供High Availability机制,从而提高了系统可用 ...
- YUV420图像旋转90算法的优化
在做android摄像头捕获时,发现从android摄像头出来的原始视是逆时针旋转了90度的,所以须要把它顺时针旋转90.android视频支持的是NV21格式,它是一种YUV420的格式.当然,始果 ...
- apue2e unp安装
最近在读 Richard Stevens 的大作<UNIX环境高级编程>,相信很多初读此书的人都会与我一样遇到这个问题,编译书中的程序实例时会出现问题,提示 “错误:apue.h:没有那个 ...
- C#引用比较和内容比较
1.静态方法Object.ReferenceEqual,实际实现为引用比较. 2.静态方法Object.Equal, 实际实现为引用比较.(实际调用了实例方法Equal) 3.Object实例 ...
- 在Qtlabel中显示数字十六进制和十进制都可以
ui->label_6->setText(QString::number(table_test[0]<<8 | table_test[1]));这样子就可以把十六进制的数转换为 ...
- iOS swift项目IM实现,从长连接到数据流解析分析之Socket
iOS swift项目IM实现,从长连接到底层数据解析分析之Socket 一:项目简介: 去年开始接手了一个国企移动项目,项目的需求是实现IM即时通讯功能. * 一期版本功能包括了: ...
- stat命令的实现-mysate 20155239吕宇轩
stat命令的实现-mysate 20155239吕宇轩 学习使用stat(1),并用C语言实现 提交学习stat(1)的截图 man -k ,grep -r的使用 伪代码 产品代码 mystate. ...