机器学习实验报告一-KNN算法主要步骤

文章目录

前言

一、KNN算法概述

二、KNN算法主要实现步骤

1.确定K的大小

2.计算待分类实例与已知分类实例之间的距离

3.获取距待分类实例最近的K个实例

4.确定K个近邻类别的中次数最多的类别

三、总结


前言

        KNN算法是一种简单但实用的分类算法,它基于实例学习,通过将新实例与已知分类的实例进行比较来做出预测。在本文中,我们将深入探讨KNN算法的基本原理、实现步骤、优缺点、应用场景以及如何改进其存在的问题。


一、KNN算法概述

        KNN算法是一种基于实例的学习方法,它假定类别是由实例的特征决定的,并且类别之间的界限是清晰的。KNN算法的主要思想是,如果一个实例的周围大多数实例都属于某个类别,则该实例也属于这个类别。

       

         例如,要确定绿圆属于哪个类别,如果k=3,在其最近的3个样本中红色三角形数量最多,绿圆属于红色三角形类别,如果k=5,在其最近的5个样本中蓝色矩形数量最多,绿圆属于蓝色矩形类别,可见k的选择很重要。

二、KNN算法主要实现步骤

1.确定K的大小

        一般而言,从K= 1 开始,随着的逐渐增大,K近邻算法的分类效果会逐渐提升;在增大到某个值后,随着的进一步增大,K近邻算法的分类效果会逐渐下降。

        K值越小,分类效果越精细,越容易导致过拟合现象;K值越大,分类效果越粗糙,整体的模型变得简单。因此,在开始时,一般选用较小的奇数作为K的取值,并在训练过程中,使用交叉验证来调整K的大小来达到最好的训练效果。

2.计算待分类实例与已知分类实例之间的距离

        距离计算通常采用欧几里得距离、曼哈顿距离等。在实际应用中,为了提高算法效率,可以采用一些优化方法,如空间索引和KD树等。本文以欧几里得距离为例。

        对于两个点 P1(x1, y1, ...) 和 P2(x2, y2, ...),它们之间的欧几里得距离是:

                d(P1, P2) = sqrt((x1-x2)^2 + (y1-y2)^2 + ...)

        其中,平方和的项取决于你的数据维数。例如,如果你的数据是二维的(x,y),那么平方和的项就是 (x1-x2)^2 + (y1-y2)^2。如果数据是三维的(x,y,z),那么平方和的项就是 (x1-x2)^2 + (y1-y2)^2 + (z1-z2)^2,以此类推。详细代码如下:

def euclideanDistance(a, b, length):  //length为数据维数
    distance = 0
    for x in range(length):
        distance += pow((a[x]-b[x]), 2)
    return math.sqrt(distance)

3.获取距待分类实例最近的K个实例

        为了实现这一功能,我们可以通过在数据集中循环遍历每个实例,然后使用上面提到的欧几里得距离公式来完成。对于非常大的数据集,这个步骤可能会非常耗时。

       获取了所有距离后,对这些距离进行排序。这可以通过使用排序算法(例如快速排序或归并排序)来完成。

        选取距离最小的K个实例。这可以直接从排序后的距离列表中获取前K个元素,将他们加入neightbors数组。具体代码实现如下:

def getNeighbors(Dataset, instance, k):
    distances = []
    length = len(instance)-1
    for x in range(len(Dataset)):
        distance = euclideanDistance(instance, Dataset[x], length) //计算点之间的距离
        distances.append((Dataset[x], distance))   //加入distances数组
    distances.sort(key=operator.itemgetter(1))    //对所有的距离进行排序
    neighbors = []
    for x in range(k):   //获取到距离最近的k个点
        neighbors.append(distances[x][0])
        return neighbors

4.确定K个近邻类别的中次数最多的类别

        在KNN算法中,确定K个近邻类别后,我们要选择这K个近邻类别中数量最多的类别作为预测的结果,实现此机制的方法是投票机制。

        对每个K个邻居,计算他们各自的类别分布。例如,如果邻居中有3个属于类别A,2个属于类别B,那么类别A的得票数为3,类别B的得票数为2,随后,选择得票数最多的类别作为预测结果。如果有多个类别得票数相同,那么预测结果可以是这些类别中的任意一个。代码实现如下:

def getClass(neighbors):
    votes = {}
    for x in range(len(neighbors)):
        vote = neighbors[x][-1]
        if vote in votes:
            votes[vote] += 1
        else:
            votes[vote] = 1
      sortedVotes = sorted(votes.items(), key=operator.itemgetter(1), reverse=True)
    return sortedVotes[0][0]   

 


三、总结

KNN算法的优缺点

  1. KNN算法优点

    • KNN算法简单易理解,实现简单,对数据集的要求较低;
    • 能够处理多类问题和多维特征;
    • 对数据的预处理要求较低,例如不需要进行特征选择和参数优化等。
  2. KNN算法缺点

    • 对噪声数据敏感,容易导致分类准确率下降;
    • 需要对数据集进行充分的训练,否则无法得到较好的分类效果;
    • 需要确定K值,如果K值选择不当,会对分类结果产生影响;
    • 在处理大量数据时,效率较低。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值