第一篇:K-近邻分类算法原理分析与代码实现
前言
本文介绍机器学习分类算法中的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-近邻分类算法原理分析与代码实现的更多相关文章
- 第七篇:Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
- Logistic回归分类算法原理分析与代码实现
前言 本文将介绍机器学习分类算法中的Logistic回归分类算法并给出伪代码,Python代码实现. (说明:从本文开始,将接触到最优化算法相关的学习.旨在将这些最优化的算法用于训练出一个非线性的函数 ...
- 第十三篇:K-Means 聚类算法原理分析与代码实现
前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...
- K近邻分类算法实现 in Python
K近邻(KNN):分类算法 * KNN是non-parametric分类器(不做分布形式的假设,直接从数据估计概率密度),是memory-based learning. * KNN不适用于高维数据(c ...
- 查看neighbors大小对K近邻分类算法预测准确度和泛化能力的影响
代码: # -*- coding: utf-8 -*- """ Created on Thu Jul 12 09:36:49 2018 @author: zhen &qu ...
- 第十四篇:Apriori 关联分析算法原理分析与代码实现
前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...
- Apriori 关联分析算法原理分析与代码实现
前言 想必大家都听过数据挖掘领域那个经典的故事 - "啤酒与尿布" 的故事. 那么,具体是怎么从海量销售信息中挖掘出啤酒和尿布之间的关系呢? 这就是关联分析所要完成的任务了. 本文 ...
- K-Means 聚类算法原理分析与代码实现
前言 在前面的文章中,涉及到的机器学习算法均为监督学习算法. 所谓监督学习,就是有训练过程的学习.再确切点,就是有 "分类标签集" 的学习. 现在开始,将进入到非监督学习领域.从经 ...
- K邻近分类算法
# -*- coding: utf-8 -*- """ Created on Thu Jun 28 17:16:19 2018 @author: zhen "& ...
随机推荐
- MySQL5.7.9免安装版配置方法
1. 解压MySQL压缩包 将下载的MySQL压缩包解压到自定义目录下,我的解压目录是: "D:\Program Files\mysql-5.7.9-win32" ...
- 舵机的PWM控制学习随笔
舵机的控制信号,对于脉宽调制信号的脉宽变换,常用的一种方法是采用调制信号获取有源滤波后的直流电压,但是需要50Hz(周期是20ms)的信号,这对运放器件的选择有较高要求,从电路体积和功耗考虑也不易采用 ...
- 黑马程序员——利用swap函数研究C的指针
------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 设计3个函数,分别实现已下功能: 交换两个整数 交换两个整形指针 交换任意两个同类型的变量 #i ...
- iOS证书详解--再转
一.成员介绍1. Certification(证书)证书是对电脑开发资格的认证,每个开发者帐号有一套,分为两种:1) Developer Certification(开发证书)安装在电脑上 ...
- Java线程生命模型
一. 线程状态类型1. 新建状态(New):新创建了一个线程对象.2. 就绪状态(Runnable):线程对象创建后,其他线程调用了该对象的start()方法.该状态的线程位于可运行线程池中,变得可运 ...
- 【转】常见 jar包详解
转载自:http://www.cnblogs.com/xusir/archive/2013/05/19/3086878.html jar包 用途 axis.jar SOAP引擎包 commons- ...
- 深入浅出 Java Concurrency (1) : J.U.C的整体认识
转 http://www.blogjava.net/xylz/archive/2010/06/30/324915.html 去年年底有一个Guice的研究计划,可惜由于工作“繁忙”加上实际工作中没有用 ...
- bzoj1005
有了bzoj1430的经验解决这题就不是什么难事了首先考虑度数确定的点,令tot=sigma(d[i]-1)首先给这tot个数分配prufer编码的位置有C(tot,n-2)种方案每个方案中是可以进行 ...
- 数据结构(左偏树):HDU 1512 Monkey King
Monkey King Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 65536/32768 K (Java/Others)Tota ...
- 高级数据结构(树状数组套主席树):ZOJ 2112 Dynamic Rankings
Dynamic Rankings Time Limit: 10 Seconds Memory Limit: 32768 KB The Company Dynamic Rankings has ...