《机器学习实战》学习笔记-KNN(一)
博主最近在学习[美]Peter Harrington所著的《机器学习实战》一书,写此系列博客来记录博主的学习过程,同时对书中知识以及代码加以自己的理解和标注,因为博主是小白,文中不免有错误,望读者不吝惜笔墨,加以指正。
书中代码是基于python2.x,博主所用为python3.x版本,因此会对书中的代码加以修改。
书中代码和相关资源可以在以下网址上下载:www.manning.com/MachineLearninginAction
一、准备工作
首先我们需要安装Python3.x,并且安装python的一些包,也就是库函数,包括Numpy、Scipy、Matplotlib、Pylab等等。博主是通过pip安装的这些包,很方便也很快捷,具体方法CSDN上有很多大神有写过博客,简单易懂,请读者自行查找。
二、KNN算法概述
原文中有这么一句话:简单地说,KNN(k-近邻算法)采用不同特征值之间的距离方法来进行分类。
这个概念很容易理解。KNN是监督学习,所以假设我们的训练集有n个点,那么每一个点都对应着一个标签。当我们输入一个未知的点,我们的系统计算这个点与训练集中各个点的距离并进行从小到大的排序。取前k个点中最多的标签,则这个未知的点对应的标签就是得到的最多的标签。(标签可以理解为属性)
举书中的例子如下图:
(该图是拿Matplotlib画的)
图中蓝点是训练集,红点是要测试的点。蓝色点有两个标签,一个是A,一个是B。
当我们进行KNN分类时,系统会计算红点与各个蓝点之间的距离,并且进行从小到大排列。如果我们将k设为3,则表示取距离红点最近的三个点,构成一个列表[B,B,A],列表中标签B数量多于A的数量,则系统会将红点分类为B标签。
三、Python代码实现
我们在Python中自定义一个库叫做my_kNN.py
my_kNN.py定义了一个函数如下:
from numpy import *
import operator as op
def classify0(inX,dataSet,labels,k):
'''计算inX和训练样本的距离'''
dataSetSize=dataSet.shape[0]
diffMat=tile(inX,(dataSetSize,1))-dataSet
sqDiffMat=diffMat**2
sqDistances=sqDiffMat.sum(axis=1)
distances=sqDistances**0.5
sortedDistIndicies=distances.argsort()#对输入数组沿指定轴进行间接排序,返回索引数组
'''选择距离最小的k个点'''
classCount={}
for i in range(k):
voteIlabel = labels[sortedDistIndicies[i]]
classCount[voteIlabel]=classCount.get(voteIlabel,0)+1#利用字典形成计数器,key是标签,value是出现次数
sortedClassCount=sorted(classCount.items(),key=op.itemgetter(1),reverse=True)#排出出现次数最多的标签
#classCount.items()将classCount(字典)转为列表,op.itemgetter(1)根据第1个元素排列
return sortedClassCount[0][0]
这个函数就简单的根据欧氏距离公式实现了一个KNN算法
欧氏距离公式:d=√((xA0-xB0)^2+(xA1-xB1))
对于我们自创的库函数加以测试:
from numpy import *
import my_kNN
group=array([[1,1.1],[1,1],[0,0],[0,0.1]])
labels=['A','A','B','B']
result=my_kNN.classify0([0.2,0],group,labels,3)
print(result)
最后得到的结果如下: