k 您所在的位置:网站首页 分析k近邻算法错误率 k

k

2024-05-09 04:53| 来源: 网络整理| 查看: 265

一、knn算法步骤:

a:有一堆已知结果的数据样本(训练集);

b:输入测试数据集T;

C:计算T与训练集的每一个数据之间的距离;

d:根据上述计算出的距离进行排序(升序/降序);

e:计算前k个点所在类别的出现频率;

f:返回前k个点出现频率最高的类别作为T的预测分类;

在其基础上需要测试测试集的错误率、准确率,以用来判断我们学习器的效果。对于学习其的效果判断可以采用PR、ROC来进行判断。

表1 每部电影的打斗镜头数、接吻镜头数以及电影评估类型

电影名称打斗镜头接吻镜头电影类型California Man3104爱情片He's Not Really into Dudes2100爱情片Beautiful Woman181爱情片Kevin Longblade10110动作片Robo Slayer 3000995动作片Amped II982动作片?1890未知

根据上述的表格对未知电影的类型进行分类,由knn的算法步骤计算出他们与未知电影的距离,采用欧式距离,计算所得距离如下表2:

表2 已知电影与未知电影的距离

电影名称与未知电影的距离California Man20.5He's Not Really into Dudes18.7Beautiful Woman19.2Kevin Longblade115.3Robo Slayer 3000117.4Amped II118.9

现在得到样本集当中所有与未知电影的距离,按照距离进行递增排序,根据k-近邻的思想,选择最近的k个距离,假设k=3,则由上可知三个最靠近的电影依次是He's Not Really into Dudes、Beautiful Woman、California Man。k-近邻通过按照距离未知电影最近的k部电影的类型决定未知电影的类型,从表一可知这三部电影全部属于爱情片,故未知电影属于爱情片。

如果在取的k部电影当中有不同类型的电影,我们采用比例最大的类型作为未知电影的类型。从而,k-近邻的思想是取距离未知电影最近的电影当中所占比例最多的类型,所以从数学的思想来说属于一种逼近思想!

上述电影的分类python代码如下:

import numpy as npimport operator

"""函数说明:创建数据集

Parameters: 无Returns: group - 数据集 labels - 分类标签Modify: 2020-10-15"""def createDataSet(): #6组二维特征 group = np.array([[3,104],[2,100],[1,81],[101,10],[99,5],[98,2]]) #6组特征的标签 labels = ['爱情片','爱情片','爱情片','动作片','动作片','动作片'] return group, labels

"""函数说明:kNN算法,分类器

Parameters: inX - 用于分类的数据(测试集) dataSet - 用于训练的数据(训练集) labes - 分类标签 k - kNN算法参数,选择距离最小的k个点Returns: sortedClassCount[0][0] - 分类结果

Modify: 2020-10-15"""def classify0(inX, dataSet, labels, k): #numpy函数shape[0]返回dataSet的行数 dataSetSize = dataSet.shape[0] #在列向量方向上重复inX共1次(横向),行向量方向上重复inX共dataSetSize次(纵向) diffMat = np.tile(inX, (dataSetSize, 1)) - dataSet #二维特征相减后平方 sqDiffMat = diffMat**2 #sum()所有元素相加,sum(0)列相加,sum(1)行相加 sqDistances = sqDiffMat.sum(axis=1) #开方,计算出距离,定义欧氏距离 distances = sqDistances**0.5 #返回distances中元素从小到大排序后的索引值 sortedDistIndices = distances.argsort() #定一个记录类别次数的字典 classCount = {} for i in range(k): #取出前k个元素的类别 voteIlabel = labels[sortedDistIndices[i]] #dict.get(key,default=None),字典的get()方法,返回指定键的值,如果值不在字典中返回默认值。 #计算类别次数 classCount[voteIlabel] = classCount.get(voteIlabel,0) + 1 #python3中用items()替换python2中的iteritems() #key=operator.itemgetter(1)根据字典的值进行排序 #key=operator.itemgetter(0)根据字典的键进行排序 #reverse降序排序字典 sortedClassCount = sorted(classCount.items(),key=operator.itemgetter(1),reverse=True) #返回次数最多的类别,即所要分类的类别 return sortedClassCount[0][0]

if __name__ == '__main__': #创建数据集 group, labels = createDataSet() #测试集 test = [18,90] #kNN分类 test_class = classify0(test, group, labels, 3) #打印分类结果 print(test_class)

输出结果:爱情片

你可以根据自己的喜欢改变电影的名称,注意这里的距离采用的欧氏距离进行。感兴趣的可以采用matlab进行编程knn算法,看两者之间谁的代码更少,可读性更好!

欢迎关注知乎,评论交流算法学习!



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

    专题文章
      CopyRight 2018-2019 实验室设备网 版权所有