机器学习之k近邻算法

 一、概述

1. KNN算法介绍

KNN算法又叫做K近邻算法,是众多机器学习算法里面最基础入门的算法。KNN算法是最简单的分类算法之一,同时,它也是最常用的分类算法之一。KNN算法是有监督学习中的分类算法,它看起来和Kmeans相似(Kmeans是无监督学习算法),但却是有本质区别的。

KNN算法基于实例之间的相似性进行分类或回归预测。在KNN算法中,要解决的问题是将新的数据点分配给已知类别中的某一类。该算法的核心思想是通过比较距离来确定最近邻的数据点,然后利用这些邻居的类别信息来决定待分类数据点的类别。其核心思想为:“近朱者赤近墨者黑”

 2.实现步骤

 KNN分类算法包括以下4个步骤:
①准备数据,对数据进行预处理
②计算测试样本点(也就是待分类点)到其他每个样本点的距离 。
③对每个距离进行排序,然后选择出距离最小的K个点。
④对K个点所属的类别进行比较,根据少数服从多数的原则,将测试样本点归入在K个点中占比最高的那一类。

 3.KNN算法三要素

    距离度量算法:一般使用的是欧氏距离。也可以使用其他距离:曼哈顿距离、切比雪夫距离、闵可夫斯基距离等。
    k值的确定:k值越小,模型整体变得越复杂,越容易过拟合。通常使用交叉验证法来选取最优k值
    分类决策:一般使用多数表决,即在 k 个临近的训练点钟的多数类决定输入实例的类。可以证明,多数表决规则等价于经验风险最小化

二、实例

 通过电影场景里面的打斗镜头次数与接吻镜头次数的比较然后根据KNN算法来进行判断该电影的类型是动作片还是爱情片

代码:

import collections
import numpy as np


def createDataSet():
    # 四组二维特征
    group = np.array([[104, 3], [100, 2], [81, 1], [10, 101], [5, 99], [2, 98]])
    # 四组特征的标签
    labels = ['爱情片', '爱情片', '爱情片', '动作片', '动作片', '动作片']
    return group, labels


def classify(inx, dataset, labels, k):
    # 计算距离  其实就是计算点一定之间的距离
    dist = np.sum((inx - dataset) ** 2, axis=1) ** 0.5
    # k个最近的标签
    # dist.argsort 将x中的元素从小到大排列,提取其对应的index(索引)
    k_labels = [labels[index] for index in dist.argsort()[0: k]]
    label = collections.Counter(k_labels).most_common(1)[0][0]
    return label


if __name__ == '__main__':
    # 创建数据集
    group, labels = createDataSet()
    # 测试集
    test = [10,100 ]
    test_class = classify(test, group, labels, 5)
    # 打印分类结果
    print('最终判定的影片类型:', test_class)

结果展示:

三、结论 

KNN算法的优势和劣势
了解KNN算法的优势和劣势,可以帮助我们在选择学习算法的时候做出更加明智的决定。那我们就来看看KNN算法都有哪些优势以及其缺陷所在!

KNN算法优点

1.简单易用,相比其他算法,KNN算是比较简洁明了的算法。即使没有很高的数学基础也能搞清楚它的原理。
2.模型训练时间快,上面说到KNN算法是惰性的,这里也就不再过多讲述。
3.预测效果好。
4.对异常值不敏感
KNN算法缺点

1.对内存要求较高,因为该算法存储了所有训练数据
2.预测阶段可能很慢
3.对不相关的功能和数据规模敏感

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值