k-近邻算法梳理(从原理到示例)

k-近邻算法是一个有监督的机器学习算法,k-近邻算法也被称为knn算法,可以解决分类问题。也可以解决回归问题。本文主要内容整理为如下:

  • knn算法的原理、优缺点及参数k取值对算法性能的影响;
  • 使用knn算法处理分类问题的示例;
  • 使用knn算法解决回归问题的示例;
  • 使用knn算法进行糖尿病检测的示例;

1 算法原理

knn算法的核心思想是未标记样本的类别,由距离其最近的k个邻居投票来决定。
具体的,假设我们有一个已标记好的数据集。此时有一个未标记的数据样本,我们的任务是预测出这个数据样本所属的类别。knn的原理是,计算待标记样本和数据集中每个样本的距离,取距离最近的k个样本。待标记的样本所属类别就由这k个距离最近的样本投票产生。
假设X_test为待标记的样本,X_train为已标记的数据集,算法原理的伪代码如下:

  • 遍历X_train中的所有样本,计算每个样本与X_test的距离,并把距离保存在Distance数组中。
  • 对Distance数组进行排序,取距离最近的k个点,记为X_knn。
  • 在X_knn中统计每个类别的个数,即class0在X_knn中有几个样本,class1在X_knn中有几个样本等。
  • 待标记样本的类别,就是在X_knn中样本个数最多的那个类别。

1.1 算法优缺点

  • 优点:准确性高,对异常值和噪声有较高的容忍度。
  • 缺点:计算量较大,对内存的需求也较大。

1.2 算法参数

其算法参数是k,参数选择需要根据数据来决定。

  • k值越大,模型的偏差越大,对噪声数据越不敏感,当k值很大时,可能造成欠拟合;
  • k值越小,模型的方差就会越大,当k值太小,就会造成过拟合。

1.3 变种

knn算法有一些变种,其中之一是可以增加邻居的权重。默认情况下,在计算距离时,都是使用相同权重。实际上,可以针对不同的邻居指定不同的距离权重,如距离越近权重越高。这个可以通过指定算法的weights参数来实现。
另一个变种是,使用一定半径内的点取代距离最近的k个点。当数据采样不均匀时,可以有更好的性能。在scikit-learn里, R a d i u s N e i g h b o r s C l a s s i f i e r {RadiusNeighborsClassifier} RadiusNeighborsClassifier类实现了这个算法变种。

2 示例:使用k-近邻算法进行分类

在scikit-learn里,使用k-近邻算法进行分类的是 s k l e a r n . n e i g h b o r s . K N e i g h b o r s C l a s s i f i e r {sklearn.neighbors.KNeighborsClassifier} sklearn.neighbors.KNeighborsClassifier类。

  • 生成已标记的数据集:
from sklearn.datasets.samples_generator import make_blobs
# 生成数据
centers = [[-2,2], [2,2], [0,4]]
X, y = make_blobs(n_samples=60, centers=centers,
                 random_state=0, cluster_std=0.60)

我们使用 s k l e a r n . d a t a s e t s . s a m p l e s g e n e r a t o r {sklearn.datasets.samples_generator} sklearn.datasets.samplesgenerator包下的 m a k e b l o b s {make_blobs} make

评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值