KNN算法的简述

KNN算法的简述

By:Yang Liu
1.什么是KNN算法。
KNN(K-Nearest Neighbor)是数据挖掘分类技术中最简单的方法之一。所谓K最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最接近的k个邻近值来代表。算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。
可以通俗的理解为“物以类聚人以群分近朱者赤近墨者黑”。
2.KNN算法的原理
KNN的原理就是当预测一个新的样本x的时候,根据它距离最近的K个点是什么类别来判断x属于哪个类别。换句话说就是在训练集中数据和标签已知的情况下,输入测试数据,将测试数据的特征与训练集中对应的特征进行相互比较,找到训练集中与之最为相似的前K个数据,则该测试数据对应的类别就是K个数据中出现次数最多的那个分类。
通用步骤:
1)计算测试数据与各个训练数据之间的距离;
2)按照距离的递增关系进行排序;
3)选取距离最小的K个点;
4)确定前K个点所在类别的出现频率;
5)返回前K个点中出现频率最高的类别作为测试数据的预测分类。
3.KNN算法的特点
KNN是一种非参的,惰性的算法模型(非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设。惰性是指KNN没有明确的训练数据的过程,或者说这个过程很快)。
4.KNN算法的优点
(1)简单,易于理解,易于实现,无估计参数;
(2)预测效果好;
(3)适合对稀有事件进行分类;
(4)适用于多个分类的问题;
5.KNN算法的缺点
(1)当样本不平衡时,如一个类的样本容量很大,而其他类样本容量很小时,有可能导致当输入一个新样本时,该样本的K个邻居中大容量类的样本占多数。
(2)计算量较大,因为对每一个待分类的样本都要计算它到全体已知样本的距离。
6.KNN算法的关键
K值得选取。
K太大导致分类模糊;K太小受个例影响,波动较大。
如何选取K值?
(1)凭借经验
(2)通过交叉验证,从选取一个较小的K值开始,不断增加K的值,然后计算验证集合的方差,最终找到一个比较合适的K值。下图表示当K=10时,所得结果最优。
在这里插入图片描述
参考文献:
(1)https://www.cnblogs.com/listenfwind/p/10311496.html
(2)https://www.bilibili.com/video/BV1Nt411i7oD?t=1352

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
KNN(K-Nearest Neighbor)算法是一种基本的分类算法,它的主要原理是通过测量不同特征值之间的距离,来对不同类别的数据进行分类。具体而言,对于一个新的数据点,算法会计算它与已有数据集中每个数据点之间的距离,并找到离它最近的K个数据点,然后根据这K个数据点的类别,来判断新的数据点应该属于哪个类别。 下面是“鸢尾花”数据集的KNN算法程序伪代码: ``` // 读取数据集 val data = sc.textFile("iris.data") val parsedData = data.map(line => { val parts = line.split(',').map(_.toDouble) (parts(0), parts(1), parts(2), parts(3), parts(4)) }) // 将数据集随机分成训练集和测试集 val splits = parsedData.randomSplit(Array(0.7, 0.3)) val trainingData = splits(0) val testData = splits(1) // 定义距离函数 def distance(x1: Double, y1: Double, x2: Double, y2: Double): Double = { math.sqrt(math.pow(x1 - x2, 2) + math.pow(y1 - y2, 2)) } // 定义KNN算法 def knn(data: RDD[(Double, Double, Double, Double, Double)], k: Int, x: Double, y: Double): Double = { val distances = data.map(p => (distance(p._1, p._2, x, y), p._5)) val sorted = distances.sortByKey() val topK = sorted.take(k) val counts = topK.map(_._2).groupBy(identity).mapValues(_.size).toArray counts.maxBy(_._2)._1 } // 对测试集进行分类 val k = 3 val predictions = testData.map(p => knn(trainingData, k, p._1, p._2)) // 计算分类准确率 val labelsAndPredictions = testData.map(p => (p._5, knn(trainingData, k, p._1, p._2))) val accuracy = 1.0 * labelsAndPredictions.filter(x => x._1 == x._2).count() / testData.count() println(s"Test accuracy: $accuracy") ``` 该程序先读取“鸢尾花”数据集,将数据集随机分成训练集和测试集,然后定义距离函数和KNN算法,用KNN算法对测试集进行分类,并计算分类准确率。其中,K的取值需要根据实际情况进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值