前言

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

算法原理

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

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

伪代码

对训练集做以下操作:

1. 计算训练集中各点与当前点之间的距离(本文采用最经典的欧式距离)

2. 按照距离递增次序对各点排序

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

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

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

特别说明:该算法中,因为没有训练步骤,因此对它而言训练集也就是数据集。

代码示例

 #!/usr/bin/env python
 # -*- coding:UTF-8 -*-

 '''
 Created on 2016-12-05

 @author: fangmeng
 '''

 # 导入numpy数学运算库
 import numpy
 # 导入运算符函数库
 import operator

 # ==============================================
 # 输入:
 #        空
 # 输出:
 #        group, labels:样本训练集及其对应标签集
 # ==============================================
 def createDataSet():
     '创建训练集及其对应标签集并返回'

     group = numpy.array([[1.0, 1.1], [1.0, 1.0], [0.0, 0.0], [0.0, 0.1]])
     labels = ['A', 'A', 'B', 'B']

     return group, labels

 # ==============================================
 # 输入:
 #        inX:目标向量
 #        dataSet:训练集
 #        labels:训练集对应的标签集
 #        k:算法参数
 # 输出:
 #        sortedClassCount[0][0]:目标向量的分类结果
 # ==============================================
 def classify0 (inX, dataSet, labels, k):
     'kNN 分类器'

     #计算目标向量与训练集中所有对象的距离并排序
     dataSetSize = dataSet.shape[0]
     diffMat = numpy.tile(inX, (dataSetSize, 1)) - dataSet
     sqDiffMat = diffMat ** 2
     sqDistances = sqDiffMat.sum(axis=1)
     distances = sqDistances ** 0.5
     sortedDistIndicies = distances.argsort()  # 返回数组从小到大的索引值

     # 取出与目标向量距离最近的三个
     classCount = {}         # 该字典存放各种标签及其对应的频数
     for i in range(k):      # 由前 k 位索引的结果构建字典
         voteIlable = labels[sortedDistIndicies[i]]
         classCount[voteIlable] = classCount.get(voteIlable, 0)+1

     # 以各个标签的频率为基准进行排序
     sortedClassCount = sorted(classCount.iteritems(), key=operator.itemgetter(1), reverse=True)

     return sortedClassCount[0][0]   # 返回出现频率最高的标签

 def test():
     '分类器测试函数'

     # 新建训练集及其对应标签集
     group, labels = createDataSet()

     # 输入目标向量并返回分类结果后打印
     label = classify0([0.0, 0.0], group, labels, 3)
     print label

 if __name__ == '__main__':
     # 调用测试函数
     test()

运行结果

小结

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

2. 该算法的缺点有三个:

a. 耗费空间资源大:要保存整个数据集

b. 耗费时间资源大:要对数据集中的每个样本求距离。当样本很多,或者特征信息多的时候,效率是挺坑的。

c. 没有给出数据的基础结构信息。(本身K-近邻算法就没有严格意义上的训练过程)

3. 后面的文章中,将讲解如何将此算法应用于具体项目中。

第一篇:K-近邻分类算法原理分析与代码实现的更多相关文章

  1. 第七篇:Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  2. Logistic回归分类算法原理分析与代码实现

    前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...

  3. 第十三篇:K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  4. K近邻分类算法实现 in Python

    K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...

  5. 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响

    代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...

  6. 第十四篇:Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  7. Apriori 关联分析算法原理分析与代码实现

    前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...

  8. K-Means 聚类算法原理分析与代码实现

    前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...

  9. K邻近分类算法

    # -*- coding: utf-8 -*- """ Created on Thu Jun 28 17:16:19 2018 @author: zhen "& ...

随机推荐

  1. php之文件上传类代码

    /* 单个文件上传 功能 上传文件 配置允许的后缀 配置允许的大小 获取文件后缀 判断文件的后缀 报错 */ class UpTool{ protected $allowExt = 'jpg,jpeg ...

  2. ASP.NET MVC轻教程 Step By Step 2 ——View初探

    在上一节我们完成了一个最简化的MVC程序,最重要的是下面这段代码. public class HomeController : Controller { public string Index() { ...

  3. 项目管理模式——Projects

    Github 新的项目管理模式——Projects Github 新的项目管理模式——Projects Issues Github 中传统的项目管理是使用 issue 和 pull request 进 ...

  4. [BZOJ 1072] [SCOI2007] 排列perm 【状压DP】

    题目链接:BZOJ 1072 这道题使用 C++ STL 的 next_permutation() 函数直接暴力就可以AC .(使用 Set 判断是否重复) 代码如下: #include <io ...

  5. C 和 OC 字符串转换 NSString 和 char * 转换 const char* 与 char *

    #import <Foundation/Foundation.h> int main(int argc, const char * argv[]) { char *s = "He ...

  6. VC版本的MakeObjectInstance把WNDPROC映射到类的成员函数

    这段时间用VC封装Windows类库,没有MakeObjectInstance处理窗口消息确实不爽,又不想使用MFC的消息映射,这玩意的效率和美观只能呵呵. 至于MakeObjectInstance是 ...

  7. bzoj2789

    这种题目肯定是先把一个当做标准串根据标准串得出一个初始串是怎么排列的,然后求逆序对数就可以了但是因为有重复,我们不知道标准串中的一个数到底是由原来哪个字母交换来的但是我们可以猜,不难贪心得到对于标准串 ...

  8. COJ 2110 Day7-例3

    Day7-例3 难度级别:C: 运行时间限制:5000ms: 运行空间限制:256000KB: 代码长度限制:2000000B 试题描述 输入 输入的第一行包含整数n和k,其中n(2 ≤ n ≤100 ...

  9. 有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a

    题目:有两个指针pa,pb分别指向有两个数,a,b,请写一个函数交换两个指针的指向,也就是让pa指向b,让pb指向a,具体实现如下: #include<stdlib.h> #include ...

  10. HNOI 2016 省队集训日记

    第一天 DeepDarkFantasy 从东京出发,不久便到一处驿站,写道:日暮里.  ——鲁迅<藤野先生> 定义一个置换的平方为对1~n的序列做两次该置换得到的序列.已知一个置换的平方, ...