【机器学习实战】k-近邻算法

来源:互联网 发布:php音频上传代码 编辑:程序博客网 时间:2024/05/21 14:55

本系列是基于《机器学习实战》这本书做的读书笔记,原书采用python2作为工具,我则将原书代码改为用python3编写并记录在此系列中。我将把书中对这些机器学习算法的定义誊上,然后写下自己对该算法的通俗理解,之后贴出书中算法清单中的代码

k-近邻算法概述

本书讲解的第一个机器学习算法是k-近邻算法(kNN),它的工作原理是:

存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后,将新数据的每个特征与样本集中的数据对应的特征进行比较,然后算法提取样本集中特征最相似的数据(即最近邻)的分类标签。一般来说,我们只选择样本集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类,作为新数据的分类。

用通俗易懂的话来解释一下:
假设我们有一个样本数据集合叫做“欧美电影动作片和爱情片”,我们从中取出一个数据,叫做《California Man》,这部电影就是一个数据,这个数据有很多特征,我们这里假设它有两个特征,第一个特征是接吻镜头数,本电影有104个,第二个特征是打斗镜头数,本电影有3个
这个数据还有一个标签,即《California Man》这部电影是一个爱情片爱情片就是《California Man》的这个数据的标签
这个集合里的每一个数据,都像这个《California Man》一样,有这两个特征(接吻镜头数,打斗镜头数),和一个标签(爱情片or动作片)。
这时,我们假设拿到一个新数据,电影《Iron Man》打斗镜头数为150,接吻镜头数为2,我们的目的,就是找到这个新数据的标签,为此,我们把这个数据的两个特征与样本数据集合中数据的特征进行挨个比较,计算差异的大小(即全部画在一个二维坐标系上,计算点与点之间的距离),我们选择结果中前k个与其最相似的数据,比如选前三个,发现这三个都是动作片,那么这个数据《Iron Man》我们就把他归为动作片

书中代码(书中为python2,这里为python3):

程序清单2-1 k-近邻算法 kNN.py

from numpy import *def createDataSet():    group = array([[1.0,1.1],[1.0,1.0],[0,0],[0,0.1]])    labels = ['A','A','B','B']    return group, labelsdef classify0(inX, dataSet, labels, k):    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()    classCount={}    for i in range(k):        voteIlabel = labels[sortedDistIndicies[i]]        classCount[voteIlabel] = classCount.get(voteIlabel, 0) + 1    sortedClassCount = sorted(classCount.keys(), reverse = True)    return sortedClassCount[0][0]
0 0
原创粉丝点击