K-近邻算法原理分析

前言

  本文介绍机器学习分类算法中的K-近邻算法并给出伪代码,Python代码实现。

算法原理

  首先获取训练集中与目标对象距离最近的k个对象,然后再获取这k个对象的分类标签,求出其中出现频数最大的标签。

  这个标签就是分类的结果。

伪代码

  对训练集中的每个点做以下操作:

    1. 计算已知类别数据集中的点与当前点之间的距离

    2. 按照距离递增次序排序

    3. 选取与当前点距离最小的k个点

    4. 确定前k个点所在类别的出现频率

    5. 返回前k个点出现频率最高的类别,即为分类结果。

代码示例

 1 #!/usr/bin/env python
 2 # -*- coding:UTF-8 -*-
 3
 4 ‘‘‘
 5 Created on 2014-12-17
 6
 7 @author: fangmeng
 8 ‘‘‘
 9
10 # 导入numpy数学运算库
11 import numpy
12 # 导入运算符函数库
13 import operator
14
15 # ==============================================
16 # 输入:
17 #        空
18 # 输出:
19 #        group, labels:样本训练集及其对应标签集
20 # ==============================================
21 def createDataSet():
22     ‘创建训练集及其对应标签集并返回‘
23
24     group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
25     labels = [‘A‘, ‘A‘, ‘B‘, ‘B‘]
26
27     return group, labels
28
29 # ==============================================
30 # 输入:
31 #        inX:目标向量
32 #        dataSet:训练集
33 #        labels:训练集对应的标签集
34 #        k:算法参数
35 # 输出:
36 #        sortedClassCount[0][0]:目标向量的分类结果
37 # ==============================================
38 def classify0 (inX, dataSet, labels, k):
39     ‘kNN 分类器‘
40
41     #计算目标向量与训练集中所有对象的距离并排序
42     dataSetSize = dataSet.shape[0]
43     diffMat = numpy.tile(inX, (dataSetSize, 1)) - dataSet
44     sqDiffMat = diffMat ** 2
45     sqDistances = sqDiffMat.sum(axis=1)
46     distances = sqDistances ** 0.5
47     sortedDistIndicies = distances.argsort()  # 返回数组从小到大的索引值
48
49     # 取出与目标向量距离最近的三个
50     classCount = {}         # 该字典存放各种标签及其对应的频数
51     for i in range(k):      # 由前 k 位索引的结果构建字典
52         voteIlable = labels[sortedDistIndicies[i]]
53         classCount[voteIlable] = classCount.get(voteIlable, 0)+1
54
55     # 以各个标签的频率为基准进行排序
56     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)
57
58     return sortedClassCount[0][0]   # 返回出现频率最高的标签
59
60 def test():
61     ‘分类器测试函数‘
62
63     # 新建训练集及其对应标签集
64     group, labels = createDataSet()
65
66     # 输入目标向量并返回分类结果后打印
67     label = classify0([0.0, 0.0], group, labels, 3)
68     print label
69
70 if __name__ == ‘__main__‘:
71     # 调用测试函数
72     test()
73
74     

运行结果

  

小结

  本文简要介绍了机器学习中经典的K-近邻算法,并给出了代码实现。

  后面的文章中,将继续讲解如何将此算法应用于具体的实际生活中。

时间: 2024-11-02 17:23:39

K-近邻算法原理分析的相关文章

机器学习实战笔记-K近邻算法1(分类动作片与爱情片)

K近邻算法采用测量不同特征值之间的距离方法进行分类 K近邻算法特点: 优点:精度高.对异常值不敏感.无数据输入假定. 缺点:计算复杂度高.空间复杂度高. 适用数据范围:数值型和标称型. K近邻算法原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系.输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的 特征进行比较,然后算法提取样本集中特征最相似数据(最近 邻)的分类标签.一般来说,我们只选择样本数据集中前k个最

《统计学习方法》:第三章 K 近邻算法

k -- NN k--NN 是一种基本分类和回归方法.对新实例进行分类时,通过已经训练的数据求出 k 个最近实例,通过多数表决进行分类.故 k 邻近算法具有不显式的学习过程. 三个基本要素:k 值选择,距离度量,分类决策规则. 1. k 近邻算法 原理:给定一个训练集,对于新输入的实例,在训练集中找到与其相似的 k 个实例,这 k 个实例的多数属于某一类,就将该实例归属到这一类. 输入:训练数据集 \(T = \{(x_1,y_1),(x_2,y_2),...,(x_3,y_3)\}\) 其中,

从K近邻算法、距离度量谈到KD树、SIFT+BBF算法

从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 从K近邻算法.距离度量谈到KD树.SIFT+BBF算法 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章待写:1.KD树:2.神经网络:3.编程艺术第28章.你看到,blog内的文章与你于别处所见的任何都不同.于是,等啊等,等一台电脑,只好等待..”.得益于田,借了我一台电脑(借他电脑的时候,我连表示感谢,他说“能找到工作全靠你的博客,这点儿小忙还说,不地道”,有的时候,稍许感受到受人信任也是一种压力,愿我不辜负大家对我的信任)

『cs231n』作业1问题1选讲_通过代码理解K近邻算法&交叉验证选择超参数参数

通过K近邻算法探究numpy向量运算提速 茴香豆的"茴"字有... ... 使用三种计算图片距离的方式实现K近邻算法: 1.最为基础的双循环 2.利用numpy的broadca机制实现单循环 3.利用broadcast和矩阵的数学性质实现无循环 图片被拉伸为一维数组 X_train:(train_num, 一维数组) X:(test_num, 一维数组) 方法验证 import numpy as np a = np.array([[1,1,1],[2,2,2],[3,3,3]]) b

使用K近邻算法实现手写体识别系统

目录 1. 应用介绍 1.1实验环境介绍 1.2应用背景介绍 2. 数据来源及预处理 2.1数据来源及格式 2.2数据预处理 3. 算法设计与实现 3.1手写体识别系统算法实现过程 3.2 K近邻算法实现 3.3手写体识别系统实现 3.4算法改进与优化 4. 系统运行过程与结果展示 1.应用介绍 1.1实验环境介绍 本次实验主要使用Python语言开发完成,Python的版本为2.7,并且使用numpy函数库做一些数值计算和处理. 1.2应用背景介绍 本次实验实现的是简易的手写体识别系统,即根据

KNN K~近邻算法笔记

K~近邻算法是最简单的机器学习算法.工作原理就是:将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据的分类标签.一般来说,只提取样本数据集中前K个最相似的数据.通常K不大于20,最后选择K个最相似数据中出现次数最多的分类,最为新的数据分类. 但是K~近邻算法必须保存全部的数据集,如果训练数据集很大,必须使用打量的存储空间.此外,由于必须对数据集中每个数据集计算距离值,实际使用起来会非常耗时间.

机器学习实战笔记-K近邻算法2(改进约会网站的配对效果)

案例二.:使用K-近邻算法改进约会网站的配对效果 案例分析: 海伦收集的数据集有三类特征,分别是每年获得的飞行常客里程数.玩视频游戏所耗时间百分比. 每周消费的冰淇淋公升数.我们需要将新数据的每个新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签.一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数.最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类. 流程:在约会网站上使用K

用Python从零开始实现K近邻算法

K近邻算法 (或简称kNN)是易于理解和实现的算法,而且是你解决问题的强大工具. http://python.jobbole.com/87407/ 在本教程中,你将基于Python(2.7)从零开始实现kNN算法.该实现主要针对分类问题,将会用鸢尾花分类问题来演示. 这篇教程主要针对Python程序员,或者你可以快速上手Python,并且对如何从零实现kNN算法感兴趣. kNN算法图片,来自Wikipedia,保留所有权利 什么是kNN kNN算法的模型就是整个训练数据集.当需要对一个未知数据实

R语言学习笔记—K近邻算法

K近邻算法(KNN)是指一个样本如果在特征空间中的K个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性.即每个样本都可以用它最接近的k个邻居来代表.KNN算法适合分类,也适合回归.KNN算法广泛应用在推荐系统.语义搜索.异常检测. KNN算法分类原理图: 图中绿色的圆点是归属在红色三角还是蓝色方块一类?如果K=5(离绿色圆点最近的5个邻居,虚线圈内),则有3个蓝色方块是绿色圆点的"最近邻居",比例为3/5,因此绿色圆点应当划归到蓝色方块一类:如果

k近邻算法的Python实现

k近邻算法的Python实现 0. 写在前面 这篇小教程适合对Python与NumPy有一定了解的朋友阅读,如果在阅读本文的源代码时感到吃力,请及时参照相关的教程或者文档. 1. 算法原理 k近邻算法(k Nearest Neighbor)可以简称为kNN.kNN是一个简单直观的算法,也是机器学习从业者入门首选的算法.先看一个简单的应用场景. 小例子 设有下表,命名为为表1 电影名称 打斗镜头数量 接吻镜头数量 电影类型 foo1 3 104 爱情片 foo2 2 100 爱情片 foo3 1