他当初刚写第一篇论文的时候,就拟好了这个题目,只是由于数学基础不够,一直停留在构思阶段。
这两天他利用碎片时间,稍微补了补高数知识,这才真正动笔。
江寒将近期一些想法整理了一下,罗列了个大纲出来。
很多机器学习分类算法,都要求假设数据线性可分,“感知机”也不例外。
如果数据不是线性可分的,就必须采用一些特殊的方法,把数据非线性地投射到更高的维度上。
在高维空间里,数据更有可能变成线性可分的,这就是所谓的Cover定理。
对于感知机来说,处理线性不可分的问题,有个最简单的解决办法,那就是把单层感知机拓展为多层感知机。
多层感知机的关键,在于如何训练各层之间的连接权值。
一种常用的办法是只训练某两层间的连接权值,而将其它连接权值进行固定。
可以从数学上证明,对于所有非线性可分的样本集,这种方法都是收敛的。
也可以采用BP技术,也就是另一个世界里,大名鼎鼎的“反向传播神经网络”。
当然,这个世界里,“感知机”都还没正式登场,说这些还有点早。
至于BP技术什么时候问世,基本上是江寒自己说了算……
此外,还可以将数据带到核空间,再进行分类。
在另一个世界里,有很多著名的算法,例如支持向量机(SVM)、径向基神经网络(RBFNN)等等,都采用了所谓的“核方法”。
核方法的核心,是核函数。
工业生产中,常用的核函数有线形核、多项式核、高斯核等等。
所谓核空间,百度百科上说:“核型空间是一类局部凸空间。”
具体来说:如果对零元的任何均衡凸邻域V,存在另一零元的均衡凸邻域U?V,使得典型映射T:XV→XU是核映射,则局部凸空间X称为核型空间。
这里,XU是商空间(X,PU(·))/{x|PU(x)=0},而XV是商空间(X,PV(·))/{x|PV(x)=0}的完备化空间,PU(·)及PV(·)是由U和V各自产生的闵可夫斯基泛函。
嗯,江寒刚开始看到这个的时候,还真有点懵逼。
所以,再加强一点数学素养,还是很有必要的说……
当然,就算不懂上面的数学表达,一样可以理解核函数的功能。
核函数主要做的事情,就是将样本映射到更高维的空间。
但是,这样做虽然能使样本变得可分,但却会造成维数过高,使得计算量急遽增大。
这就是“高维NP难”问题。
所谓NP难(NP-hard),是指:非确定性多项式问题的大型实例,不能用精确算法求解,只能寻求有效的近似算法。
而解决的办法,也有很多……
好吧,先回到一开始的问题:如何判断数据是线性可分的?
最简单的情况,比如数据向量是一维、二维或者三维的,只要把图像画出来,直观上就能判断出来。
但如果数据向量的维度变得很高,又该怎么办?
答案是检查凸包(vexhull)是否相交。
所谓凸包,简单的说,就是一个凸的闭合曲线(曲面),它刚好包住了所有的数据。
以二维的情况为例,如果我们的数据训练集有两类:M+和M-。
当我们画出两个类的凸包,如果两者不重叠,那么两者线性可分,反之则线性不可分。
靠画出图形,然后用眼睛来判断是否线性可分,虽然比直接看数据更加容易了些……
但好像依然没有解决高维数据的问题?
其实不是这样的。
判断两个凸包是不是有重叠,可以通过判断两个凸包(M+和M-)的边是否相交来实现,而无需把凸包画出来。
要想高效地找到一组数据的凸包,在计算几何中有很多现成的算法:
穷举法、分治法、Jarvis步进法、Graham扫描法、Melkman算法……
江寒在这篇论文中选择的算法,称之为快速凸包算法(quickhull)。
第二个问题,如何高效地判断出,两个凸包的边缘是否相交?
也有许多可选的算法,江寒使用了所谓的扫描线算法(sweepline)。