KNN算法(K近邻算法)


前言

KNN(K-Nearest Neighbor)即K邻近法,是机器学习算法中最基础、最简单的算法之一。它既能用于分类,也能用于回归。KNN通过测量不同特征值之间的距离来进行分类,用老话说:“人以群分,物以类聚”。KNN 算法是有监督学习中的分类算法,它看起来和另一个机器学习算法 K-means 有点像(K-means 是无监督学习算法),但却是有本质区别的。

一、KNN算法原理详解

1.算法的核心思想

KNN算法又叫K近邻算法,由这个名字我们不难猜测出这个算法的一些蛛丝马迹,这个算法肯定和K个最近的邻居有很大的关系,而对于这个K的取值也肯定是至关重要的,事实也确实如此。算法大概的意思是:当我们要预测一个新的位置值(点)是属于哪个类别的时候,我们可以看这个点附近什么类别的点数量最多,而附近是指多少距离就是由K决定的,我们可以这么理解,我们以未知点为圆心,以K的大小为半径画圆,在这个圆里面找出各种点类型的数量,哪个类型点最多我们就认为这个未知点属于哪个类型,所以K的取值很重要。具体见下图:

绿色点即为位置点,当K等于3时,不难发现三角形这类最多,所以我们把位置点归类为三角形。

而当K=5时,我们就发现,范围内圆圈的数量最多,所以这时我们把位置点归类为圆形。

    从这个例子中我们不难看出K取值的重要性,他决定了我们算法判断的准确性,可以想象下:

1.如果我们的K取值很小的话,谁离未知点近的话未知点就归为哪类,这样未知点是不是很容易受到异常点的影响(即出现我们常说的过拟合)。

2.那如果K的取值很大,那这时离未知点很远的样本也会对未知点产生影响,而按理说这些点和未知点的关系应该是很小的,那这样我们就会有样本均衡的问题(此时模型变得简单,决策边界变平滑,又称欠拟合)。

3.如果K取N的话,那么就是取全部的样本,那当我们要判断未知点时,结果就是把未知点归类为所有样本中最多分类的一种,那这样我们对未知点的分类就失效了,也就是说分类是没有意义的,完全不准确的了。

由此可见一个合适的K值对于KNN算法来说时十分重要的。

2.K值的选择

交叉验证:将样本数据按照一定比例,拆分出训练用的数据和验证用的数据,比如7:3拆分出部分训练数据和验证数据,然后选取一个较小的 K 值开始,不断增加 K 的值,然后计算验证集合的方差,最终找到一个比较合适的 K 值。简单的说就是:把一些可能的K逐个去尝试一遍,然后选出效果最好的K值。        

3.距离度量

1.欧式距离(即两点之间的直线距离):

2.曼哈顿距离:

4.KNN算法的优点和缺点

优点:

  1. 简单易实现:KNN算法的原理简单,易于理解和实现,无需训练过程。
  2. 适用于多分类问题:KNN算法可以应用于多分类问题,并且对样本分布的假设较少。
  3. 对异常值不敏感:KNN算法对异常值不敏感,因为它是通过距离计算来确定最近邻样本,即使某个样本是异常值,也不会对整体结果产生很大影响。

缺点:

  1. 计算复杂度高:KNN算法需要计算测试样本与所有训练样本之间的距离,计算复杂度较高,尤其是在大规模数据集上。
  2. 高度数据相关:KNN算法依赖于特征空间中的距离度量,如果特征空间中的距离度量不合理或者特征权重不准确,可能会导致预测性能下降。
  3. 决策边界不规则:KNN算法的决策边界通常是不规则的,因为它只考虑了局部样本的信息,而没有对全局进行建模。
  4. 对内存要求较高,因为该算法存储了所有训练数据。
  5. 预测阶段可能很慢。

二、KNN算法实现

1.引入库

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

2.主要实现

代码如下(示例):

# 加载鸢尾花数据集
iris = load_iris()
X = iris.data  # 特征向量
y = iris.target  # 类别标签

# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.4, random_state=42)  #训练集占比为0.4

# 构建KNN分类器
knn = KNeighborsClassifier(n_neighbors=10)  # 设置邻居数量为10
knn.fit(X_train, y_train)  # 在训练集上训练模型

# 在测试集上进行预测
y_pred = knn.predict(X_test)

# 计算分类准确率
accuracy = accuracy_score(y_test, y_pred)
print("你的准确率为: {:.2%}".format(accuracy))

注:该代码使用的是K近邻分类器(KNeighborsClassifier),它是基于最近邻距离进行分类的算法。在这种算法中,默认情况下会使用欧氏距离来计算样本之间的距离。

运行结果:


总结

    经过对KNN算法的学习后,我学会了一种用于分类和回归的统计方法,KNN算法是一种简单而直观的分类算法,其基本思想是通过找到与待分类样本最近的K个已知类别样本来确定其类别。其主要优点是实现简单、可解释性强,并且适用于多分类问题和非线性分类问题。但是,KNN算法的缺点也很明显,主要包括计算复杂度高、需要大量的存储空间等。世界上没有完美的算法,每个算法都有优有劣,但KNN算法较为简单,对于我们刚入门的新手来说比较适合,KNN算法虽然有一些局限性和缺点,但是在实际应用中仍然具有很大的价值和意义。理解KNN算法的基本思想,掌握其实现方法和优化技巧,可以对我们进一步学习和应用其他机器学习算法提供很好的基础。

  • 4
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值