KNN算法介绍

本文介绍了KNN(K-Nearest Neighbor)算法的基础概念,包括如何通过取最近邻数据判断分类(K值影响)、以及距离计算(欧式距离法)的运用。重点讲解了K值的选择策略和面对高维数据的问题。此外,还阐述了KNN的非参、惰性特点及优缺点。
摘要由CSDN通过智能技术生成

KNN算法介绍

一、介绍

KNN(K- Nearest Neighbor)法即K最邻近法,最初由 Cover和Hart于1968年提出,是最简单的机器学习算法之一,属于有监督学习中的分类算法。算法思路简单直观:分类问题:如果一个样本在特征空间中的K个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别,则该样本也属于这个类别。KNN是分类算法。

二、原理
2.1 K值取几个最近的邻居数据来判断分类

牛马哥在这里呈上KNN分类算法最经典的图片,用三角形、圆形和矩形这种最少儿的图片来解释

在这里插入图片描述

图上前提解释:假设x和y是我们这次的特征值,绿色的矩形是我们想要预测的数据,图上的三角形和圆形是我们已知的数据集,我们需要通过现有的数据集来判断绿色矩形是三角形还是圆形。

当K = 3,代表选择离绿色矩形最近的三个数据,发现三个数据中三角形比较多,所以矩形被分类为三角形

当K = 5,代表选择离绿色矩形最近的三个数据,发现五个数据中圆形最多,所以矩形被分类为圆形

所以K值很关键,同时建议k值选取奇数。

2.2 距离问题

在上面的原理中还有一个关键问题,就是怎么判断距离是否最近。在这里采用的是欧式距离计算法:

下图是在二维的平面来计算的,可以当作是有两个特征值

在这里插入图片描述

那如果遇到多特征值的时候,KNN算法也是用欧式距离,公式如下:

在这里插入图片描述

从这里就能看出KNN的问题了,需要大量的存储空间来存放数据,在高维度(很多特征值输入)使用距离的度量算法,电脑得炸哈哈,就是极其影响性能(维数灾难)。而且如果要预测的样本数据偏离,会导致分类失败。

优点也是有的,如数据没有假设,准确度高,对异常点不敏感;理论成熟,思想简单。

三.KNN特点

从别人的博客看到的,挺好的。原文链接:https://blog.csdn.net/weixin_45014385/article/details/123618841

KNN是一种非参的,惰性的算法模型。什么是非参,什么是惰性呢?

非参的意思并不是说这个算法不需要参数,而是意味着这个模型不会对数据做出任何的假设,与之相对的是线性回归(我们总会假设线性回归是一条直线)。也就是说KNN建立的模型结构是根据数据来决定的,这也比较符合现实的情况,毕竟在现实中的情况往往与理论上的假设是不相符的。

惰性又是什么意思呢?想想看,同样是分类算法,逻辑回归需要先对数据进行大量训练(tranning),最后才会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。

会得到一个算法模型。而KNN算法却不需要,它没有明确的训练数据的过程,或者说这个过程很快。

总结,KNN模型就是暴力将预测值和模型中的数据进行距离计算,然后通过最近的数据进行分类。

KNN算法是一种基于实例的学习算法,它的基本思想是将样本集中与待分类样本最近的K个样本作为参考,根据这K个样本的类别来判断待分类样本的类别。KNN算法的优点是简单易懂,不需要建立模型,分类效果较好,但是由于其计算量较大,对于大规模数据集不太适用。 以下是KNN算法的matlab代码实现: 1. 加载数据集 假设我们有一个数据集,其中包含3个样本,每个样本有2个特征。我们可以将数据集表示为一个3行2列的矩阵。 ```matlab data = [1 2; 2 1; 3 4]; ``` 2. 定义待分类样本 我们定义一个待分类样本,它有2个特征。 ```matlab testData = [2 3]; ``` 3. 计算距离 我们使用欧氏距离来计算每个样本与待分类样本之间的距离,距离计算公式为: $$d(x,y)=\sqrt{\sum_{i=1}^{n}(x_i-y_i)^2}$$ ```matlab dist = sqrt(sum((data - repmat(testData,size(data,1),1)).^2,2)); ``` 其中,`repmat(testData,size(data,1),1)`表示将待分类样本重复3次,然后与数据集相减,再对每个样本进行求和,最后取平方根,即可得到每个样本与待分类样本之间的距离。 4. 选择K个最近的样本 我们选择距离最小的K个样本作为参考,这里我们选择K=2。 ```matlab k = 2; [~, idx] = sort(dist); kIdx = idx(1:k); ``` 其中,`[~, idx] = sort(dist)`表示将距离从小到大排序,`kIdx = idx(1:k)`表示选择前K个最近的样本。 5. 统计K个最近样本的类别 我们统计K个最近样本的类别,并选择出现次数最多的类别作为待分类样本的类别。 ```matlab labels = [1 1 2]; testLabel = mode(labels(kIdx)); ``` 其中,`labels`表示每个样本的类别,这里我们假设有2个类别,分别为1和2,`mode`函数表示选择出现次数最多的元素。 完整代码如下: ```matlab data = [1 2; 2 1; 3 4]; testData = [2 3]; dist = sqrt(sum((data - repmat(testData,size(data,1),1)).^2,2)); k = 2; [~, idx] = sort(dist); kIdx = idx(1:k); labels = [1 1 2]; testLabel = mode(labels(kIdx)); ``` 以上就是KNN算法的matlab代码实现。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值