k最邻近算法(K-Nearest Neighbors,KNN)

引言

基本概念: K-最近邻居(KNN)算法是一种基于实例的学习,它用于分类和回归。在分类中,一个对象的分类由其邻居的“多数投票”决定,即对象被分配到其k个最近邻居中最常见的类别中。

重要性: KNN算法在机器学习领域的重要性主要体现在它的直观性、易理解性和在某些场景(如小规模数据、低维度问题)下的有效性。

应用实例: KNN在各种场景中都有应用,例如手写数字识别、图像分类、推荐系统(通过找到与特定用户相似的其他用户来推荐物品)等。

算法解读

基本原理:

KNN算法的核心思想可以通过一个简单的日常例子来理解:假设你刚搬到一个新城市,正在寻找一个好的餐馆吃晚餐。你可能会询问你的邻居们推荐一个好的餐馆。如果大多数邻居推荐同一家餐馆,你可能会认为这家餐馆的确不错,并选择去那里用餐。在这个例子中,你在做一个决策,而你的决策基于你的邻居们的意见或“投票”。

KNN算法的工作方式类似。在机器学习的上下文中,我们有一个已标记的数据集,也就是我们已经知道每个数据点所属的类别。当我们有一个新的数据点(我们不知道它属于哪个类别)并希望基于我们现有的数据来预测它的类别时,我们可以使用KNN算法。

算法步骤:

1.确定K值:
首先,我们需要确定“K”值,即我们要考虑多少个“邻居”的意见。K是一个正整数,通常是较小的数。例如,K=3意味着我们考虑最近的三个邻居的意见。

2.计算距离:
接下来,我们计算新数据点与数据集中所有点之间的距离。通常使用欧氏距离,但根据问题的性质,我们也可以使用其他距离度量方法,如曼哈顿距离、闵可夫斯基距离等。

3.找到最近的K个点:
一旦我们计算了新数据点与数据集中所有点之间的距离,我们就可以找到距离最近的K个点。这些点就是新数据点的“邻居”。

4.投票:
接下来,我们查看这K个邻居点的标签(类别)。我们将新数据点分配给这K个邻居中最常出现的类别。例如,如果K=3,其中两个邻居属于类别A,一个邻居属于类别B,那么新数据点将被分配给类别A。

5.结果:
我们得到了新数据点的预测类别,即基于其K个最近邻居的“多数投票”结果。

代码示例

针对上述计算步骤,下面通过python代码进行实现:

import numpy as np
import matplotlib.pyplot as plt
from sklearn.neighbors import NearestNeighbors

# 生成数据
np.random.seed(0)  # 保证可重复性
data = np.random.rand(10, 2) * 10  # 10个点在2D空间中

# 查询点
query_point = np.array([5, 5]).reshape(1, -1)  # 2D点

# 使用KNN找到最近的3个邻居
knn = NearestNeighbors(n_neighbors=3).fit(data)
distances, indices = knn.kneighbors(query_point)

# 可视化
plt.figure(figsize=(10, 6))
plt.scatter(data[:, 0], data[:, 1], s=70, label='Data points')
plt.scatter(query_point[:, 0], query_point[:, 1], s=100, color='red', label='Query point')
plt.scatter(data[indices][0][:, 0], data[indices][0][:, 1], s=70, color='green', label='Nearest Neighbors')

# 画出从查询点到最近邻居的线
for idx in indices[0]:
    plt.plot([query_point[0, 0], data[idx, 0]], [query_point[0, 1], data[idx, 1]], linestyle='--', color='gray')

plt.title('KNN Nearest Neighbors')
plt.xlabel('Feature 1')
plt.ylabel('Feature 2')
plt.legend()
plt.grid(True)
plt.show()

上述代码的运行结果如下:

图片[1]-k最邻近算法(K-Nearest Neighbors,KNN)-点头深度学习网站

在这个实例中:

我们首先生成了一些随机的2D点作为数据集(蓝色点)。

选择了一个查询点(红色点)。

使用KNN找到了查询点的3个最近邻居(绿色点)。

最后,我们用灰色的虚线将查询点与它的最近邻居连接起来进行可视化。

算法评价

注意问题:

1. k值的选择对算法的性能有较大影响。

较小的k值(例如k=1或2)可能导致模型对训练数据的噪声过于敏感,从而产生高方差和低偏差,导致过拟合。相反,较大的k值可能使模型过于泛化,引入更高的偏差但降低方差,可能导致欠拟合。而且较大的k值将需要在预测时考虑更多的邻居,这可能增加计算的时间和空间负担。

2. 距离度量的选择需要根据问题的具体特性来确定。

不同的距离度量方法会识别出不同的邻居,进而导致模型的预测结果不同。一般情况下,欧氏距离在很多情况下效果都不错,但可能对异常值敏感。曼哈顿距离对异常值相对稳健,尤其在高维空间中。余弦相似度当方向比大小更重要时,例如在文本分类中。

 3. 特征的标准化通常是非常重要的预处理步骤。

标准化确保所有特征在距离计算中有相等的权重,防止尺度较大的特征主导距离计算。常用方法有Min-Max Scaling,可以将特征缩放到一个特定的范围,例如[0, 1]。还有Z-Score Normalization,可以将特征缩放到均值为0,标准差为1的分布。在应用任何距离度量之前,特征标准化通常是必须的预处理步骤,以防止由于特征尺度不同而产生的问题。

优缺点:

  – 优点: 算法简单直观,易于理解和实现;无需建模和训练过程。

  – 缺点: 计算量大,尤其是在大数据集上;维数灾难问题;对于样本不平衡问题的敏感性。

特点:  KNN是基于实例的学习,具体来说,KNN算法不从训练数据中学习显式的决策规则,而是直接存储训练数据,并在推断时通过查找输入样本在训练数据中的最近邻居来进行预测。KNN被认为是一种懒惰学习器,因为它直到推断阶段才开始进行计算,而在训练阶段几乎不进行计算。 KNN算法在做出预测时重点关注输入样本的局部邻居,这意味着它对数据的局部结构(如异常值和噪声)非常敏感。

算法的变体

1. 加权KNN (Weighted KNN)

核心思想: 加权KNN算法在做决策时,不是简单地考虑最近邻k个样本的“多数票”,而是给每个邻居一个权重,让距离更近的邻居在决策中拥有更大的影响力。

权重计算: 常见的权重计算方式是根据距离的逆来计算,即权重与距离成反比。如果使用欧氏距离,则权重可以定义为:1除以距离的平方。这样,距离更近的邻居将有更大的权重。

预测方法: 对于分类问题,预测结果是加权投票的结果;对于回归问题,预测结果是加权平均的结果。

优缺点: 加权KNN可以减少噪声的影响,但同时计算量会略有增加,因为需要计算权重。

2. 减少搜索空间的方法

KD树 (K-dimensional tree)是一种空间划分树,用于组织k维空间中的点。构建KD树的过程是一个递归的划分过程:在每一步中,选择一个维度和一个切分点,将数据分为两个半空间,并递归地在每个半空间上重复该过程。用一种更通俗的方式来理解,想象你在一本分了很多章节的书中查找一个词。你可能不会从第一页开始查,而是会先找到合适的章节,然后再在该章节中查找,大大减少了查找的时间。KD树的构建过程就像将所有点按某种规则分成了很多“章节”,当查找最近点时,我们可以直接跳到合适的“章节”中查找,而无需在整个空间中查找。

在KD树上搜索最近邻居的方法是一种优先搜索,它保留了一些可能的候选点,并在搜索过程中逐渐减小候选点集合的大小。KD树可以显著减少在大规模数据集上的搜索时间,尤其是在低维度数据上效果明显。但当维度增加时,效果会逐渐降低(“维数灾难”)。

这两种KNN算法的变体(加权KNN和使用KD树的KNN)在不同的应用场景下各有优势,选择哪一种变体需要根据实际问题的特性和数据的特点来决定。希望这些信息能帮助您更深入地理解KNN算法的这些变体!  

其他变体包括局部加权回归KNN、自适应KNN等,可以在多种文献中找到这些变体的详细信息。

总结

KNN是一种简单直观、易于实现、不需要建模的机器学习算法。KNN广泛应用于分类、回归、推荐系统等多个领域。对于未来发展建议,研究者们可以探索如何更加智能地选择k值,以及如何通过学习确定合适的距离度量。另外,在大数据和高维数据上,进一步研究如何优化KNN算法的搜索效率和计算效率。

© 版权声明
THE END
喜欢就支持一下吧
点赞13 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容