目录

KNN算法简介

距离的计算

代码实现

运行结果

不同的K值对比实验

实验结果分析

KNN算法优缺点总结


KNN算法简介

K-近邻(K-Nearest Neighbors,简称KNN)是一种基于实例的学习或局部逼近的分类算法。它是一种简单且易于实现的监督学习算法,常用于分类任务。

通俗的讲:我们将通过KNN算法对一个东西进行分类,只需通过判断与之最相近的k个类别里出现频率最多次的,即将这个东西判定为该类别。

距离的计算

我们一般考虑用欧氏距离来计算:

代码实现

以电影爱情片和动作片的分类为例。

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt

def classify0(inX,dataSet,k):
    """
    KNN分类器
    inX:要预测的数据集
    dataSet:训练集
    k:KNN算法的K值,即距离最近的k个点
    返回:
        result:分类结果
    """
    result = []
    #计算欧氏距离
    dist = list((((dataSet.loc[:,['打斗镜头','接吻镜头']] - inX)**2).sum(1))**0.5)  #将得出的欧氏距离列表
    dist_l = pd.DataFrame({
        'dist':dist,
        'labels':(dataSet.loc[:,'电影类型'])
    })
    #按距离列进行升序排列,然后选取距离最小的前k个
    dr = dist_l.sort_values(by='dist')[:k]
    print(dr.head(k))

    #统计前k个点所在类别出现的频率
    r = dr['labels'].value_counts()
    
    result.append(r.index[0])       #预测结果即为r.index[0]
    return result



plt.rcParams['font.sans-serif']=['Simhei']  #显示中文字体 黑体
plt.rcParams['axes.unicode_minus']=False    #显示负号

#创建原始数据集
rowdata = {
    '电影名称':['无问西东','后来的我们','前任3','红海行动','唐人街探案','战狼2','古惑仔','泰坦尼克号','Shameless'],
    '打斗镜头':[1,5,12,108,112,115,120,2,50],
    '接吻镜头':[101,89,97,5,9,8,22,10,110],
    '电影类型':['爱情片','爱情片','爱情片','动作片','动作片','动作片','动作片','爱情片','爱情片']
}
movie_data = pd.DataFrame(rowdata)
print(movie_data.head(10))      #输出表格

# 进行映射
color_mapping = {
    '爱情片': 'orange',
    '动作片': 'blue'
}
movie_data['颜色'] = movie_data['电影类型'].map(color_mapping)  #爱情片橙色,动作片蓝色

#创建画布
plt.figure(figsize=(6,4),dpi = 80)   #dpi-像素

#绘制散点图
plt.scatter(movie_data.打斗镜头,movie_data.接吻镜头,c = movie_data.颜色,marker='*',s=80)
plt.title('电影分类',fontsize = 12)
plt.xlabel('打斗镜头',fontsize = 10)
plt.ylabel('接吻镜头',fontsize = 10)
plt.xlim(0,130)
plt.ylim(0,120)
#测试样本数据
plt.scatter(70,60,c='r',s=100)

plt.show()

#测试函数运行结果
k = 3 
new_data = [70,60]
inX = new_data
dataSet = movie_data
print(classify0(inX,dataSet,k))

运行结果

上图是训练集展示,下图是k值为3时,距离最近的前三个类别和最终判断结果展示

输入的测试数据为new_data = [70,60] ,k = 3。 数据集意为:动作镜头有70处,接吻镜头有60处。

得到散点图:

红点为新的预测点,黄点指爱情片,蓝点指动作片。由图易得:

距离红点(预测点)最近的黄点(爱情片)只有一个,而最近的蓝点(动作片)有两个,所以新的预测数据结果表明,该电影应分类为动作片。

不同的K值对比实验

当k = 1时,距离红点最近的即为黄点(爱情片),所以归为爱情片一类。

当k = 3时,归为动作片一类。

实验结果分析

        可见k值的大小对于分类结果有一定的影响。k值越大,越不容易受异常点的影响,泛化能力也更好,但是k值太大也会导致欠拟合;k值太小又会导致过拟合,容易受异常点的影响,所以k值的取值应当取适当大小,根据具体情况而定。

KNN算法优缺点总结

KNN算法的主要优点包括:1. 简单、直观、易于理解。

                                            2. 无需复杂的模型训练过程,易于实现和调试。

然而,KNN算法也有一些缺点: 1.计算复杂度较高,尤其是在大规模数据集上,需要遍历所有训

练样本以找到最近的k个邻居。

                                                   2. 对参数的选择比较敏感,例如k值的确定需要依赖经验和尝试不同的候选值进行评估。

                                                   3. 对样本特征的缩放敏感,要求输入特征在特征空间中具有一定的可分性。

总的来说,KNN算法是一种非常基础且广泛应用的机器学习算法,适用于分类和回归任务,但需要谨慎处理其缺点以提高性能和准确性。

Logo

魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。

更多推荐