当前位置:文档之家› K-近邻算法

K-近邻算法


示例:使用k-近邻算法
改进约会网站的配对结果
(2)佩琪保存的样本具有以下3个特征: 每年获得的飞行常客里程数 玩视频游戏所耗时间百分比 每周消费的冰淇淋公升数
在将上述特征数据输入到分类器之前,必须 将待处理数据的格式改变为分类器可以接受 的格式。在kNN.py文件中添加名为file2matrix 的函数,以此来处理该问题。
示例:使用k-近邻算法
改进约会网站的配对结果
Python语言可以使用索引值-1表示列表 中的最后一列元素,利用这种索引,我们可 以很方便地将列表的最后一行储存到向量 classLabel-Vector中。 值得注意的是,我们必须明确告诉解释 器列表中存储的元素是整型。 ⑤ 继续输入以下命令:
>>> reload(kNN) >>> datingDataMat,datingLabels = kNN.file2matrix('datingTestSet2.txt')
K-近邻算法工作原理
1.工作原理: 存在一个样本数据集合(1)(也称为训练样本 集),并且样本集中每个数据都存在标签(即我们 知道样本集中每一数据与所属分类的对应关系(2))。 输入没有标签的新数据后,将新数据的每个特征 与样本集中数据对应的特征进行比较,然后算法 提供样本集中特征最相似数据(最近邻)的分类标 签(3)。一般来说,我们只选择样本数据集中前k 个最相似的数据(4),这便是算法中k的出处(通常 k≤20)。最后,选择k个最相似数据中出现次数最 多的分类,作为新标签的分类。
K-近邻算法示例
2.示例 (1)问题描述: 电影的分类可以按照题材来,然而题材本身 是如何定义的?也就是说同一题材的电影具 有哪些共同特征?这些都是电影分类时必须 要考虑的因素。现在有一种简单的方法,例 如在爱情片中会出现打斗场面,动作片亦会 出现轻吻镜头,但是很明显两者的频率是不 同的,因此接下来将讲述K-近邻算法关于此 的简单应用。
实施kNN分类算法
显然输出结果为B,当然也可以输入其他值例如 [0.5,0.5],结果如下: 到目前为止,我们已经构建了一个分类器,接下 来我们将从实例出发进行讲解: (4)关于分类器 分类器并不会得到100%正确的结果,我们可以 通过错误率来进行评估。
示例:使用k-近邻算法
改进约会网站的配对结果
示例:使用k-近邻算法
改进约会网站的配对结果
① 该函数的输入为文件名字符串,输出为 训练样本矩阵和类标签向量。 ② 下划线部分为得到文件行数。 ③ 倾斜部分为创建以0填充的矩阵Numpy。 ④ 下划线+倾斜字体部分循环处理文件中的 每行数据,首先使用函数line.strip()截掉 所有回车字符,然后使用\t字符将上一步 得到的整行数据分割成一个元素列表。 接着我们选取前3个元素,将他们存储到 特征矩阵中。
准备:使用Python导入数据
在上述代码中,我们导入了两个模块: 科学计算包Numpy以及运算符模块,k-近邻算 法执行排序操作时将使用这个模块提供的参 数,后面我们将进一步介绍。 为了方便使用createDataSet()函数,它创 建数据集和标签,我们需进入Python开发环 境并输入以下命令: (1)>>> import kNN 上述命令导入kNN模块。
准备:使用Python导入数据
(2)为了确保输入相同的数据集,继续输 入以下命令: >>> group,labels = kNN.createDataSet() 该命令创建了变量group和labels。 (3)输入变量的名字以检验是否正确的定 义变量: >>> group
准备:使用Python导入数据
K-近邻算法
目录
一、K-近邻算法优缺点 二、K-近邻算法工作原理及示例 三、K-近邻算法的一般流程 四、准备:使用Python导入数据 五、实施kNN分类算法 六、示例1:改进约会网站的配对结果 七、示例2:手写识别系统 八、小结
K-近邻算法优缺点
简单地说,K-近邻算法 (又称KNN)采用测 量不同特征值之间的距离方法进行分类。 其优缺点及适用数据范围如下: 优点:精度高、对异常值不敏感、无数 据输入假定。 缺点:计算复杂度高、空间复杂度高。 适用数据范围:数值型和标称型。
K-近邻算法示例
(2)下图示例了六部电影的打斗和接吻镜头数。
K-近邻算法示例
(3)假如有一部未看过的电影,如何确定它是爱情片 还是动作片呢?接下来将展示如何使用KNN来解决 这个问题。
① 首先我们需要知道需分类电影的打斗镜头和接吻 镜头数量,下图给出了一个详细示例:
K-近邻算法示例
② 即使不知道待分类电影属于哪种类型,我 们也可以通过某种方法计算方法。下图展 示的是待分类电影与样本集中其他电影的 距离计算结果:
实施kNN分类算法
现在我们已经知道Python如何解析数据,如何加载数据,以 及kNN算法的工作原理,接下来我们将使用这些方法完成分 类任务。 (1)以下为K-近邻算法的伪代码 对未知类别属性的数据集中的每个点依次执行以下操作: ① 计算已知类别数据集中点与当前点之间的距离; ② 按照距离递增次序排序; ③ 选取与当前点距离最小的k个点; ④ 确定前k个点所在类别出现的频率; ⑤ 返回前k个点出现频率最高的类别作为当前点的预测分类。
1.问题描述:
我都朋友佩琪一直使用在线约会网站寻找适 合自己的约会对象。尽管约会网站会推荐不 同的人选,但是她并不是喜欢每一个人。经 过一番总结,她发现曾交往过三种类型的人: 不喜欢的人 魅力一般的人 极具魅力的人
示例:使用k-近邻算法佩琪依然无法将约 会网站推荐的匹配对象归入恰当的类别。她 觉得可以在周一至约会那些魅力一般的人, 而周末则更喜欢与那些极具魅力的人为伴。 佩琪希望我们的分类软件可以更好的帮助她 将匹配到的对象划分到确切的分类中。此外, 佩琪还收集了一些约会网站未曾记录的数据 信息并保存在了文本文件datingTestSet2.txt中。
实施kNN分类算法
① classify0()函数有四个参数:用于分类的输入 向量inX,输入的样本训练集为dataSet,标签 向量为labels,最后的参数k表示用于选择最近 邻居的数目,其中标签向量和矩阵dataSet的 行数相同;
② 代码中下划线部分用于距离计算,使用的是 欧式距离公式; ③ 倾斜字体部分为对距离计算完毕后的数据按 照从小到大的次序排序并确定前k个距离最小 元素所在的主要分类(k总为正整数);
K-近邻算法的一般流程
接下来主要讲解如何在实际中应用K-近邻算法, 同时涉及如何使用Python工具和相关的机器学习术语, 以下为该算法的一般流程: (1)收集数据:可以使用任何方法。 (2)准备数据:距离计算所需要的数值,最好是结构 化的数据格式。 (3)分析数据:可以使用任何方法。 (4)测试算法:计算错误率。 (5)使用算法:首先需要输入样本数据和结构化的输 出结果,然后运行k-近邻算法判定输入数据属于哪个分 类,最后应用对计算出的分类执行后续的处理。
(此处暂时不关心如何计算得到的这些距离值,稍 后会具体讲解。)
K-近邻算法示例
③ 现在我们得到了样本集中所有电影与未知电影的 距离,按照距离递增排序,可以找到k个距离最 近的电影。假定k=3,则三个最靠近的电影依次 是He’s Not Really into Dudes、Beautiful Woman和 California Man。 ④ 结果: K-近邻算法按照距离最近的三部电影的类型,决 定待分类电影的类型,而这三部电影均为爱情片, 因此我们判定待分类电影为爱情片。
实施kNN分类算法
(2)以下为kNN近邻算法代码,将其保存于kNN.py中 def 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.iteritems(), key = operator.itemgetter(1), reverse = True) return sortedClassCount[0][0]
from numpy import* import operator def createDataSet(): group = array([1.0, 1.1], [1.0, 1.0], [0, 0], [0, 0.1]) labels = ['A', 'A', 'B', 'B'] return group, labels
>>> labels 结果显示,这里有四组数据,每组数据有两个我们已 知的属性或特征值。上面的group矩阵每行包含一个不同 的数据,我们可以将其想象成某个日志文件中不同的测量 点或者入口。由于人类大脑的限制,我们通常只能可视化 处理三维以下的实务。因此为了简单地实现数据可视化, 对于每个数据点我们通常只使用两个特征。 向量labels包含了每个数据点的标签信息,labels包含 的元素个数等于group矩阵行数。这里我们将数据点(1, 1.1)定义为A类,数据点(0,0.1)定义为B类。为了方便说明, 例子中的数值是任意选择的,并没有给出轴标签。
相关主题