第1关:knn算法概述
*任务描述
本关任务:使用python实现方法,找出目标样本最近的k个样本。
相关知识
为了完成本关任务,你需要掌握:1.knn算法思想,2.距离度量。
knn算法思想
k-近邻(k-nearest neighbor ,knn)是一种分类与回归的方法。我们这里只讨论用来分类的knn。所谓k最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最近的k个邻居来代表。
knn算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。knn方法在类别决策时,只与极少量的相邻样本有关。*
*如上图,当k=3时离绿色的圆最近的三个样本中,有两个红色的三角形,一个蓝色的正方形,则此时绿色的圆应该分为红色的三角形这一类。而当k=5时,离绿色的圆最近的五个样本中,有两个红色的三角形,三个蓝色的正方形,则此时绿色的圆应该分为蓝色的正方形这一类。
距离度量
我们已经知道,如何判别一个样本属于哪个类型,主要是看离它最近的几个样本中哪个类型的数量最多,则该样本属于数量最多的类型。这里,有一个问题:何为最近?
关于何为最近,大家应该自然而然就会想到可以用两个样本之间的距离大小来衡量,我们常用的有两种距离:
- 欧氏距离:欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。*
- 曼哈顿距离:顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”。
其中,上标圆括号内数字代表第几个样本,下标数字代表样本的第几个特征。
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,实现topK方法。
测试说明
程序会调用你实现的方法,找出目标样本最近的k个样本的标签。如目标样本最近的5个样本为0,0,1,1,1则返回列表[0,0,1,1,1]。若返回结果与真实结果一致则视为通关。
#encoding=utf8
import numpy as npdef topK(i,k,x,y):'''input:i(int):第i个样本k(int):最近邻样本个数x(ndarray):数据特征y(ndarray):数据标签output:topK(list):样本i的最近k个样本标签'''#*********Begin*********##计算样本到所有样本的距离distance = np.sqrt(np.power(np.tile(x[i],(x.shape[0],1))-x,2).sum(axis=1)) #np.tile(a,(y,x))第一个参数为Y轴扩大倍数,第二个为X轴扩大倍数#sum(axis=1)代表按列方向跨行相加#除样本本身外的最近的k个样本的索引nearest = np.argsort(distance)[1:k+1]#np.argsort() 将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y#除样本本身外的最近的k个样本的标签topK = [y[j] for j in nearest]#*********End*********#return topK
第1关:knn算法概述
*任务描述
本关任务:使用python实现方法,找出目标样本最近的k个样本。
相关知识
为了完成本关任务,你需要掌握:1.knn算法思想,2.距离度量。
knn算法思想
k-近邻(k-nearest neighbor ,knn)是一种分类与回归的方法。我们这里只讨论用来分类的knn。所谓k最近邻,就是k个最近的邻居的意思,说的是每个样本都可以用它最近的k个邻居来代表。
knn算法的核心思想是如果一个样本在特征空间中的k个最相邻的样本中的大多数属于某一个类别,则该样本也属于这个类别,并具有这个类别上样本的特性。该方法在确定分类决策上只依据最邻近的一个或者几个样本的类别来决定待分样本所属的类别。knn方法在类别决策时,只与极少量的相邻样本有关。*
*如上图,当k=3时离绿色的圆最近的三个样本中,有两个红色的三角形,一个蓝色的正方形,则此时绿色的圆应该分为红色的三角形这一类。而当k=5时,离绿色的圆最近的五个样本中,有两个红色的三角形,三个蓝色的正方形,则此时绿色的圆应该分为蓝色的正方形这一类。
距离度量
我们已经知道,如何判别一个样本属于哪个类型,主要是看离它最近的几个样本中哪个类型的数量最多,则该样本属于数量最多的类型。这里,有一个问题:何为最近?
关于何为最近,大家应该自然而然就会想到可以用两个样本之间的距离大小来衡量,我们常用的有两种距离:
- 欧氏距离:欧氏距离是最容易直观理解的距离度量方法,我们小学、初中和高中接触到的两个点在空间中的距离一般都是指欧氏距离。*
- 曼哈顿距离:顾名思义,在曼哈顿街区要从一个十字路口开车到另一个十字路口,驾驶距离显然不是两点间的直线距离。这个实际驾驶距离就是“曼哈顿距离”。曼哈顿距离也称为“城市街区距离”。
其中,上标圆括号内数字代表第几个样本,下标数字代表样本的第几个特征。
编程要求
根据提示,在右侧编辑器Begin-End处补充代码,实现topK方法。
测试说明
程序会调用你实现的方法,找出目标样本最近的k个样本的标签。如目标样本最近的5个样本为0,0,1,1,1则返回列表[0,0,1,1,1]。若返回结果与真实结果一致则视为通关。
#encoding=utf8
import numpy as npdef topK(i,k,x,y):'''input:i(int):第i个样本k(int):最近邻样本个数x(ndarray):数据特征y(ndarray):数据标签output:topK(list):样本i的最近k个样本标签'''#*********Begin*********##计算样本到所有样本的距离distance = np.sqrt(np.power(np.tile(x[i],(x.shape[0],1))-x,2).sum(axis=1)) #np.tile(a,(y,x))第一个参数为Y轴扩大倍数,第二个为X轴扩大倍数#sum(axis=1)代表按列方向跨行相加#除样本本身外的最近的k个样本的索引nearest = np.argsort(distance)[1:k+1]#np.argsort() 将x中的元素从小到大排列,提取其对应的index(索引),然后输出到y#除样本本身外的最近的k个样本的标签topK = [y[j] for j in nearest]#*********End*********#return topK