k近邻(k-Nearest Neighbor,kNN)算法是经典的带监督的分类算法,核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则针对该样本的划分结果也属于这个类别。1. 算法步骤
准备训练数据和测试数据;
确定参数 k;
计算测试数据与各个训练数据之间的距离,距离的递增关系进行排序;
选取距离最小的 k 个点;
确定前 k 个点所在类别的出现频率;
返回前 k 个点中出现频率最高的类别作为测试数据的预测分类。
2. Python代码实现kNN 2.1 算法实现# python 3.7.2 from numpy import * import operator def kNNClassify(testData, trainData, labels, k): dataSize = trainData.shape[0] # 测试数据矩阵的行数,4 diffMat = tile(testData, (dataSize, 1)) - trainData # numpy中的tile用于重复矩阵中的元素,构造和dataSize规格一样 sqDiffMat = diffMat ** 2 sqDistances = sqDiffMat.sum(axis=1) # 计算矩阵的行和 distances = sqDistances ** 0.5 # 采用欧式距离计算 sortedDisindexes = distances.argsort() # 返回排序后对应的索引数据 classCount = {} for i in range(k): voteLabel = labels[sortedDisindexes[i]] classCount[voteLabel] = classCount.get(voteLabel, 0) + 1 sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True) # 根据第2维进行排序 return sortedClassCount[0][0]
假设训练数据为:
trainData= [[1, 1.1], [1, 1], [0, 0], [0, 0.1]] labels = ["A", "A", "B", "B"]
测试数据为:
testData = [[1.1 , 1], [0.1, 0]]2.2 实战:约会网站对象匹配
小明在某约会网站上浏览妹子,对看到的每一个妹子进行评价:largeDoses,smallDoses,didntLike,评价的依据有3条:
每年旅行里程数
玩游戏占一天时间比重
每周吃的甜品数量
收集了1000条相关数据,存储在datingTestSet.txt文件中
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 51052 4.680098 0.625224 didntLike ...
def file2Matrix(filename): love_dictionary = {"largeDoses": 1, "smallDoses": 0, "didntLike": -1} fr = open("datingTestSet.txt") arrayOfLines = fr.readlines() numOfLines = len(arrayOfLines) dataMatrix = zeros((numOfLines, 3)) # 数据矩阵 classLabels = [] # 标签数组 index = 0 for line in arrayOfLines: line = line.strip() listFromLine = line.split(" ") dataMatrix [index, :] = listFromLine[0:3] classLabels.append(love_dictionary.get(listFromLine[-1])) index += 1 return returnMat, classLabels
各个维度的数值差异较大,直接使用会严重影响分类效果,因此需要进行归一化处理:
newValue = (oldVlue -min) / (max - min)
def autoNorm(dataSet): minVals = dataSet.min(0) # min(0)返回列的最小值, min(1)返回行的最小值 maxVals = dataSet.max(0) # max(0)返回列的最大值, max(1)返回行的最大值 ranges = maxVals - minVals normDataSet = zeros(shape(dataSet)) m = normDataSet.shape[0] normDataSet = dataSet - tile(minVals, (m, 1)) normDataSet = normDataSet / tile(ranges, (m, 1)) return normDataSet
最后调用kNNClassify函数进行测试。此处省略
3. 算法优缺点 3.1 优点简单,易于理解,易于实现;
适合数值型属性分类;
适合于多分类问题(multi-modal,对象具有多个类别标签), kNN比SVM的表现要好。
3.2 缺点当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的k个邻居中大容量类的样本占多数,分类出现偏差。
计算量较大,每一个待分类的文本都要计算它到全体已知样本的距离。
4. 改进策略改进策略主要分成了分类效率和分类效果两个方向:
分类效率:事先对样本属性进行约简,删除对分类结果影响较小的属性。该算法比较适用于样本容量比较大的类域的自动分类,而那些样本容量较小的类域采用这种算法比较容易产生误分。
分类效果:① 采用权值的方法(和该样本距离小的邻居权值大)来改进,如可调整权重的k最近邻居法WAkNN (weighted adjusted k nearest neighbor);② 依照训练集合中各种分类的文件数量,选取不同数目的最近邻居,来参与分类;③ 类中心算法,求出各个样本的类中心到测试数据的距离,划分到最近的类。
参考资料《机器学习实战》
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/43672.html
摘要:电影分析近邻算法周末,小迪与女朋友小西走出电影院,回味着刚刚看过的电影。近邻分类电影类型小迪回到家,打开电脑,想实现一个分类电影的案例。分类器并不会得到百分百正确的结果,我们可以使用很多种方法来验证分类器的准确率。 电影分析——K近邻算法 周末,小迪与女朋友小西走出电影院,回味着刚刚看过的电影。 小迪:刚刚的电影很精彩,打斗场景非常真实,又是一部优秀的动作片! 小西:是吗?我怎么感觉这...
摘要:背景近邻算法的概述近邻算法的简介近邻算法是属于一个非常有效且易于掌握的机器学习算法,简单的说就是采用测量不同特征值之间距离的方法对数据进行分类的一个算法。完美的分类器的错误率为,而最差的分类器的错误率则为。 1 背景 1.1 k近邻算法的概述 (1)k近邻算法的简介 k-近邻算法是属于一个非...
摘要:算法及工作原理近邻算法采用测量不同特征值之间的距离方法进行分类。最后选择个最相似数据中出现次数最多的分类作为新数据的分类。 1 分类算法引言 众所周知,电影可以按照题材分类,然而题材本身是如何定义的?由谁来判定某部电影属于哪个题材?也就是说同一题材的电影具有哪些公共特征?这些都是在进行电影分类时必须要考虑的问题。 动作片中也会存在接吻镜头,爱情片中也会存在打斗场景,我们不能单纯依靠是...
阅读 621·2019-08-30 15:44
阅读 1273·2019-08-30 11:02
阅读 2908·2019-08-29 18:42
阅读 3485·2019-08-29 16:16
阅读 1684·2019-08-26 13:55
阅读 1739·2019-08-26 13:45
阅读 2360·2019-08-26 11:43
阅读 3160·2019-08-26 10:32