您好,欢迎光临本网站![请登录][注册会员]  
文件名称: 菊安酱的机器学习第1期-k-近邻算法(直播).pdf
  所属分类: 讲义
  开发工具:
  文件大小: 847kb
  下载次数: 0
  上传时间: 2019-07-27
  提 供 者: qiu144*******
 详细说明:k-近邻算法的课件。来自于菊安酱的机器学习实战12期的免费教程。内涵python源码。菊安酱的直播间: 我们已经知道k近邻算法的工作原理,根据特征比较,然后提取样本集中特征最相似数据(最近邻)的分类标签。 那么如何进行比较呢?比如表1中新出的电影,我们该如何判断他所属的电影类别呢?如图2所示。 电影分类 120 爱情片(1,101) 爱情片(12,97) 80 爱情片(5,89) 水弊 60 ?(24,67) 动作片(112,9 20 动作片(1158) 动作片(108,5) 0 20 60 80 100 120 140 打斗镜头 图2电影分类 我们可以从散点图中大致推断,这个未知电影有可能是爱情片,因为看起来距离已知的三个爱情片更近一点。k-近 邻算法是用什么方法进行判断呢?没错,就是距离度量。这个电影分类例子中有两个特征,也就是在二维平面中计 算两点之间的距离,就可以用我们高中学过的距离计算公式 AB=y(x1-2)2+(v-v)2 如果是多个特征扩展到N维空间,怎么计算?没错,我们可以使用欧氏距离(也称欧几里得度量),如下所示 da,y)=y1-m2+(a2-m)+…+(an-m)2=1(a= 通过计算可以得到训练集中所有电影与未知电影的距离,如表2所示 电影名称 与未知电影的距离 无问西东 41.0 后来的我们 29.1 前任3 32.3 红海行动 104.4 唐人街探案 1054 战狼2 108.5 表2与未知电影的距离计算结果 菊安酱 菊安酱的直播间: 通过表2的计算结果,我们可以知道绿点标记的电影到爱情片《后来的我们》距离最近,为29.1。如果仅仅根据这 个结果,判定绿点电影的类别为爱情片,这个算法叫做最近邻算法,而非κ-近邻算法。k近邻算法步骤如下: (1)计算已知类别数据集中的点与当前点之间的距离; (2)按照距离递增次序排序 3)选取与当前点距离最小的k个点; 4)确定前k个点所在类别的出现频率; (5)返回前k个点出现频率最高的类别作为当前点的预测类别。 比如,现在K=4,那么在这个电影例子中,把距离按照升序排列,距离绿点电影最近的前4个的电影分别是《后来 的我们》、《前任3》、《无问西东》和《红海行动》,这四部电影的类别统计为爱情片动作片=3:1,出现频率最 高的类别为爱情片,所以在k=4时,绿点电影的类别为爱情片。这个判别过程就是k近邻算法 二、k近邻算法的 Python实现 在了解k近邻算法的原理及实施步骤之后,我们用 python将这些过程实现。 1.算法实现 11构建已经分类好的原始数据集 为了方便验证;这里使用 python的字典dict构建数据集,然后再将其转化成 Dataframe格式。 import pandas as pd rodata={'电影名称':['无问西东','后来的我们’,前任3′,"红海行动',唐人街探案','战狼2'], 打斗镜头':[1,5,12,108,112,115], 接吻镜头":[101,89,97,5,9,8], 电影类型':['爱情片',爱情片',爱情片',"动作片',动作片',"动作片'] movie_data- pd DataFrame crowdata) movie data 2计算已知类别数据集中的点与当前点之间的距离 new_data = [24, 671 dist= list((((movie_data iloc[: 6, 1: 3]-new_data)**2) sum(1)**0. 5) dist 3.将距离升序排列,然后选取距离最小的k个点 dist 1= pd DataFrame(i dist: dist, labels:(movie_data iloc[: 6, 31)3) dr dist_I sort_values (by =dist)[: 4] 4.确定前k个点所在类别的出现频率 re= drloc[:, 'labels] value_counts o 菊安酱 菊安酱的直播间: 5选择频率最高的类别作为当前点的预测类别 result suIt. append(re index [o]) result 2.封装函数 完整的流程已经实现了,下面我们需要将这些步骤封装成函数,方便我们后续的调用 import pandas as pd 函数功能:KNN分类器 参数说明 new data:需要预测分类的数据集 dataset:已知分类标签的数据集(训练集) k:k-近邻算法参数,选择距离最小的k个点 返回: result:分类结果 111 11 def classify(inx, dataSet, k) result=[ dist list((((dataset iloc[:, 1: 3]-inx**2) sum (1))**0.5) dist_l= pd. DataFramedi'dist': dist, labels (dataset iloc[:, 3]1 dr= dist_l sort_values (by =dist)[: k] re= dr loc[:, labels] value_counts o result. append cre index [o]) ult 测试函数运行结果 inx new data dataset movie data classify(inx, dataset, k) 这就是我们使用κ-近邻算法构建的一个分类器,根据我们的“经验可以看出,分类器给的答案还是比较符合我们的 预期的 学习到这里,有人可能会问:“分类器何种情况下会出错?“或者分类器给出的答案是否永远都正确?‘答案一定是 否定的,分类器并不会得到百分百正确的结果,我们可以使用很多种方法来验证分类器的准确率。此外,分类器的 性能也会受到很多因素的影响,比如k的取值就在很大程度上影响了分类器的预测结果,还有分类器的设置、原始 数据集等等。为了测试分类器的效果,我们可以把原始数据集分为两部分,一部分用来训练算法(称为训练集) 部分用来测试算法的准确率(称为测试集)。同时,我们不难发现,k近邻算法没有进行数据的训练,直接使用 未知的数据与已知的数据进行比较,得到结果。因此,可以说,k-近邻算法不具有显式的学习过程。 三、k近邻算法之约会网站配对效果判定 菊安酱 菊安酱的直播间: 海伦一直使用在线约会网站寻找适合自己的约会对象,尽管约会网站会推荐不同的人选,但她并不是每一个都喜 欢,经过一番总结,她发现曾经交往的对象可以分为三类 不喜欢的人 魅力一般的人 极具魅力得人 海伦收集约会数据已经有了一段时间,她把这些数据存放在文本文件 dating TestSet. txti中,其中各字段分别为 1.每年飞行常客里程 2.玩游戏视频所占时间比 3.每周消费冰淇淋公升数 1准备数据 datingTest pd read_table('datingTestset. txt, header=None) datingTest head datingTest shape datingTest info 2.分析数据 使用 Matplotlib创建散点图,查看各数据的分布情况 %matplotlib inline import matplotlib as mpl import matplotlib pyp lot as plt #把不同标签用颜色区分 Colors= L for i in range(datingTest shape [o]) m= datingTest iloc[i, -1 if mes didntlike' Colors. append('black) if m=='smallDoses Colors. append (orange') if m=='largedoses Colors. append(red ') #绘制两两特征之间的散点图 plt. params[font.sans- serif’]=[' simmel’]#图中字体设置为黑体 pl=plt figure(figsize=(12, 8)) figl-=pl. add_subplot(221) plt scatter (datingTest iloc[:,1], datingTest iloc[:, 2], marker=.',C=Colors) plt. xlabel('玩游戏视频所占时间比") plt. ylabel('每周消费冰淇淋公升数") fig2=pl. add_subp lot(222) pIt scatter(datingTest iloc[:,O], datingTest iloc[:, 1], marker=., C=Colors) plt.X1abel(每年飞行常客里程") 菊安酱 菊安酱的直播间: plt. y l("玩游戏视频所占时间比") fig3=pl. add_subplot(223) pIt scatter(datingTestiloc[:, o], datingTest iloc[:, 2], marker=., C=Colors plt.x1abe1('每年飞行常客里程') plt. y labe1('每周消费冰淇淋公升数") pIt show O) 3.数据归一化 下表是提取的4条样本数据,如果我们想要计算样本1和样本2之间的距离,可以使用欧几里得计算公式 (40920-144882+(8.3-7.2)2+(1.0-1.7) 序号每年飞行常客里程玩游戏视频所占时间比 每周消费冰淇淋公升数 分类 40920 8.3 1.0 largeDoses 2 14488 7,2 1.7 smallDoses 26052 1.4 0.8 didntLike 75136 13.1 0.4 didntlike 表34条样本数据 我们很容易发现,上面公式中差值最大的属性对计算结果的影响最大,也就是说每年飞行常客里程对计算结果的影 响远远大于其他两个特征,原因仅仅是因为它的数值比较大,但是在海伦看来这三个特征是同等重要的,所以接下 来我们要进行数值归一化的处理,使得这三个特征的权重相等。 数据归化的处理方法有很多种,比如0-1标准化、z- score标准化、 Sigmoid压缩法等等,在这里我们使用最简单 的0-1标准化,公式如下 Min Mar- Min 函数功能:归一化 参数说明: dataset:原始数据集 返回:0-1标准化之后的数据集 111 11 def minmax(dataset) minDf= dataset. mino maxDf dataset. max o normset =(dataset- minDf )/(maxDf-minDf return normset 将我们的数据集带入函数,进行归一化处理 菊安酱 菊安酱的直播间: dating pd concat([minmax(datingTest iloc[,: 31), datingTest iloc[:, 3]], axis=1) dating gT. head 4.划分训练集和测试集 前面概述部分我们有提到,为了测试分类器的效果,我们可以把原始数据集分为训练集和测试集两部分,训练集用 来训练模型,测试集用来验证模型准确率。 关于训练集和测试集的切分函数,网上一搜一大堆, Scikit learn官网上也有相应的函数比如 model selection类中 的 train_test_ split函数也可以完成训练集和测试集的切分。 通常来说,我们只提供已有数据的90%作为训练样本来训练模型,其余10%的数据用来测试模型。这里需要注意的 10%的测试数据一定要是随机选择岀来的,由于海伦提供的数据并没有按照特定的目的来排序,所以我们这里可以 随意选择10%的数据而不影响其陌机性 函数功能:切分训练集和测试集 参数说明 dataset:原始数据集 rate:训练集所占比例 返回:切分好的训练集和测试集 def randsplit(dataset, rate=0. 9): n dataSet shape [o] int Cn rate) train= dataset iloc[: m, 1 test dataset iloc [m:,: I test index range Ctest shape [o]) return train. test train, test randsplit(dating) train test 5.分类器针对于约会网站的测试代码 接下来,我们一起来构建针对于这个约会网站数据的分类器,上面我们已经将原始数据集进行归一化处理然后也切 分了训陈练集和测试集,所以我们的函数的输入参数就可以是tain、test和k(k近邻算法的参数,也就是选择的距离 最小的k个点) 函数功能:k-近邻算法分类器 参数说明 训练集 test:测试集 k:k-近邻参数,即选择距离最小的k个点 返回:预测好分类的测试集 菊安酱 菊安酱的直播间: def datingclass(train, test, k) n= train shape[l]-1 test shape [o] result= for i in range〔m dist= list((((train iloc[:, : n]- test iloc[i, n] * 2). sum(1))**5) dist_1= pd DataFrame (i 'dist: dist, 'labels:(trainiloc[:, n]))) dr =dist_l sort values(by ='dist)[: k] re= dr loc[:,labels ].value_counts O result. append (re index [o]) result= pd Series (result) test[ predict ] result acc =(test iloc[:,-1]==test iloc[:,-2]).meanO) print(f'模型预测准确率为{acC}") return test 最后,测试上述代码能否正常运行,使用上面生成的测试集和训练集来导入分类器函数之中,然后执行并查看分类 结果。 datingclass(train, test, 5 从结果可以看出,我们模型的准确率还不错,这是一个不错的结果了 四、算法总结 k近邻 算法功能分类(核心),回归 算法类型有监督学习-惰性学习,距离类模型 包含数据标签y,且特征空间中至少包含k个训练样本(k>=1) 数据输入特征空间中各个特征的量纲需统一,若不统一则需要进行归一化处理 自定义的超参数k(k>=1) 在KNN分类中,输出是标签中的某个类别 模型输出在KN回归中,输出是对象的属性值,该值是距离输入的数据最近的k个训练样本标签的平均值 1.优点 简单好用,容易理解,精度高,理论成熟,既可以用来做分类也可以用来做回归 可用于数值型数据和离散型数据 无数据输入假定 ·适合对稀有事件进行分类 2.缺点 计算复杂性高;空间复杂性髙; 计算量太大,所以一般数值很大的时候不用这个,但是单个样本又不能太少,否则容易发生误分 菊安酱 菊安酱的直播间: 样本不平衡问题(即有些类别的样本数量很多,而其它样本的数量很少) ·可理解性比较差,无法给出数据的内在含义 其他 那发的门12知,人 入菊安酱的直播间观看直播 如有问题,可以给我留言哦 菊安酱
(系统自动生成,下载前可以参看下载内容)

下载文件列表

相关说明

  • 本站资源为会员上传分享交流与学习,如有侵犯您的权益,请联系我们删除.
  • 本站是交换下载平台,提供交流渠道,下载内容来自于网络,除下载问题外,其它问题请自行百度
  • 本站已设置防盗链,请勿用迅雷、QQ旋风等多线程下载软件下载资源,下载后用WinRAR最新版进行解压.
  • 如果您发现内容无法下载,请稍后再次尝试;或者到消费记录里找到下载记录反馈给我们.
  • 下载后发现下载的内容跟说明不相乎,请到消费记录里找到下载记录反馈给我们,经确认后退回积分.
  • 如下载前有疑问,可以通过点击"提供者"的名字,查看对方的联系方式,联系对方咨询.
 输入关键字,在本站1000多万海量源码库中尽情搜索: