KNN算法——基本原理、分类、回归

算法原理

KNN算法的核心思维:相似度较高的样本,映射到n维空间后,其距离回避相似度较低的样本在距离上更加接近。
KNN,即K近邻算法,K近邻就是K个最近的邻居,当需要预测一个未知样本的时候,就由与该样本最接近的K个邻居来决定。KNN既可以用于分类问题,也可以用于回归问题。当进行分类预测时,使用K个邻居中,类别数量最多(或加权最多)者,作为预测结果;当进行回归预测时,使用K个邻居的均值(或加权均值),作为预测结果。

算法超参数

超参数,是指我们在训练模型之前,需要人为指定的参数。该参数不同于模型内部的参数,模型内部的参数是通过训练数据,在训练过程中计算得出的。超参数的不同,可能会对模型的效果产生很大的影响。

K值

K值的选择,会直接影响到预测结果。 当K值较小时,模型会依赖于附近的邻居样本,具有较好敏感性,但是稳定性会比较弱,容易导致过拟合。当K值较大时,稳定性增加,但是敏感性会减弱,容易导致欠拟合。
通常情况下,我们可以通过交叉验证的方式,选择最合适的K值。
K值

距离度量方式

在scikit-learn中,距离默认使用闵可夫斯基距离,p的值为2,。假设n维空间中的两个点为X、Y:
在这里插入图片描述
则闵可夫斯基距离为:
闵可夫斯基距离
当p为1时,距离为曼哈顿距离,当p为2时,距离为欧几里得距离(欧氏距离)。

权重计算方式

权重可以分为两种:

  • 统一权重:所有样本的权重相同。
  • 距离加权权重:样本的权重与待预测样本的距离成反比。

算法步骤

KNN算法的执行过程如下:
1.确定算法超参数

  • 确定近邻的数量K
  • 确定距离度量方式
  • 确定权重计算方式
  • 其他超参数

2.从训练集中选择离待预测样本A最近的K个样本

3.根据这K个样本预测A

  • 对于分类,使用K个样本的类别(或加权类别)预测A
  • 对于回归,使用K个样本目标值(y)的均值(或加权均值)预测A

使用KNN算法实现分类

建模预测

以鸢尾花数据为例,通过KNN算法实现分类任务。为了方便可视化,只取其中的两个特征。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import classification_report

iris = load_iris()
x = iris.data[:, :2]
y = iris.target
x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.25, random_state=0)
#n_neighbors:邻居的数量(k值)
#weight:权重计算方式。可选值为uniform与distance
#	uniform:所有样本同意权重
#	distance:样本权重与距离成反比
knn = KNeighborsClassifier(n_neighbors=3, weights='uniform')
knn.fit(x_train, y_train)
y_hat = knn.predict(x_test)
print(classification_report(y_test, y_hat))

在这里插入图片描述

超参数对模型的影响

不同的超参数值,会直接影响模型的分类效果,我们可以从决策边界中发现这一点。


                
  • 6
    点赞
  • 59
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值