网上介绍K-近邻算法的样例非常多。其Python实现版本号基本都是来自于机器学习的入门书籍《机器学习实战》,尽管K-近邻算法本身非常easy,但非常多刚開始学习的人对其Python版本号的源码理解不够,所以本文将对其源码进行分析。

什么是K-近邻算法?

简单的说,K-近邻算法採用不同特征值之间的距离方法进行分类。所以它是一个分类算法。

长处:无数据输入假定,对异常值不敏感

缺点:复杂度高

好了,直接先上代码,等会在分析:(这份代码来自《机器学习实战》)

def classify0(inx, dataset, lables, k):
dataSetSize = dataset.shape[0]
diffMat = tile(inx, (dataSetSize, 1)) - dataset
sqDiffMat = diffMat**2
sqDistance = sqDiffMat.sum(axis=1)
distances = sqDistance**0.5
sortedDistances = distances.argsort()
classCount={}
for i in range(k):
label = lables[sortedDistances[i]]
classCount[label] = classCount.get(label, 0) + 1
sortedClassCount = sorted(classCount.iteritems(),key=operator.itemgetter(1), reverse=True)
return sortedClassCount[0][0]

该函数的原理是:

存在一个样本数据集合,也称为训练集,在样本集中每一个数据都存在标签。在我们输入没有标签的新数据后,将新数据的每一个特征与样本集中相应的特征进行比較,然后提取最相似(近期邻)的分类标签。

一般我们仅仅选样本数据集中前K 个最相似的数据。最后。出现次数最多的分类就是新数据的分类。

classify0函数的參数意义例如以下:

inx : 是输入没有标签的新数据,表示为一个向量。

dataset: 是样本集。

表示为向量数组。

labels:相应样本集的标签。

k:即所选的前K。

用于产生数据样本的简单函数:

def create_dataset():
group = array([[1.0, 1.1], [1.0, 1.1], [0, 0], [0, 0.1]])
labels = ['A', 'A', 'B', 'B']
return group, labels

注意,array是numpy里面的。

我们须要实现import进来。

from numpy import *
import operator

我们在调用时。

group,labels = create_dataset()
result = classify0([0,0], group, labels, 3)
print result

显然,[0,0]特征向量肯定是属于B 的,上面也将打印B。

知道了这些。刚開始学习的人应该对实际代码还是非常陌生。不急,正文開始了!

源代码分析

dataSetSize = dataset.shape[0]

shape是array的属性,它描写叙述了一个数组的“形状”,也就是它的维度。比方,

In [2]: dataset = array([[1.0, 1.1], [1.0, 1.1], [0, 0], [0, 0.1]])

In [3]: print dataset.shape
(4, 2)

所以,dataset.shape[0] 就是样本集的个数。

diffMat = tile(inx, (dataSetSize, 1)) - dataset

tile(A,rep)函数是基于数组A来构造数组的,详细怎么构造就看第二个參数了。其API介绍有点绕,但简单的使用方法相信几个样例就能明确。

我们看看tile(inx, (4, 1))的结果,

In [5]: tile(x, (4, 1))
Out[5]:
array([[0, 0],
[0, 0],
[0, 0],
[0, 0]])

你看。4扩展的是数组的个数(本来1个。如今4个),1扩展的是每一个数组元素的个数(原来是2个,如今还是两个)。

为证实上面的结论,

In [6]: tile(x,(4,2))
Out[6]:
array([[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0],
[0, 0, 0, 0]])

和。

In [7]: tile(x,(2,2))
Out[7]:
array([[0, 0, 0, 0],
[0, 0, 0, 0]])

关于,tile的详细使用方法。请自行查阅API DOC。

得到tile后,减去dataset。

这类似一个矩阵的减法。结果仍是一个 4 * 2的数组。

In [8]: tile(x, (4, 1)) - dataset
Out[8]:
array([[-1. , -1.1],
[-1. , -1.1],
[ 0. , 0. ],
[ 0. , -0.1]])

结合欧式距离的求法,后面的代码就清晰些,对上面结果平方运算,求和。开方。

我们看看求和的方法,

sqDiffMat.sum(axis=1)

当中。

In [14]: sqDiffmat
Out[14]:
array([[ 1. , 1.21],
[ 1. , 1.21],
[ 0. , 0. ],
[ 0. , 0.01]])

求和的结果是对行求和,是一个N*1的数组。

假设要对列求和,

sqlDiffMat.sum(axis=0)

argsort()是对数组升序排序的。

classCount是一个字典,key是标签。value是该标签出现的次数。

这样。算法的一些详细代码细节就清楚了。

K-近邻算法的Python实现 : 源代码分析的更多相关文章

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

    KNN算法的定义: KNN通过测量不同样本的特征值之间的距离进行分类.它的思路是:如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别.K通 ...

  2. python 机器学习(二)分类算法-k近邻算法

      一.什么是K近邻算法? 定义: 如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别. 来源: KNN算法最早是由Cover和Hart提 ...

  3. 机器学习——KNN算法(k近邻算法)

    一 KNN算法 1. KNN算法简介 KNN(K-Nearest Neighbor)工作原理:存在一个样本数据集合,也称为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一数据与所属分 ...

  4. 机器学习实战 - python3 学习笔记(一) - k近邻算法

    一. 使用k近邻算法改进约会网站的配对效果 k-近邻算法的一般流程: 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供的免费或收费的数据.一般来讲,数据放在txt文本文件中,按照一定的格式进 ...

  5. 数据挖掘算法(一)--K近邻算法 (KNN)

    数据挖掘算法学习笔记汇总 数据挖掘算法(一)–K近邻算法 (KNN) 数据挖掘算法(二)–决策树 数据挖掘算法(三)–logistic回归 算法简介 KNN算法的训练样本是多维特征空间向量,其中每个训 ...

  6. 使用K近邻算法改进约会网站的配对效果

    1 定义数据集导入函数 import numpy as np """ 函数说明:打开并解析文件,对数据进行分类:1 代表不喜欢,2 代表魅力一般,3 代表极具魅力 Par ...

  7. 02机器学习实战之K近邻算法

    第2章 k-近邻算法 KNN 概述 k-近邻(kNN, k-NearestNeighbor)算法是一种基本分类与回归方法,我们这里只讨论分类问题中的 k-近邻算法. 一句话总结:近朱者赤近墨者黑! k ...

  8. 2.在约会网站上使用k近邻算法

    在约会网站上使用k近邻算法 思路步骤: 1. 收集数据:提供文本文件.2. 准备数据:使用Python解析文本文件.3. 分析数据:使用Matplotlib画二维扩散图.4. 训练算法:此步骤不适用于 ...

  9. 机器学习实战笔记--k近邻算法

    #encoding:utf-8 from numpy import * import operator import matplotlib import matplotlib.pyplot as pl ...

  10. 从K近邻算法谈到KD树、SIFT+BBF算法

    转自 http://blog.csdn.net/v_july_v/article/details/8203674 ,感谢july的辛勤劳动 前言 前两日,在微博上说:“到今天为止,我至少亏欠了3篇文章 ...

随机推荐

  1. Sublime Text3 注册码激活码(持续更新中2018-11-20)

    Sublime Text 3的注册码 个人记录,便于查找 谢谢各位的认可 11.20版本 ----- BEGIN LICENSE ----- sgbteam Single User License E ...

  2. ARM嵌入式开发中的GCC内联汇编__asm__

    在针对ARM体系结构的编程中,一般很难直接使用C语言产生操作协处理器的相关代码,因此使用汇编语言来实现就成为了唯一的选择.但如果完全通过汇编代码实现,又会过于复杂.难以调试.因此,C语言内嵌汇编的方式 ...

  3. http://stormzhang.com/opensource/2016/06/26/android-open-source-project-recommend1/

    转载自:http://stormzhang.com/opensource/2016/06/26/android-open-source-project-recommend1/ 推荐他的所有博文~ 图片 ...

  4. 資料視覺化:使用Python與JavaScript 简介和目录

    內容簡介 學習如何運用Python與JavaScript這組對超級強大的組合,處理手中的原始資料,建構出功能強大的互動式視覺化網站.在這一本以實務為主的書中,將告訴您如何善用Python和JavaSc ...

  5. C# 代码注释生成代码提示和帮助文档

    C#文档注释格式: /// <summary> /// function description /// </summary> /// <param name=" ...

  6. MVC5下的switchbutton

    最近想提高代码生成的时候,是否选择显示样式好看些,所以想到了SwitchButton. 但是碰到个问题是,添加页面的这个初始值,需要写成true或者false 包括修改页面做个判断的话,渲染的做法也是 ...

  7. 大数据技术之_16_Scala学习_09_函数式编程-高级

    第十三章 函数式编程-高级13.1 偏函数(partial function)13.1.1 提出一个需求,引出思考13.1.2 解决方式-filter + map 返回新的集合13.1.3 解决方式- ...

  8. nginx+tomcat负载使用

    Nginx+Tomcat搭建 版本 操作系统版本 Centos 6.4 Nginx版本 nginx-1.3.15.tar.gz JDK版本 jdk-7u71-linux-i586   //jdk1.7 ...

  9. Binary Tree Vertical Order Traversal -- LeetCode

    Given a binary tree, return the vertical order traversal of its nodes' values. (ie, from top to bott ...

  10. [BZOJ5288][HNOI2018]游戏(拓扑排序)

    传送门:https://www.luogu.org/problemnew/show/P4436 20分的暴力加一个Random_shuffle就A了.我还能说什么.. 不过这个也不是毫无道理,复杂度应 ...