机器学习初级入门-KNN

210 阅读5分钟

k近邻算法(KNN)是一种基本的分类和回归算法。

理解:给定一个训练好的数据集,输入一个新的数据,在训练好的数据集中能找到与新的数据最邻近的k个数据。如果做分类的话,那就是这k个数据多数属于某个类,那么这个新的数据就属于某个类;如果做回归的话,就把这k个数据求平均值,结果就是回归的结果。

KNN的三要素:k值的选择,距离度量以及分类决策。 解释:k值就是找最近的数据数量,距离度量有很多种,比如:欧式距离,切比雪夫距离、信息熵(决策树用),决策分类就是用多数表决啊还是什么方法进行决策。

算法: 1.输入训练集:T={(x1,y1),(x2,y2).....(xi,yi)} xi:x的特征向量,也就是f(x)这种函数里的x yi: y是x的类别,也就是y=f(x)的y 2.根据距离度量找出和x最近的k个点。涵盖这k个点的领域记作Nk(x) 3.利用分类决策法决定x的类别y: y=arg max∑I(yi=cj) i=1,2..k j=1,2..k

argmax是一种函数,是对函数求参数(集合)的函数。当我们有另一个函数y=f(x)时,若有结果x0= argmax(f(x)),则表示当函数f(x)取x=x0的时候,得到f(x)取值范围的最大值;若有多个点使得f(x)取得相同的最大值,那么argmax(f(x))的结果就是一个点集。换句话说,argmax(f(x))是使得 f(x)取得最大值所对应的变量点x(或x的集合)。

cj:数据可能的种类 yi:数据集中数据的种类

距离度量:两个实例点的相似程度的反应 例如:两个数据(矩阵)xi,xj求距离: L=(∑|xi^(l)^-xj^(l)^|^p^)^1/p^ l是样本的第几个特征,如x=[1,2,3] x^1^就是x的第一个特征1。这里p>=0。 如果p=2那就是欧氏距离。p=1是曼哈顿距离。p=∞就是各个作标距离的最大值。

k值要和实际情况相近,通常用交叉验证来找k值。 没做过项目请忽视,以后会说的.

损失函数: loss=1/k*∑I(yi≠cj) 意思是在k个最近的实例点中,看看有几个类型错误的实例点。

我们的目的是让loss最小化。

但是如果我们有以前甚至一万个数据的时候,进行线性扫描(一个个数据点算距离)会特别麻烦,计算很耗时,那怎么办呢? 我在这里提出一个kd树的方法。 kd树就是二叉树:

二叉树(Binary tree)是树形结构的一个重要类型。许多实际问题抽象出来的数据结构往往是二叉树形式,即使是一般的树也能简单地转换为二叉树,而且二叉树的存储结构及其算法都较为简单,因此二叉树显得特别重要。二叉树特点是每个结点最多只能有两棵子树,且有左右之分。

在这里插入图片描述 kd树介绍:是一种对k维空间中的实例点进行存储以便进行对其快速检索的树形数据结构。kd树就是二叉树,表示对k维空间的一个划分。构建kd树县东港与不停的用垂直于坐标轴的超平面对k维空间进行划分(树的枝子不断分化,一个枝子变成俩),构成一系列k维超矩形区域。

简单说就是一个实例有多个特征吧,每层对特征不断划分。直到所有特征被划分完。划分就是一个结点分成两个结点,如二叉树的图F分成了C和E两个方向的结点。

那么,咱们是拿什么标准为划分的呢,如:x1=[1,2,3],x2=[3,4,10].x3=[1,2,3] 咱们要划分第一个特征就拿三个数据的第一个特征的中位数,1,3,1的中位数为1所以拿1当切分点(划分的)。

算法: 输入的数据:数据集T={x1,x2,x3..xn} xi=(x^(1)^,x^(2)^,x^(3)^...x^(l)^) i=1,2,3...n 1.我们首先建立根节点,开始深度为0(就是看几层),拿x^(1)^这个特征作的中位数为分类标准,将根节点对应的超矩形区域切分成两个子区域(就是从根节点分出两个树枝)。其左边小于中位数,右边大于中位数。深度+1/ 2.重复进行1,但是深度为j的结点,选择x^(l)^为切分的坐标轴,l=j(mod k)+1 k是数据维度(特征个数),重复1不断切分。直到分的左右子区域(根生成的左右结点)都没有数据为止

kd树建好了怎么进行搜索呢? kd树的搜索算法: 输入:kd树,目标数据点x 要求:输出x的最近邻 1.将x从根节点出发,不断向下访问kd树,小于当前结点的数据就向左,否则当前数据结点就向右。直到到达子节点为止。 2.把这个结点当成当前的最近点。 3.慢慢的把结点往上退,不断进行以下操作: 如果该节点保存的实例比当前最近点距离目标点x当坐当亲最近点。 当前最近点一定存在于该结点的一个子结点对应的区域。检查该子节点的父节点的另一个子节点是否有更近的点,具体的,检测另一个子节点对应的区域是否有以目标点为球心,与当前最近点间距离为半径的超球体相交,如果相交,可能存在另一个子节点对应的区域内存在距目标点更近的点,移动到另一个子节点,递归进行最近邻搜索 如果不相交,继续回退。 4.当退回到根节点时,搜索结束,最后的当前最近点就是x的最近点。

kd树的时间复杂度为O(logN),数据数要大于维数才好用。