968深圳网站建设公司,58同城官网,网站建设设计说明书,学校网站建设价格明细表目录 一、实验目的
二、实验的软、硬件平台
三、实验内容概述
四、实验设计方案
五、实验内容 一、实验目的
通过本实验掌握kNN算法的原理#xff0c;熟悉kNN算法。
二、实验的软、硬件平台
python 3.6.5
CourseGrading在线实验环境
三、实验内容概述
1.kNN算法简介…目录 一、实验目的
二、实验的软、硬件平台
三、实验内容概述
四、实验设计方案
五、实验内容 一、实验目的
通过本实验掌握kNN算法的原理熟悉kNN算法。
二、实验的软、硬件平台
python 3.6.5
CourseGrading在线实验环境
三、实验内容概述
1.kNN算法简介
k近邻法(k-nearest neighbor, kNN)是1967年由Cover T和Hart P提出的一种基本分类与回归方法。它的工作原理是存在一个样本数据集合也称作为训练样本集并且样本集中每个数据都存在标签即我们知道样本集中每一个数据与所属分类的对应关系。输入没有标签的新数据后将新的数据的每个特征与样本集中数据对应的特征进行比较然后算法提取样本最相似数据(最近邻)的分类标签。一般来说我们只选择样本数据集中前k个最相似的数据这就是k-近邻算法中k的出处通常k是不大于20的整数。最后选择k个最相似数据中出现次数最多的分类作为新数据的分类。 所谓K最近邻就是k个最近的邻居的意思说的是每个样本都可以用它最接近的k个邻居来代表。kNN算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别则该样本也属于这个类别并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 kNN方法在类别决策时只与极少量的相邻样本有关。由于kNN方法主要靠周围有限的邻近的样本而不是靠判别类域的方法来确定所属类别的因此对于类域的交叉或重叠较多的待分样本集来说kNN方法较其他方法更为适合 上图中绿色圆要被决定赋予哪个类是红色三角形还是蓝色四方形如果K3由于红色三角形所占比例为2/3绿色圆将被赋予红色三角形那个类如果K5由于蓝色四方形比例为3/5因此绿色圆被赋予蓝色四方形类。
K最近邻(k-Nearest NeighborKNN)分类算法是一个理论上比较成熟的方法也是最简单的机器学习算法之一。该方法的思路是如果一个样本在特征空间中的k个最相似(即特征空间中最邻近)的样本中的大多数属于某一个类别则该样本也属于这个类别。KNN算法中所选择的邻居都是已经正确分类的对象。该方法在定类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。 KNN方法虽然从原理上也依赖于极限定理但在类别决策时只与极少量的相邻样本有关。由于KNN方法主要靠周围有限的邻近的样本而不是靠判别类域的方法来确定所属类别的因此对于类域的交叉或重叠较多的待分样本集来说KNN方法较其他方法更为适合。
KNN算法不仅可以用于分类还可以用于回归。通过找出一个样本的k个最近邻居将这些邻居的属性的平均值赋给该样本就可以得到该样本的属性。更有用的方法是将不同距离的邻居对该样本产生的影响给予不同的权值(weight)如权值与距离成反比。
2.kNN计算流程
计算已知类别数据集中的点与当前点之间的距离
按照距离递增次序排序
选取与当前点距离最小的k个点
确定前k个点所在类别的出现频率
返回前k个点所出现频率最高的类别作为当前点的预测分类。
根据上述流程实现KNN核心算法
四、实验设计方案
如前所述kNN算法流程如下
a.计算已知类别数据集中的点与当前点之间的距离
b.按照距离递增次序排序
c.选取与当前点距离最小的k个点
d.确定前k个点所在类别的出现频率
e.返回前k个点所出现频率最高的类别作为当前点的预测分类。
在kNN.py中添加一个函数classify0作为kNN算法的核心函数该函数的完整形式为
def classify0(inX, dataSet, labels, k):
其中各个参数的含义如下
inX - 用于要进行分类判别的数据(来自测试集)
dataSet - 用于训练的数据(训练集)
lables - 分类标签
k - kNN算法参数,选择距离最小的k个点
在上述参数列表中dataSet为所有训练数据的集合也就是表示所有已知类别数据集中的所有点dataSet为一个矩阵其中每一行表示已知类别数据集中的一个点。inX为一个向量表示当前要判别分类的点。按照上述算法流程我们首先应该计算inX这个要判别分类的点到dataSet中每个点之间的距离。dataSet中每个点也是用一个向量表示的点与点之间的距离怎么计算呢没错就是求两向量之间的距离数学上我们知道有很多距离计算公式包括但不限于
欧氏距离
曼哈顿距离
切比雪夫距离
闵可夫斯基距离
标准化欧氏距离
马氏距离
夹角余弦
汉明距离
杰卡德距离 杰卡德相似系数
信息熵
这里我们选择最简单的欧式距离计算方法。设p和q为两向量则两向量间的欧氏距离为 在算法流程输入参数含义以及距离计算公式都明确了以后按照kNN算法的流程我们就可以实现kNN算法了。
五、实验内容
1、KNN算法原理介绍
K-最近邻K-Nearest NeighborsKNN算法是一种基于距离的简单而有效的分类和回归方法。KNN算法的核心思想是如果一个样本在特征空间中的K个最相似即K个最近邻的样本中的大多数属于某个类别则该样本也很可能属于这个类别。
2、操作步骤详细描述
计算已知类别数据集中的点与当前点之间的距离
按照距离递增次序排序
选取与当前点距离最小的k个点
确定前k个点所在类别的出现频率
返回前k个点所出现频率最高的类别作为当前点的预测分类。
import numpy as np
import sysdef classify0(inX,dataSet,labels,k):num len(dataSet)nnum-1ansnp.asarray(inX)tmpnp.asarray(inX)while n!0:ans np.append(ans,tmp)n-1ans np.reshape(ans,[num,2])ans ans-dataSetans ans*ansdis np.zeros([num,1],dtypeint)for i in range(num):dis[i] ans[i][0]ans[i][1]ans np.reshape(dis,[1,num])y np.argsort(ans)ylist(y[0])dic dict.fromkeys(list(set(labels)), 0)for i in range(k):dic[labels[y[i]]]1dic sorted(dic.items(),key lambda item:item[1],reverseTrue)return dic[0][0]dataSetnp.array([[250,100],[270,120],[111,230],[130,260],[200,80],[70,190]])
labels[理科生,理科生,文科生,文科生,理科生,文科生]
inX[105,210]
print(classify0(inX,dataSet,labels,3))if __name__ __main__:sys.stdout.encoding utf-8dataSet np.array([[250, 100], [270, 120], [111, 230], [130, 260], [200, 80], [70, 190]])labels [理科生, 理科生, 文科生, 文科生, 理科生, 文科生]inX [105, 210]print(classify0(inX, dataSet, labels, 3))
记录实验结果 实验现象描述
运行结果显示“文科生”输出符合预期
5、实验结果分析
kNN算法的指导思想是“近朱者赤近墨者黑”由你的邻居来推断出你的类别。先计算待分类样本与已知类别的训练样本之间的距离找到距离与待分类样本数据最近的k个邻居再根据这些邻居所属的类别来判断待分类样本数据的类别。用空间内两个点的距离来度量。距离越大表示两个点越不相似。距离的选择有很多通常用比较简单的欧式距离。
六、实验反思
根据这次实验实现了一个基本的K-最近邻K-NN分类器。K-NN是一种简单的机器学习算法它根据测试数据点与训练数据集中的点之间的距离来预测测试数据点的类别。以下是对这段代码和K-NN算法的一些思考
其优点在于
简单易于理解易于实现无需估计参数无需训练
适合对稀有事件进行分类
特别适合于多分类问题(multi-modal,对象具有多个类别标签) kNN比SVM的表现要好。
缺点
懒惰算法对测试样本分类时的计算量大内存开销大评分慢
当样本不平衡时如一个类的样本容量很大而其他类样本容量很小时有可能导致当输入一个新样本时该样本的K个邻居中大容量类的样本占多数
可解释性较差无法给出决策树那样的规则。
对于K值的设定
k值选择过小得到的近邻数过少会降低分类精度同时也会放大噪声数据的干扰而如果k值选择过大并且待分类样本属于训练集中包含数据数较少的类那么在选择k个近邻的时候实际上并不相似的数据亦被包含进来造成噪声增加而导致分类效果的降低。