机器学习算法-KNN(一)

本文介绍了KNN算法的基本原理,包括如何使用欧式距离找到测试样本的K个最近邻居,并据此进行分类。同时探讨了KNN算法的优点如易于实现及无需估计参数等,也指出了其缺点如计算量大和内存开销等问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1、KNN分类算法原理

        KNN(K-Nearest-Neighbors Classification),从字面意思上理解就是一种近邻算法,因此又被称为K近邻算法。其算法的本质就是,寻找所有训练样本中与该测试样本“距离”最近的前K个样本,然后看这K个样本大部分属于哪一类,那么就认为这个测试样本也属于哪一类。这里说的“距离”是指欧式距离。

                                    

       我们通过下面这张图来详细解释:

   

       假设,有以上红蓝绿三种已经知道分类情况的数据,然后当数据X进入这个数据集的时候,分别求出X与每个数据的距离,然后挑选出其中最近几组的距离,然后看与X距离最近的数据分别属于哪一类,然后依照少数服从多数的原则给新的数据分类。

2、KNN算法的优缺点

        1、优点:简单、易于实现、无需估计参数、无需训练。

      2、缺点:对测试样本分类时的计算量大,内存开销大,评分慢,可解释性差,无法给出决策树那样的规则

3、常见问题

      1、K值的设定

      2、类别如何判定

      3、训练样本是否要一视同仁

      4、性能问题

4、最简单的实例-Python实现

         接下来我们通过一个实例来练习一下。

#coding:utf-8

from numpy import *
import operator

#定义训练数据
def creatDataSet():
    group = array([[1.0,2.0],[1.2,0.1],[0.1,1.4],[0.3,3.5]])
    labels = ['A','A','B','B']
    return group,labels

#分类
def classify(input,dataSet,label,k):
    
    dataSize = dataSet.shape[0]

    ###计算欧式距离
    diff = tile(input,(dataSize,1))-dataSet
    sqdiff = diff ** 2
    squareDist = sum(sqdiff, axis = 1)
    dist = squareDist ** 0.5

    #对距离进行排序
    sortedDistIndex = argsort(dist)  
    #argsort根据元素的值从大到小对元素进行排序,返回下标

    classCount = {}
    for i in xrange(k):
        voteLabel = label[sortedDistIndex[i]]
        #对选取的k个样本所属的类别个数进行统计
        classCount[voteLabel] = classCount.get(voteLabel,0) + 1

    #选取出现的类别次数做多的类别
    maxCount = 0
    for key,value in classCount.items():
        if value > maxCount:
            maxCount = value
            classes = key

    return classes

执行过程


>>> import sys
>>> sys.path.append("/home/ts/PycharmProjects/KNN")
>>> import knn
>>> from numpy import *
>>> dataSet,labels = knn.creatDataSet()
>>> input = array([1.1,0.3])
>>> k =3
>>> output = knn.classify(input,dataSet,labels,k)
>>> print(input,output)
(array([ 1.1,  0.3]), 'A')


### 关于头歌平台中KNN算法机器学习教程与实例 #### 头歌平台概述 头歌(Tougo)是个专注于计算机科学教育的学习平台,提供丰富的在线课程资源和实践环境。对于机器学习领域的内容,尤其是像KNN这样经典的算法,通常会通过理论讲解、代码实现以及实际应用案例相结合的方式进行教学。 #### KNN算法简介 KNN(K-Nearest Neighbors)是种基于实例的学习方法,既可用于分类也可用于回归分析。其核心思想是:给定个测试样本,在训练集中找到与其最近的K个邻居,并依据这K个邻居的信息来进行决策[^2]。 #### KNN算法的主要步骤 1. 数据预处理阶段,包括标准化或归化操作以消除不同特征间量纲差异的影响。 2. 计算待测样本到所有已知样本的距离,常用欧氏距离或其他形式的距离度量方式。 3. 找出距离最小的前K个样本作为近邻点集合。 4. 对于分类任务采用投票机制决定最终类别;而对于回归任务则取平均值或者加权平均值得出结果。 #### 距离计算公式示例 以下是两种常见距离公式的Python实现: ```python import numpy as np def euclidean_distance(x, y): """欧几里得距离""" return np.sqrt(np.sum((np.array(x) - np.array(y)) ** 2)) def manhattan_distance(x, y): """曼哈顿距离""" return np.sum(abs(np.array(x) - np.array(y))) ``` 上述函数分别实现了欧氏距离和曼哈顿距离的计算过程。 #### 实际应用场景举例 假设我们有个简单的电影分类场景,其中每部影片由两个属性描述:“拥抱次数”和“打斗次数”。利用已有标注的数据集可以构建模型并预测未知标签的新样例所属类型[^4]。 #### 可能存在的挑战及优化方向 尽管KNN易于理解和实现,但在大规模数据集上的性能可能较差,因为每次都需要遍历整个数据库寻找最接近的邻居。因此可以通过KD树索引结构加速查询效率,或是引入降维技术减少维度灾难带来的影响[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值