栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > Python

【机器学习实验一】k近邻算法(KNN)

Python 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

【机器学习实验一】k近邻算法(KNN)

【机器学习实验一】k近邻算法(KNN) 一、配置环境


看了很多教程,最终决定安装Anaconda+Pycharm的环境。因为Anaconda中包含了很多库,使用的时候就不用另外手动安装了。而Pycharm作为一款针对Python的编辑器,配置简单,功能强大,使用起来省时省心,对初学者友好,这也是编程验室推荐新手使用Pycharm的原因。

基础安装教程大家可参考:​Python环境的安装(Anaconda+Jupyter notebook+Pycharm) - 知乎
如果大家决定安装Anaconda+Pycharm的环境,推荐大家参考这个博主的安装教程,会更具体:Python+Anaconda+PyCharm的安装和基本使用【适合完全零基础】不只是教你如何安装,还告诉你为什么这么安装_哔哩哔哩_bilibili

二、KNN算法 1.算法简介

最近邻 (k-Nearest Neighbors, KNN) 算法是一种分类算法, 1968年由 Cover和 Hart 提出, 应用场景有字符识别、 文本分类、 图像识别等领域。

2.算法思想

给定测试样本,基于某种距离度量找出在训练集中与其最靠近的k个“邻居”的信息来进行预测。通常,在分类任务中可使用“投票法”,即选择这k个样本中出现最多的类别标记作为预测结果;在回归任务中可使用“平均法”,即将这k个样本的实值输出标记的平均值作为预测结果;还可基于距离远近进行加权平均或者加权投票,距离越近的样本权重越大。

3. 算法的一般流程

1、收集数据:可以使用任何方法。
2、准备数据:距离计算所需要的数值,最好是结构化的数据格式。
3、分析数据:可以使用任何方法。
4、训练算法:此步骤不适用于 K 近邻算法。
5、测试算法:计算错误率。
6、使用算法:首先需要输入样本数据和结构化的输出结果,然后运行K 近邻算法判定输入数据分别属于哪个分类,最后应用对计算出的分类执行后续的处理。

三、从电影分类了解KNN算法

电影可以按照题材分类,那么如何区分 动作片 和 爱情片 呢?

动作片:打斗次数更多
爱情片:亲吻次数更多
基于电影中的亲吻、打斗出现的次数,使用 k-近邻算法构造程序,就可以自动划分电影的题材类型。

现在根据上面我们得到的样本集中所有电影与未知电影的距离,按照距离递增排序,可以找到 k 个距离最近的电影。
假定 k=3,则三个最靠近的电影依次是, He’s Not Really into Dudes 、 Beautiful Woman 和 California Man。
knn 算法按照距离最近的三部电影的类型,决定未知电影的类型,而这三部电影全是爱情片,因此我们判定未知电影是爱情片。

代码实现 准备:使用Python导入数据

首先创建一个KNN.py文件,在文件中输入以下代码,代码中,我们导入了两个模块:第一个是科学计算包NumPy;第二个是运算符模块:

from numpy import *
import operator
def createDataSet():
        group = array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]])
        labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片']
        return group,labels


这里有六组数据,每组数据有两个我们已知的属性以及特征值。现在我们已经知道Python如何解析数据,如何加载数据,以及kNN算法的工作原理,接下来我们将使用这些方法完成分类任务。

实施KNN算法

对未知类别属性的数据集中的每个点依次执行以下操作:
(1) 计算已知类别数据集中的点与当前点之间的距离;
(2) 按照距离递增次序排序;
(3) 选取与当前点距离最小的k个点;
(4) 确定前k个点所在类别的出现次数;
(5) 返回前k个点出现次数最多的类别作为当前点的预测分类。
代码实现如下:

def calssify0(inX,dataSet,labels,k): #inX为未知类别的新样本,datSet为训练集,labels为训练集的类别标签集合,k为选择距离最近的训练样本的数量
    dataSetSize=dataSet.shape[0] #shape[0]会返回数组的行数,shape[1]返回列数
    diffMat=numpy.tile(inX,(dataSetSize,1))-dataSet #tile解释参考https://www.jianshu.com/p/9519f1984c70,diffMat数组的每列表示新样本的各列特征值与训练集各列特征值之差 
    sqDiffMat=diffMat**2
    sqDistances=sqDiffMat.sum(axis=1) #按列求和
    distances=sqDistances**0.5 #平方求和再开方得到最后距离
    sortedDistIndicies=distances.argsort() #按照距离远近进行排序,默认为升序,返回相应距离数值对应的位置索引,argsort()函数解释参照https://blog.csdn.net/dz4543/article/details/80219115
    classCount={} #创建一个新字典
    for i in range(k):
        voteIlabel=labels[sortedDistIndicies[i]] #得到第i个训练样本的类别标签
        classCount[voteIlabel]=classCount.get(voteIlabel,0)+1 #统计离新样本距离最近的k个训练样本中的类别标签数量。get()函数解释参考https://www.runoob.com/python/att-dictionary-get.html
    sortclassCount=sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) 
return sortclassCount[0][0] 
三、总结

优点:
1、简单有效
2、重新训练代价低
3、算法复杂度低
4、适合类域交叉样本
5、适用大样本自动分类

缺点:
1、惰性学习
2、类别分类不标准化
3、输出可解释性不强
4、不均衡性
5、计算量较大

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/286227.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号