Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >k-近邻算法

k-近邻算法

作者头像
卡尔曼和玻尔兹曼谁曼
发布于 2019-01-22 03:17:45
发布于 2019-01-22 03:17:45
74800
代码可运行
举报
运行总次数:0
代码可运行

从今天开始,与大家分享我学习《Machine Learning In Action》这本书的笔记与心得。我会将源码加以详细的注释,这是我自己学习的一个过程,也是想通过这种方式帮助需要学习的童鞋的一种方式。

k-近邻算法定义

k-近邻(k-Nearest Neighbour,kNN)算法采用测量不同特征值之间的距离的方法进行分类。该方法的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。

用官方的话来说,所谓k近邻算法,即是给定一个训练数据集,对新的输入实例,在训练数据集中找到与该实例最邻近的k个实例(也就是上面所说的k个邻居), 这k个实例的多数属于某个类,就把该输入实例分类到这个类中。

k-近邻算法优缺点

这里引用《Machine Learing In Action》原文: Pros: High accuracy, insensitive to outliers, no assumptions about data Cons: Computationally expensive, requires a lot of memory Works with: Numeric values, nominal values

k-近邻算法流程

对未知类别属性的数据集中的每个点依次执行如下操作: (1) 计算已知类别数据集中的点与当前点之间的距离; (2) 按照距离递增次序排序; (3) 选取与当前点距离最小的k个点; (4) 确定前k个点所在类别的出现频率 (5) 返回前k个点出现频率最高的类别作为当前点的预测分类

k-近邻算法实现

下面根据以上的算法流程实现kNN算法

Python预备知识

下面说说程序中用到的一些Numpy中的一些知识 1. tile tile(A, reps) Construct an array by repeating A the number of times given by reps. 即将数组A扩展reps倍。有点抽象我们来看实例:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> a = np.array([0, 1, 2])
>>> np.tile(a, 2)
array([0, 1, 2, 0, 1, 2])
>>> np.tile(a, (2, 2))
array([[0, 1, 2, 0, 1, 2],
       [0, 1, 2, 0, 1, 2]])
>>> np.tile(a, (2, 1, 2))
array([[[0, 1, 2, 0, 1, 2]],
       [[0, 1, 2, 0, 1, 2]]])

>>> b = np.array([[1, 2], [3, 4]])
>>> np.tile(b, 2)
array([[1, 2, 1, 2],
       [3, 4, 3, 4]])
>>> np.tile(b, (2, 1))
array([[1, 2],
       [3, 4],
       [1, 2],
       [3, 4]])

其实就是,你如果把A当成一个数的话,最后形成的数组类型是reps类型的,而且形成数组的元素都是A。 2. sum sum(a, axis=None, dtype=None, out=None, keepdims=False) Sum of array elements over a given axis.

Axis or axes along which a sum is performed. The default (axis = None) is perform a sum over all the dimensions of the input array. axis may be negative, in which case it counts from the last to the first axis.

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> np.sum([0.5, 1.5])
2.0
>>> np.sum([0.5, 0.7, 0.2, 1.5], dtype=np.int32)
1
>>> np.sum([[0, 1], [0, 5]])
6
>>> np.sum([[0, 1], [0, 5]], axis=0)
array([0, 6])
>>> np.sum([[0, 1], [0, 5]], axis=1)
array([1, 5])

对于二维数组,axis=0就是列相加,aixs=1就是行相加 3. sort、sorted以及argsort的区别 sort 只是list类型的内建函数,对其他非列表型序列不适用。原地排序,并不返回排序后的对象。 sorted是所有类型的内建函数 ,返回排序后的对象,原对象不改变。 argsort,属于numpy中的函数 返回排序后元素在原对象中的下标。 例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
>>> x = np.array([3, 6, 0, 1, 5])
>>> x.argsort()
array([2, 3, 0, 4, 1])

实验数据

《Machine Learning In Action》实验数据及源码下载 这里的实验数据是一个文本文件,总共有1000行,每一行的四个项目含义是:1. 每年获得的飞行常客里程数 2.玩视频游戏所消耗的时间百分比 3.每周消费的冰淇淋公升书 4.对这个人的喜欢程度(包括:不喜欢的人、魅力一般的人、极具魅力的人) 数据大致如下:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
40920   8.326976    0.953952    largeDoses
14488   7.153469    1.673904    smallDoses
26052   1.441871    0.805124    didntLike
75136   13.147394   0.428964    didntLike
38344   1.669788    0.134296    didntLike
72993   10.141740   1.032955    didntLike
35948   6.830792    1.213192    largeDoses
42666   13.276369   0.543880    largeDoses
67497   8.631577    0.749278    didntLike
35483   12.273169   1.508053    largeDoses
50242   3.723498    0.831917    didntLike
63275   8.385879    1.669485    didntLike
5569    4.875435    0.728658    smallDoses
......

Python源码

classify0函数是k-近邻算法的源码实现,file2matrix函数用于从文件转给你读取数据,然后交给classify0函数进行处理。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# @param inX 要进行分类的数据(一个一维数组)
# @param dataSet 已知类别的数据集(一个二维数组)
# @param labels 已知类型的数据集的分类标签(一个一维数组)
# @param k k-近邻算法中的参数k
# @return 
def classify0(inX, dataSet, labels, k):
    # ndarray.shape
    # the dimensions of the array.
    # This is a tuple of integers indicating the size of the array in each dimension.
    # For a matrix with n rows and m columns, shape will be (n, m).
    # The length of the shape tuple is therefore the rank, or number of dimensions, ndim.
    dataSetSize = dataSet.shape[0]# 获得dataSet的行数
    # numpy.tile = tile(A, reps)
    # Construct an array by repeating A the number of times given by reps
    diffMat = tile(inX, (dataSetSize, 1)) - dataSet# 将inX扩展成dataSetSize行,然后减去dataSet,即就是扩展以后的二维数组和dataSet相同位置的数字的差组成的新的二维矩阵
    sqDiffmat = diffMat ** 2
    sqDistances = sqDiffmat.sum(axis = 1)# 计算矩阵行的和
    distances = sqDistances ** 0.5 #开方运算,这就是计算出来的距离
    sortedDistIndicies = distances.argsort()# 返回从小到大排序以后的下标位置
    classCount = {}
    for i in range(k):
        voteIlabel = labels[sortedDistIndicies[i]] #依次获得第k小的距离的数据所对应的标签
        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1# get函数中的0是默认值,这里统计每个标签出现的次数
    # Both list.sort() and sorted() accept a reverse parameter with a boolean value. This is using to flag descending sorts
    # 这里sorted的第一个参数是要排序的集合,key是根据什么排序,这个是classCount字典类型的第二个字段即就是按照Label的个数排序
    sortedClassCount = sorted(classCount.iteritems(), key = operator.itemgetter(1), reverse = True)# 按照标签出现的次数从大到小排列
    return sortedClassCount[0][0]# 返回出现次数最多的标签
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
# @param filename 保存数据的文件名称
# @return 返回数据集合和标签集合
def file2matrix(filename):
    fr = open(filename)
    contents = fr.readlines()
    numberOfLines = len(contents)
    returnMat = zeros((numberOfLines, 3))
    classLabelVector = []
    index = 0
    for line in contents:
        # Return a copy of the string with leading and trailing whitespace removed
        line = line.strip()
        listFromLine = line.split('\t')
        returnMat[index, : ] = listFromLine[0:3]
        classLabelVector.append(listFromLine[-1])
        index += 1
    return returnMat, classLabelVector
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015年07月25日,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
使用k-近邻算法改进约会网站的配对效果--学习笔记(python3版本)
本文取自《机器学习实战》第二章,原始为python2实现,现将代码移植到python3,且原始代码非常整洁,所以这本书的代码很值得学习一下。
松鼠先生
2022/02/22
5370
使用k-近邻算法改进约会网站的配对效果--学习笔记(python3版本)
python机器学习实战(一)
这篇notebook是关于机器学习中监督学习的k近邻算法,将介绍2个实例,分别是使用k-近邻算法改进约会网站的效果和手写识别系统. 操作系统:ubuntu14.04    运行环境:anaconda-python2.7-notebook    参考书籍:机器学习实战      notebook  writer ----方阳 
努力努力再努力F
2018/09/11
9230
python机器学习实战(一)
机器学习之K近邻算法
---- 概述 AI不断的火起来了,作为工程化的码农,也得奔向国际化轨道了。至于机器学习是什么,不知道找百科。现在大多数机器学习都是采用监督学习形式。我们学习一下KNN算法。 KNN KNN(K近邻)算法属于监督学习的分类问题,采用不同feature之间的距离方法进行分类。 1.优点:精度高、对异常值不敏感、无数据输入规定,不需要训练算法。 2.缺点:计算复杂度和空间复杂度高。 3.原理:依据训练样本集中的每个数据对应一个标签,每个数据集中每一个数据与分类一一对应关系,输入没有标签的数据后KNN算法将新数据
吕海峰
2018/04/03
5120
机器学习算法——k-近邻(KNN)案例讲解
k近邻法(k-nearest neighbor, k-NN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新的数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
用户9999906
2022/09/26
6920
机器学习实战之KNN算法
本系列教程为《机器学习实战》的读书笔记。首先,讲讲写本系列教程的原因:第一,《机器学习实战》的代码由Python2编写,有些代码在Python3上运行已会报错,本教程基于Python3进行代码的修订;第二:之前看了一些机器学习的书籍,没有进行记录,很快就忘记掉了,通过编写教程也是一种复习的过程;第三,机器学习相对于爬虫和数据分析而言,学习难度更大,希望通过本系列文字教程,让读者在学习机器学习的路上少走弯路。
Python中文社区
2018/07/26
4130
机器学习实战之KNN算法
机器学习(三)——k-近邻算法基础
机器学习(三) ——k-近邻算法基础 (原创内容,转载请注明来源,谢谢) 一、概述 k近邻算法(kNN),是监督学习的一种,主要用于分类,通过测量不同特征值之间的举例进行分类。 优点:精度高、对异常值不敏感、无数据输入假定。 缺点:计算复杂度高、空间复杂度高。 使用数据范围:数值型和标称型。 二、工作原理 1、原理 存在一个训练样本集,其中每个数据都存在标签,即可以知道数据的每个特征和其对于的分类结果。 现输入没有标签的数据,将新数据的每个特征值和样本集的数据对应特征进行比较,计算出距离最近的前k个数据(k
企鹅号小编
2018/01/19
6150
机器学习实战-KNN算法实战-网站约会配对
海伦女士一直在使用约会网站来寻找适合自己的约会对象。尽管约会网站会推荐不同的人选,但是海伦不是喜欢每个人。经过一番的总结,她发现自己喜欢过3个类型的人:
皮大大
2021/02/28
1.5K0
机器学习实战-KNN算法实战-网站约会配对
机器学习-14:MachineLN之kNN源码
其实你坚持的东西都是有意义的,就好比给代码加注释,你真去做了就知道了;另外建议大家建立一个自己的工具箱,就像我建立一个MachineLP_tools,里面放可以复用的代码,然后支持大家开源,你手上现有的代码可能很快就会过时,希望能够在有效期内发挥最大的功效;最后建议自己搭建一个自己的机器学习训练框架,用着顺手、用着舒服、用着放心,比起相信别人,相信大家更相信自己。
MachineLP
2022/05/09
2870
KNN (K 邻近)分类算法
最近看到一个很火的 100-Days-Of-ML-Code 的活动,在 Github 上看了下每日的学习内容,发现是个很好的查漏补缺的列表。这个学习列表里面包含机器学习,深度学习,统计学,线性代数等内容。KNN 是第 7 天的学习内容。
caoqi95
2019/03/27
1.5K0
KNN (K 邻近)分类算法
机器学习实战-4-KNN算法总结
在前两篇文章机器学习实战-2-KNN和机器学习实战-3-基于KNN的约会网站配对实现中结合实际案例详细讲解了KNN算法的知识,主要包含:
皮大大
2021/03/03
6030
机器学习实战-4-KNN算法总结
kNN(k-近邻算法)
**k-近邻算法(kNN),**它的工作原理是:存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分类的对应关系。输人没有标签的新数据后,将新数据的每个特征与样本集中数据对应的特征进行比较,然后算法提取样本集中特征最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前 k个最相似的数据,这就是 k- 近邻算法中k的出处 , 通常k是不大于 20 的整数。 最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
benym
2022/07/14
4740
kNN(k-近邻算法)
MachineLearning ----KNN
今天呢,我们就要来接触稍微高级一点的东西了,我们所做的事情不仅仅局限于代码的层面上了,要基于某种算法解决问题,而此时的python则是我们完成问题的工具啦!
我被狗咬了
2019/09/25
6850
机器学习(一)——K-近邻(KNN)算法
最近在看《机器学习实战》这本书,因为自己本身很想深入的了解机器学习算法,加之想学python,就在朋友的推荐之下选择了这本书进行学习。
oYabea
2020/09/07
1K0
《机器学习实战(Scala实现)》(二)——k-邻近算法
1.计算中的set中每一个点与Xt的距离。 2.按距离增序排。 3.选择距离最小的前k个点。 4.确定前k个点所在的label的出现频率。 5.返回频率最高的label作为测试的结果。
小爷毛毛_卓寿杰
2019/02/13
5400
机器学习算法(一)之KNN算法代码
KNN算法(K近邻算法)不需要任何框架,仅用单纯的python语言就可以编写,这里不要误会,不是说仅能使用Python语言才行。理论上所有的语言都可以开发。相对来数,Python语言的胶水特性很赞,这也是这两年python语言如此火热的原因之一。
千与编程
2023/04/28
2640
机器学习算法(一)之KNN算法代码
Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
本文介绍了k-近邻算法(kNN)的原理、优缺点,并通过实例讲解了k-近邻算法的具体实现和应用场景。
Jack_Cui
2018/01/08
3.2K0
Python3《机器学习实战》学习笔记(一):k-近邻算法(史诗级干货长文)
K-近邻算法(一)
(6)使用算法:首先需要输入样本数据和结构化输出结果,然后运行k-近邻算法判断输入数据分别属于那个分类,最后应用对计算出的分类执行后续的处理。
数据万花筒
2020/12/30
4630
K-近邻算法(一)
使用k-近邻算法改进约会网站的配对效果
(1) 收集数据: 提供文本文件。 (2) 准备数据: 使用python解析文本文件。 (3) 分析数据: 使用 Matplotlib画二维扩散图 。 (4) 训练算法: 此步驟不适用于k-近邻算法。 (5) 测试算法: 使用海伦提供的部分数据作为测试样本。 测试样本和非测试样本的区别在于:测试样本是已经完成分类的数据,如果预测分类与实际类别不同,则标记为一个错误。 (6) 使用算法: 产生简单的命令行程序,然后可以输入一些特征数据以判断对方是否为自己喜欢的类型。
benym
2022/07/14
4270
使用k-近邻算法改进约会网站的配对效果
机器学习 学习笔记(14)k近邻学习
k近邻是一种常用的监督学习方法,其工作机制非常简单:给定测试样本,基于某种距离度量找出训练集中与其最靠近的k个训练样本,然后基于这k个邻居的信息来进行预测。通常在分类任务中可以使用投票法,即选择这k个样本中出现最多的类别标记作为预测结果,在回归任务中可以使用平均法,即将这个k个样本的实值输出标记的平均值作为预测结构,还可以基于距离远近进行加权平均或加权投票,距离越近的样本权重越大。
2018/09/04
3570
机器学习 学习笔记(14)k近邻学习
python机器学习实战(一)
原文链接:www.cnblogs.com/fydeblog/p/7140974.html
圆方圆PYTHON学院
2018/12/25
8940
python机器学习实战(一)
相关推荐
使用k-近邻算法改进约会网站的配对效果--学习笔记(python3版本)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验