从KNN到Kernel
knn(k nearest neighbour)算法, 是个简单直观的分类算法, 相信大家也都有所了解. 现在我们脑洞大开, 聊一个knn变形的故事.
- knn是在一个邻域内, 统计一下哪个类别的点多. 不管离我远还是近, 只要在这个邻域内, 都算是一个点. 那我们能不能使用距离加权呢? 近的点更重要, 远的点作用小, 这么来做一个优化.
- 进一步, 这个邻域到底有多大呢? 我们优化一下, 将这个邻域取到无穷大, 即统计所有点的类别. 这个优化得和1配合使用, 不然所有预测结果都一样啦(样本总的先验概率, 特征都失效了).
- 如果要计算所有点到这里的距离, 太复杂了. 我们再做一个优化, 用一些”有代表性的点”来代替所有点. 以后我们只要计算跟这些”有代表性的点”之间的距离, 再按距离加权求和就好啦.
- 距离, 可长可短. 近的较重要, 远到一定程度就没作用了. 再做一个优化, 给这个(欧式)距离搞个归一化, 近的值大(1.0), 越远越没用(->0). 那么用什么函数呢? Gaussian呀! 万能的Gaussian, 岂不是正合适?
##RBF kernel 产生了… - 进一步优化. 现在我们找到了一些”代表性的点”, 并用到它们的距离加权求和(线性)来判别分类. 既然我们知道了这些”到代表性点的距离”, 那么也可以将其作为特征, 套用一个高阶模型(NN)或好搞的线性模型(Linear R, SVM).