K近邻(KNN)算法

一、关于KNN算法

K最近邻(K-Nearest Neighbors,简称KNN)算法是一种常用的机器学习算法,主要用于分类和回归问题。它基于实例之间的相似性度量进行预测。

主要思想:对于一个未知样本,通过比较其与已知样本的特征相似度,找出与该未知样本最相似的K个邻居(即K个与其特征最接近的样本)。然后,根据这K个邻居的标签信息,来确定该未知样本的类别或预测其目标值。

二、KNN算法的主要步骤

1. 准备数据集:收集已知样本的特征向量和对应的类别标签(分类问题)或目标值(回归问题)。

2. 选择K值:确定K的取值,即要考虑的最近邻居的数量。

3. 计算距离:使用合适的距离度量方法(如欧氏距离、曼哈顿距离等),计算未知样本与所有已知样本之间的距离。

4. 选择K个最近邻居:根据距离选择与未知样本最接近的K个已知样本作为最近邻居。

5. 进行预测:对于分类问题,通过投票或加权投票来确定未知样本的类别。对于回归问题,则可以计算邻居的平均值或加权平均值作为预测结果。

6. 输出预测结果:将预测结果返回给用户。

K值选择会对KNN算法的结果造成很大的影响:K越小说明整体模型越复杂,产生过分拟合的影响,相反K越大说明整体模型越简单,因为K个最近邻中可能包含了距离较远的,并非同类的数据点。

三、KNN算法的实现代码

import numpy as np
from collections import Counter

def knn(train_X, train_y, test_X, k):
    distances = []
    
    # 计算测试样本与训练集中所有已知样本之间的距离
    for i in range(len(train_X)):
        distance = np.sqrt(np.sum((test_X - train_X[i])**2))
        distances.append((distance, train_y[i]))
    
    # 根据距离排序,选择最近的K个邻居
    sorted_distances = sorted(distances, key=lambda x: x[0])
    neighbors = [x[1] for x in sorted_distances[:k]]
    
    # 对于分类问题,通过投票来确定预测类别
    # 对于回归问题,可以计算邻居的平均值作为预测结果
    if isinstance(neighbors[0], int) or isinstance(neighbors[0], str):
        predicted_label = Counter(neighbors).most_common(1)[0][0]
    else:
        predicted_label = np.mean(neighbors)
    
    return predicted_label

四、KNN算法的不足之处

1. 计算复杂度高:KNN算法需要计算未知样本与所有已知样本之间的距离,当训练集很大时,计算量会随之增加。

2. 内存消耗大:KNN算法在预测阶段需要保存整个训练集的样本和标签信息,对于大规模数据集而言,内存消耗较大。

3. 对异常值敏感:KNN算法受异常值的影响较大。由于KNN是基于距离进行判断,如果存在异常值,它们可能会对邻居的选择产生干扰。

4. 数据不平衡问题:当训练集中某个类别的样本数量远远超过其他类别时,KNN算法会偏向于选择该类别作为预测结果,导致分类结果不准确。

5. 维度灾难:KNN算法在处理高维数据时容易受到维度灾难的影响。高维空间中的距离计算变得困难,而且高维数据往往稀疏,导致距离计算不准确。

6. 参数选择困难:KNN算法中的K值选择对结果影响较大。选择较小的K值容易受到噪声的影响,选择较大的K值容易造成类别之间的模糊性。

五、总结

KNN算法的优点包括简单易实现、对数据没有假设性要求、适用于多分类问题和回归问题等。然而,KNN算法的缺点是计算复杂度高(需要计算未知样本与所有已知样本之间的距离)、对异常值敏感,并且在处理高维数据时存在维度灾难问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值