机器学习02--K近邻算法

所需积分/C币:23 2018-11-08 17:23:08 484KB PDF
收藏 收藏
举报

k近邻法(k-nearest neighbor, k-NN)是1967年年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理理是:存在一个样本数据集合,也称作为训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据 后,将新的数据的每个特征与样本集中数据对应的特征进⾏行行⽐比较,然后算法提取样本最相似数据(最近邻)的分类标签。一般来说,我们只选择样本数据集中前k个最相似的数据,这就是k-近邻算法中k的出处,通常k是不大于20的整数。最后,选择k个最相似数据中出现次数最多的分类,作为新数据的分类。
选取与当前点距离最小的k个点 确定前k个点所在类别的出现频率 返回前k个点所出现频率最高的类别作为当前点的预测分类 比如,现在我这k值取3,那么在电影例子中,按距离依次排序的三个点分别是动作片 (108,5)、动作片(1158)、爱情片(589)。在这三个点中,动作片出现的频率为三分之二,爱情 片出现的频率为三分之一,所以该红色圆点标记的电影为动作片。这个判别过程就是k近邻算 法 准备数据集 Import numpy as np 函数说明:创建数据集 Parameters 无 Returns group-数据集 Labels-分类标签 def createDataset( #四组二维特征 group=np. array([[1,101],[5,891,[108,5],[115,8]]) #四组特征的标签 abels=['爱情片',"爱情片','动作片',"动作片"] return group, labels import numpy as np lmport operator 函数说明:kN算法,分类器 Parameters inⅩ-用于分类的数据(测试集) dataset-用于训练的数据(训练集) labes-分类标签 k-kNN算法参数,选择距离最小的k个点 Returns ortedClass Count[0][0]-分类结果 ullII def classify(inx, dataSet, labels, k): # numpy函数 shape[]返回 dataset的行数 datasetsize dataSet shape [o] #在列向量方向上重复in共1次(横向),行向量方向上重复in共 datasetsize次(纵向 dif fMat np tile(inx, (dataSetsize, 1))-dataSet #二维特征相减后平方 sqDiffMat= diffMat木木2 #sum()所有元素相加,sum(0)列相加,sum(1)行相加 sqDistances sqDif fMat sum(axis=1) #开方,计算出距离 distances sqDistances**0.5 #返回 distances中元素从小到大排序后的索引值 sortedDistIndices distances, argsort( #定一个记录类别次数的字典 classcount =i for i in range (k): #取出前k个元素的类别 voteIlabel labels [sortedDistIndices lilI #dict,get(key, default=None),字典的get()方法,返回指定键的值,如果值不在字典中返 回默认值。 #计算类别次数 class Count [voteIlabell class Count. get(voteIlabel,0)+1 # python3中用 ltems()替换 python2中的 iteritems() #key= operator. itemgetter(1)根据字典的值进行排序 #key= operator, ltemgetter()根据字典的键进行排序 # reverse降序排序字典 sortedclassCount sorted(class Count. items(), key=operator. itemgetter (1),reverse=True) #返回次数最多的类别,即所要分类的类别 return sortedclass Count[0][0] 预测红色圆点标记的电影(101,20)的类别,KNN的k值为3 #创建数据集 group, Labels createDataSet( #测试集 test=[101,20 #kNN分类 test-class classify(test, group, labels, 3) #打印分类结果 print (test_class) 多个特征点,可以用欧氏距离(也称欧几里德度量) a(P,q)=dq,p)=y(g1-p1)2+(-P2)+…+(am1-n2)2 =1∑(a-p blog. csdn. net/c406495762 错误率分类器给出错误结果的次数除以测试执行的总数。错误率是常用的评估方法,主要用 于评估分类器在某个数据集上的执行效果。完美分类器的错误率为0,最差分类器的错误率是 k-近邻算法实战之约会网站配对效果判定 k近邻算法的一般流程 收集数据:可以使用爬虫进行数据的收集,也可以使用第三方提供旳免费或收费的数捃。一般 来讲,数据放在txt文本文件中,按照一定的格式进行存储,便于解析及处理。 准备数据∶使用 Python解析、预处理数据 分析数据:可以使用很多方法对数据进行分析,例如使用 Matplotlib将数据可视化。 测试算法:计算错误率。 使用算法∶错误率在可接受范围内,就可以运行k-近邻算法进行分类。 海伦女士一直使用在线约会网站寻找适合自己的约会对象 她发现自己交往过的人可以进行如下分类 不喜欢的人 魅力一般的人 极具魅力的人 海伦收集约会数据存放在文本文件 dating TestSet. txt 样本数据主要包含以下3种特征: 每年获得的飞行常客里程数 玩视频游戏所消耗时间百分比 每周消费的冰淇淋公升数 import numpy as np 函数说明:打开并解析文件,对数据进行分类:1代表不喜欢,2代表魅力一般,3代表极具魅力 Parameters filename-文件名 Returns returnMat-特征矩阵 classlabelvector-分类 Label向量 def file2matrix(filename): #打开文件 fr= open ( filename) #读取文件所有内容 arrayoLines fr readlines( #得到文件行数 numberofLines len (arrayOLines #返回的 NumPy矩阵,解析完成的数据: numberoflines行,3列 returnMat = np zeros((numberofLines, 3)) #返回的分类标签向量 classLabe lvector =[ #行的索引值 index 0 for line in arrayoLines: #s. strip(rm),当rm空时,默认删除空白符(包括"\n",\r',"\t'," Line= line strip() #使用s, split(str=",num= string,cout(str))将字符串根据"\t分隔符进行切片。 ListFromLine line split(\t) #将数据前三列提取出来,存放到 returnMat的 NumPy矩阵中,也就是特征矩阵 returnMat [index listFromLine [0: 31 #根据文本中标记的喜欢的程度进行分类,1代表不喜欢,2代表魅力一般,3代表极具魅力 if listFromLine[-1 =='didntLike: classLabe lVector append (1) elif listF romIne[-1 = 'smallDoses': classLabe lvector append (2) elif listFromLine[-1]== 'largeDoses': classLabe lvector append (3) index + 1 return returnMat, classlabe lvector #打开的文件名 filename =examples/knn/datingTestSet txt #打丁开并处理数据 datingDataMat, datingLabels file2matrix(filename) print(datingDataMat) print (datingLabels) 分析数据:数据可视化 import matplotlib lines as mines import matplotlib. pyplot as plt mport numpy as np 函数说明:可视化数据 Parameters datingdataMat一特征矩阵 datingLabels-分类 Labe l Returns 无 def showdatas (datingDataMat datingLabe ls) #当ηrov=2, clos=2时,代表千1g画布被分为四个区域,axs[][]表示第一行第一个区域 fig, axs = plt subplots (nrows=2, ncols=2, sharex=False sharey=False, figsize=(13, numberoflabels len datingLabels) Labelscol for i in datinglabels f i abe lsco lors appen ac Labe lsco lors append (orange) Labe ls Colors. append ('red) #画岀散点图,以 datingDataMat短阵的第(飞行常客例程)、第二列(玩游戏)数据画散点数据,散点 大小为15,透明度为0,5 axs [0][0]. scatter(x=datingDataMat [:, 0], y=datingDataMat[:,1l, co lor=Labels Colors, s=15, alpha= 5) #设置标题,x轴abeL,y轴 Label axso-title_text axs[01[0lset- title( ' plane vs game) aso_xlabel_text axs [O] [Ol. set_xlabel('plane') aso_ ylabel_text axs [0][0lset_ ylabel(u'game') plt setp(aso title text, size=9, weight=bold, color=red) plt setp(axs_label_text, size=7, weight='bold', color='black') plt setp( aso ylabel text, size=7, weight=bold, color='black) #画出散点图,以 datingDataMat矩阵的第一(飞行常客例程)、第三列(冰激凌)数据画散点数据,散点 大小为15,透明度为0.5 axs[o] [1]. scatter(x=datingDataMat[:,0l, y=datingDataMat [ 21 co lor=Labe lsColors, S=15, alpha=5) #设置标题,x轴abeL,y轴 Label axs1 title text axs [0][1. set title( 'plane vs ice cream') axs_label_text axs[o][1. set_xlabel(u'plane) axs1 ylabel text axs [0][1], set- ylabel(u'ice cream') plt setp (axsl _title_text size=9, weight=bold, color='red') plt setp(axsl_xlabel_text, size=7, weight=bold, color='black' plt setp(axs1ylabel_text, size=7, weight= bold, color=black) #画岀散点图,以 datingυ ataMan矩阵的第二(玩游戏)、第三列(冰激淩)数据画散点数据,散点大小为 15,透明度为0.5 axs [1][0].scatter(x=datingDataMat[:, 1], y=datingDataMat[:, 2] color=Labelscolors, s=15, alpha= 5) #设置标题,x轴 Labe l,y轴 Labe l axs text axs [l][o.set title(u'game vs ice cream') axs2_xlabel_text axs [1][0]. set_xlabel(u'game') axs ylabel text axs [1][o]. set ylabel(u' ice cream) plt setp(axs_ title_text, size=9, weight=bold, color='red') plt setp(axs2_xlabel text, size=7, weight='bold', color='black) plt setp(axs_ylabel_text, size=7, weight=bold, color='black) #设置图例 didntLike = mines Lined[l, [ CoLor='black' marker= markersize=6, label='didntLike') sma llDoses mines, Line2D([],[, co lor=orange, marker=.' markersize=6, label='smallDoses) largeDoses lines Line2D([], [], color='red, marker='' markersize=6, label='largeDoses #添加图例 axs[o] [0]. legend(handles= ldidntLike, sma llDoses, largeDoses] axs [0][11. legend (handles=[didntLike, smallDoses, largeDoses] axs [1][0]. legend(handles=[didntLike, smallDoses, largeDoses ]) #显示图片 plt show( plane vs ice cream didntLke didntlike smallBones mall doses 1.25 8。 geDoses °日 0.75 4 cUno 20000 AnoDO 60000 800 game vilane cream 智》。 150 1.00 10.7 didntLike cmallDoses largeSt 样本玩游戏所耗时间百分比每年获得的飞行常月里程数每周消费的冰淇淋公升数样本分类 0 0.5 2 12 134000 0.g 3 20000 32000 0.1 2 在处理这种不同取值范围的特征值时,我们通常采用的方法是将数值归一化,如将取值范围处 理为0到1或者-1到1之间。下面的公式可以将任意取值范围的特征值转化为0到1区间内 的值 newValue =(oldvalue-min)/(max-min 函数说明:对数据进行归一化 Parameters dataset-特征矩阵 Returns ormDataset-归一化后的特征矩阵 ranges-数据范围

...展开详情
试读 12P 机器学习02--K近邻算法
立即下载 低至0.43元/次 身份认证VIP会员低至7折
抢沙发
一个资源只可评论一次,评论内容不能少于5个字
  • 签到王者

    累计签到获取,不积跬步,无以至千里,继续坚持!
  • 分享宗师

    成功上传21个资源即可获取
关注 私信 TA的资源
上传资源赚积分,得勋章
最新推荐
机器学习02--K近邻算法 23积分/C币 立即下载
1/12
机器学习02--K近邻算法第1页
机器学习02--K近邻算法第2页
机器学习02--K近邻算法第3页

试读结束, 可继续读1页

23积分/C币 立即下载 >