京公网安备 11010802034615号
经营许可证编号:京B2-20210330
把近朱者赤,近墨者黑这一思想运用到机器学习中会产生什么?当然是KNN最邻近算法啦!KNN(全称K-Nearest Neighbor)最邻近分类算法是数据挖掘分类算法中最简单的算法之一,白话解释一下就是:由你的邻居来推断出你的类别。那么KNN算法的原理是什么,如何实现?一起与小编来看下面的内容吧。
一、KNN最邻近算法概念
KNN最邻近算法,是著名的模式识别统计学方法之一,在机器学习分类算法中占有很高的地位。KNN最邻近算法在理论上比较成熟,不仅是最简单的机器学习算法之一,而且也是基于实例的学习方法中最基本的,最好的文本分类算法之一。
KNN最邻近算法基本做法是:给定测试实例,基于某种距离度量找出训练集中与其最靠近的k个实例点,然后基于这k个最近邻的信息来进行预测。
KNN最邻近算法不具有显式的学习过程,事实上,它是懒惰学习(lazy learning)的著名代表,此类学习技术在训练阶段仅仅是把样本保存起来,训练时间开销为零,待收到测试样本后再进行处理。
二、KNN最邻近算法三要素
KNN最邻近算法三要素为:距离度量、k值的选择及分类决策规则。根据选择的距离度量(如曼哈顿距离或欧氏距离),可计算测试实例与训练集中的每个实例点的距离,根据k值选择k个最近邻点,最后根据分类决策规则将测试实例分类。
1.距离度量
特征空间中的两个实例点的距离是两个实例点相似程度的反映。K近邻法的特征空间一般是n维实数向量空间Rn。使用的距离是欧氏距离,但也可以是其他距离,如更一般的Lp距离或Minkowski距离。
这里p≥1.
当p=1时,称为曼哈顿距离(Manhattan distance),即
当p=2时,称为欧氏距离(Euclidean distance),即
2.k值的选择
k值的选择会对KNN最邻近算法的结果产生重大影响。在应用中,k值一般取一个比较小的数值,通常采用交叉验证法来选取最优的k值。
3.分类决策规则
KNN最邻近算法中的分类决策规则通常是多数表决,即由输入实例的k个邻近的训练实例中的多数类,决定输入实例的类。
三、KNN最邻近算法优缺点
1.优点
①简单,易于理解,易于实现,无需参数估计,无需训练;
②精度高,对异常值不敏感(个别噪音数据对结果的影响不是很大);
③适合对稀有事件进行分类;
④特别适合于多分类问题(multi-modal,对象具有多个类别标签),KNN要比SVM表现要好.
2.缺点
①对测试样本分类时的计算量大,空间开销大,因为对每一个待分类的文本都要计算它到全体已知样本的距离,才能求得它的K个最近邻点。目前常用的解决方法是事先对已知样本点进行剪辑,事先去除对分类作用不大的样本;
②可解释性差,无法给出决策树那样的规则;
③最大的缺点是当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。该算法只计算“最近的”邻居样本,某一类的样本数量很大,那么或者这类样本并不接近目标样本,或者这类样本很靠近目标样本。无论怎样,数量并不能影响运行结果。可以采用权值的方法(和该样本距离小的邻居权值大)来改进;
④消极学习方法。
四、KNN算法实现
主要有以下三个步骤:
1. 算距离:给定待分类样本,计算它与已分类样本中的每个样本的距离;
2. 找邻居:圈定与待分类样本距离最近的K个已分类样本,作为待分类样本的近邻;
3. 做分类:根据这K个近邻中的大部分样本所属的类别来决定待分类样本该属于哪个分类;
python示例
import math import csv import operator import random import numpy as np from sklearn.datasets import make_blobs #Python version 3.6.5 # 生成样本数据集 samples(样本数量) features(特征向量的维度) centers(类别个数) def createDataSet(samples=100, features=2, centers=2): return make_blobs(n_samples=samples, n_features=features, centers=centers, cluster_std=1.0, random_state=8) # 加载鸢尾花卉数据集 filename(数据集文件存放路径) def loadIrisDataset(filename): with open(filename, 'rt') as csvfile: lines = csv.reader(csvfile) dataset = list(lines) for x in range(len(dataset)): for y in range(4): dataset[x][y] = float(dataset[x][y]) return dataset # 拆分数据集 dataset(要拆分的数据集) split(训练集所占比例) trainingSet(训练集) testSet(测试集) def splitDataSet(dataSet, split, trainingSet=[], testSet=[]): for x in range(len(dataSet)): if random.random() <= split: trainingSet.append(dataSet[x]) else: testSet.append(dataSet[x]) # 计算欧氏距离 def euclideanDistance(instance1, instance2, length): distance = 0 for x in range(length): distance += pow((instance1[x] - instance2[x]), 2) return math.sqrt(distance) # 选取距离最近的K个实例 def getNeighbors(trainingSet, testInstance, k): distances = [] length = len(testInstance) - 1 for x in range(len(trainingSet)): dist = euclideanDistance(testInstance, trainingSet[x], length) distances.append((trainingSet[x], dist)) distances.sort(key=operator.itemgetter(1)) neighbors = [] for x in range(k): neighbors.append(distances[x][0]) return neighbors # 获取距离最近的K个实例中占比例较大的分类 def getResponse(neighbors): classVotes = {} for x in range(len(neighbors)): response = neighbors[x][-1] if response in classVotes: classVotes[response] += 1 else: classVotes[response] = 1 sortedVotes = sorted(classVotes.items(), key=operator.itemgetter(1), reverse=True) return sortedVotes[0][0] # 计算准确率 def getAccuracy(testSet, predictions): correct = 0 for x in range(len(testSet)): if testSet[x][-1] == predictions[x]: correct += 1 return (correct / float(len(testSet))) * 100.0 def main(): # 使用自定义创建的数据集进行分类 # x,y = createDataSet(features=2) # dataSet= np.c_[x,y] # 使用鸢尾花卉数据集进行分类 dataSet = loadIrisDataset(r'C:\DevTolls\eclipse-pureh2b\python\DeepLearning\KNN\iris_dataset.txt') print(dataSet) trainingSet = [] testSet = [] splitDataSet(dataSet, 0.75, trainingSet, testSet) print('Train set:' + repr(len(trainingSet))) print('Test set:' + repr(len(testSet))) predictions = [] k = 7 for x in range(len(testSet)): neighbors = getNeighbors(trainingSet, testSet[x], k) result = getResponse(neighbors) predictions.append(result) print('>predicted=' + repr(result) + ',actual=' + repr(testSet[x][-1])) accuracy = getAccuracy(testSet, predictions) print('Accuracy: ' + repr(accuracy) + '%') main()
数据分析咨询请扫描二维码
若不方便扫码,搜微信号:CDAshujufenxi
初中毕业想考证,先确认“我能不能报”,再比较证书价值。学历门槛不够的证书,宣传再多也与你无关;能报但对应不上岗位的证书, ...
2026-11-02市场岗确有一批报考不设专业限制的证书,但“不限专业”只解决能不能报,真正决定值不值的是三件事:对应市场岗哪条子路径、招聘 ...
2026-11-02“大学生必考证书有哪些”这个问题,本身就藏着一个需要先拆掉的假设:似乎存在一份人人适用的必考清单。实际上,除了少数与毕业 ...
2026-11-02“最好考的一级证书”这个问题,最容易踩的坑不是选错证书,而是没先弄清“一级”在目标证书体系里到底指什么。有的体系里,一级 ...
2026-11-02“职业证书哪个含金量高”这个问题,很难用一张榜单回答。原因不复杂:证书的“含金量”取决于你拿它做什么。想进入必须持证的行 ...
2026-11-02“证件含金量排名”是搜索量很高的词,但直接给你一份“十大证书排行榜”的文章,基本可以跳过。原因很简单:证书的含金量不是单 ...
2026-11-02在校大专生能考的证书,大体分三类:通用能力类(英语等级、计算机等级、普通话水平测试)、职业技能等级类,以及部分不要求工作 ...
2026-11-02在家闲着想考个证书,最容易踩的坑是先去搜“含金量排行榜”,然后被一堆培训广告牵着走。更稳妥的顺序是反过来的:先看自己属于 ...
2026-11-02“注册类证书”不是一个可以随手列全的清单,它更像一个制度口径:通常指国家职业资格目录中设有注册管理、与执业准入挂钩的资格 ...
2026-11-02“现在考什么证有用”很难有统一答案。同一张证书,对想进会计事务所的人有用,对想做新媒体运营的人可能帮助有限;对需要评职称 ...
2026-11-02“适合女生考的证书有哪些含金量高”,这个问题里藏着两个容易走偏的前提。一是把“女生”当成职业属性,仿佛有一份统一的女性证 ...
2026-11-02先说结论:工商管理专业女生不必追“女生必考”榜单。证书有没有用,取决于它能不能对上你准备投的岗位。比较稳妥的做法,是先在 ...
2026-11-02“什么证好考又实用”这个问题,最怕两种回答:一种是列一堆“通过率高”的证书,却不告诉你考完能干什么;另一种是反过来只谈含 ...
2026-11-02“女士可以考哪些证书”并没有一份统一答案。真正决定你能考什么的,不是性别,而是三件事:你现在的身份(在校、在职还是准备转 ...
2026-11-02大专学历想考运营岗位证书,先给结论:能报的证书不少,但值得考的集中在三类——平台官方运营/投放认证、职业技能等级评价、数 ...
2026-11-02大学生判断一张证书是否重要,不用先看宣传热度,而要看四件事:它是否匹配你的目标岗位,校招时是否真用得上,在校期间是否具备 ...
2026-11-02先把结论说清楚:在校期间以2—4张核心证书为宜,其中1—2张通用底证、1—2张与目标岗位对应的方向证;高壁垒资格证只在符合报考 ...
2026-11-02大学生问证书推荐,最容易掉进的坑是“别人考什么我也考什么”。证书本身没有统一的含金量排序,同一张证,对目标岗位是硬门槛, ...
2026-11-02经管毕业生没有一张“通吃”的证书。比较有用的选择,是先按财会、金融、市场、人力、综合管理几个方向锁定目标岗位,再把证书分 ...
2026-11-02“程序员考什么证书含金量高”,没有放之四海皆准的答案。同样是“高含金量”,对后端开发、云原生工程师、数据开发和安全工程师 ...
2026-11-02