算法浅谈:从KNN算法谈起

KNN算法在机器学习里面非常经典,不仅因为它本身的算法逻辑比较简单易懂,更因为它是基于实例的学习算法中的代表。

本文目的不在讲解算法流程,就不多说KNN算法具体怎么实现了。简单来说,KNN的逻辑就是选择离测试样本最近的K个邻居,根据邻居们的labels为测试样本打标签,从而实现分类。

那么很显然,KNN的两个关键词就是 距离 和 基于邻居标签的打标签方案(下简称“投票方案”)。


谈算法最好能有个对比,下面就以神经网络BP算法作为参考,简单说一下KNN与BP之间的“恩怨情仇”,谁让BP也同样那么经典呢。

说明一下,本文仅讨论算法,不讨论数据样本质量如何,再好的算法也有不适合它的样本。


机器学习爱好者初次接触KNN和BP的时候一般会被很明确地告知,KNN基于实例来学习、BP训练网络模型来学习,从算法流程上看,对一个新样本的标签计算两者的处理方式是完全不同的——KNN是将新样本与已知的样本进行比较,通过已知样本局部的标签属性来为新样本打标签;BP是通过已知样本训练出一个可靠的模型,用这个模型来为新样本打标签。

两者的区别看起来就是——BP训练出了一个规则,而KNN没有。

于是,新的样本出现,BP只需要稍加计算就能完成新样本的分类,而KNN还要扔进已知样本中千锤百炼,在分类过程中速度确实差了不少。

但其实,KNN和BP遵循了同样的假设——连续性假设,离某样本距离非常近的样本应该具有同样的标签。

暂时假设特征空间中默认距离为欧氏距离。

对于BP,结论显而易见,特征空间连续+模型函数连续,所以BP遵循连续性假设;那么KNN呢,不难证明,当样本给定时,对于任意一个特征空间中的点,总存在该点的一个邻域,使得邻域内的点全部具有同样的标签,于是KNN也遵循连续性假设。——(1)


接下去,引出正文(为简单化内容,接下去仅考虑二分类问题,并假设KNN和BP的学习错误率均为0,也就是无论在训练集还是测试集上,错误率均为0)——


1. KNN也具有规则,并不是真正意义上的基于实例的学习,只是一般情况下KNN的规则不可学习。

由(1)中不难看出,当样本给定的时候,特征空间中的每一个点所在的某个邻域在KNN算法下的labels都是确定不变且相同的的,所以KNN的规则可以看做是每一邻域上的单值函数,值域为{0,1},这些函数定义为特征空间上的KNN函数族,这些邻域称为KNN邻域族。

那么,是否能学习出KNN函数族就等价于KNN的规则是否可学习。

显然,如果KNN函数族数量有限——等价于邻域族有限——则KNN的规则是可以训练出来的,反之由于无穷性,KNN算法的规则是不可学习的。

用这种观点考虑BP算法,BP训练出的规则对特征空间中任何一个特征集合都是不变的,特征空间不论如何拆分,模式函数都一视同仁。

根据(1),在这里我用开邻域代表下文中提到的所有“邻域”,因为在欧氏空间中(以欧氏距离诱导出的拓扑),开邻域(开集)A内任意一点总存在一个开邻域完全包含在A中,如果邻域非开,那么总可以延拓邻域使之成为开邻域具有同一个label(一个简单的方法就是将每点的一个具有同样label的开邻域取并集,由于开集的任意并仍然是开集,且它们具有同样的label,所以任意一个非开邻域总能包含于一个开邻域,并有同样的label)。

于是,可以证明,有限维欧式空间在欧氏距离下,可以由可数个不相交的开集取并集运算得到,这些开集均连通。

上面这句话乍一看可能不太明白,由此先引入一些概念。


(i)拓扑——(浏览器翻译出毛病了,就贴个英文吧)

The term topology also refers to a specific mathematical idea central to the area of mathematics called topology. Informally, a topology tells how elements of a set relate spatially to each other. The same set can have different topologies. For instance, the real line, the complex plane, and the Cantor set can be thought of as the same set with different topologies.

Formally, let X be a set and let τ be a family of subsets of X. Then τ is called a topology on X if:

  1. Both the empty set and X are elements of τ
  2. Any union of elements of τ is an element of τ
  3. Any intersection of finitely many elements of τ is an element of τ

If τ is a topology on X, then the pair (Xτ) is called a topological space. The notation Xτ may be used to denote a set X endowed with the particular topology τ.

The members of τ are called open sets in X. A subset of X is said to be closed if its complement is in τ (i.e., its complement is open). A subset of X may be open, closed, both (clopen set), or neither. The empty set and X itself are always both closed and open. An open set containing a point x is called a 'neighborhood' of x.

A set with a topology is called a topological space.

拓扑在逻辑上先给了开集的定义,并定义开集的complement set为闭集(complement set有说是补集,有说是余集的);同理,拓扑一样可以先定义闭集,再将闭集的complement set定义为开集,只是还需要将”有限交“与”任意并“条件对应修改为”任意交“与”有限并“。

显然,欧式空间中,由欧式度量诱导出的开集满足拓扑公理。

(ii)可数——

我们定义基数用来描述集合的元素个数,一个集合是可数的当且仅当它的基数与自然数相等,也就是它能与自然数一一对应。

自然数的基数用符号ℵ₀表示,实数的基数用c表示,Cantor证明了2^ℵ₀=c —— (2)

(iii)连通——

这个很好描述,一个拓扑空间称为连通的,当且仅当它不能表示为两个不相交开集的并,由于每一个开集都可相对所在的拓扑空间诱导出一个拓扑使自己成为一个拓扑空间——诱导方式为自己与全空间所有开集取交集——所以可以直接定义欧氏空间中每一个开集的连通性。


/*  就按通常的定义,一个点的集合定义为闭集——如果单点全是开集,那么所有集合都是开集,这样的离散拓扑对算法而言没什么卵用,如果单点集部分是开集,部分是闭集,或者不开不闭,那讨论的就麻烦多了,还是正常点吧。  */


这样前面那句黑体字的话就不难看懂了,为了篇幅详细证明就略过了,毕竟这不是数学博客,简单说明一下思路——欧式空间中的全体有理点(各坐标均为有理数)是可数的,任意一个有理点必然存在一个邻域包含其他有理点,任何一个开集也必然包含一个有理点,所以如果开集之间不相交且基数大于ℵ₀,那么就从每个开集中选取一个有理点,这些有理点构成一个集合S,基数大于ℵ₀,那么S必然包含重复元素,也就是说,有两个开集有共同的有理点,所以它们不可能不相交,这与已知矛盾,因此,所求的开集族基数就不超过ℵ₀。这个基数也不会是有限的,这点就不证明了。


于是KNN的规则是存在的,KNN邻域族上的函数族,就是这个规则。

由于KNN邻域族的无穷性,所以一般情况下KNN无法提供一个可学习的规则(对于一个测试样本,需要判断属于哪个邻域才能判定),那么特殊情况呢?

比如当样本稠密的时候(稠密的定义是样本集合的闭包等于整个特征空间)——当然,稠密不可能,但当样本数量非常多且很密集的时候,可近似看作稠密的——BP训练出的完美分类超曲面一样可以在KNN中得到,只是KNN算不出神经网络的结构,只有两个常函数,每个函数定义在超曲面的一边。只是这时候,超曲面作为两个类的边界将不考虑分类,这时候特征空间刨去了超曲面得到的两个开子空间是可以由有限个不相交开集取并运算得到的,这点和前面的“全空间不能由有限个不相交连通开集取并运算得到”是不一样的,两个特征空间是不同的。


讨论到这里,不难发现,其实BP在这里提供的只是一个利用连续函数作为分类模式函数的模型,与算法是否反向传播无关,上述讨论对其他类似的算法一样成立。


2. KNN的假设空间基数不超过c,BP的假设空间基数是c。

大师Mitchell喜欢用假设空间来描述机器学习,本人也很喜欢这个理论,这里也稍微讨论下。

KNN的规则可以视为邻域族上的函数族,其实就是一个分段函数,简单说下KNN和BP的假设空间大小。

BP本质上是修正模型中的全体参数,由于参数个数有限(记为n),且参数取值范围均为R,那么BP算法就是在R^n中利用反向传播方法搜索一个点,R^n的基数和R一样,都是c;KNN看起来稍微有点不同,因为对每个邻域(或开集)都有两个选择0或1,如果邻域是可数的,那么就有假设空间大小就是2^ℵ₀,根据(2)可知,这个假设空间的基数就是c,在邻域族有限的情况下,可以是有限的。

因此,KNN的假设空间基数至多为c,BP的假设空间一定是c。


3. 基于邻域思想的一般性,BP的限制。

仍然以二分类为例,且仍假设正常情况下KNN与BP可以完美学习样本,那么下面就看看不正常的情况。

(i)BP训练对象——函数:

函数的一大特点就是“一个输入只有唯一的输出”,所以BP(等类似的算法)理论上都无法表示一般方程描述出的超曲面,比如R^2上的单位圆(或更一般的Jordan曲线),如果圆内为正例而圆外为反例,那么BP理论上是表示不出来的,如果要表示,就要分段,在不同的集合上各自训练BP网络,这也是常用方法,毕竟很多情况下经典的BP算法效果并不好,分段理论上可以表示更大的假设空间——甚至只需要局部线性处理就行了——先对特征空间聚类,然后再每一个cluster上面分类相信很多人用过。

而KNN并不需要在意这一点,它就是基于邻域思想产生的,这点显然。

(2)BP函数的特性——连续:

考虑三维空间R^3中的二维球面S^2,由于S^2是道路连通且S^2是紧致的,BP模型的连续函数会把S^2中的点映射为一个闭区间[a, b],这是因为道路连通性和紧致性都是连续映射下的不变性,而R中的道路连通且紧致的集合只能是闭区间。

也就是说,理论上BP算法一定能取到[a,b]上的任意值,所以二分类就总是需要一个标准,将某些[a,b]中的点映射为正例,某些点映射为反例,比如我们常用<0, >0作为正反例的判别标准。这时候,对于0附近的一些值得正反例判断,BP就未必有足够好的效果了。

对KNN来说,这个问题不足为虑,因为分段函数的关系,KNN的规则不要求是全空间上的连续函数,所以KNN完全可以只映射为0或1,取不到其他值。


以上,就是从KNN的角度简单引出一些问题,如有错误欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值