机器学习十大算法 之 kNN(一)
最近在学习机器学习领域的十大经典算法,先从kNN开始吧。
简介
kNN是一种有监督学习方法,它的思想很简单,对于一个未分类的样本来说,通过距离它最近的k个“邻居”,来判断这个样本的类别。kNN也是一种lazy learning(不知道中文是啥)技术,训练代价小、分类代价大。算法的要点有四个:
- 训练集
- k的取值
- 距离的衡量方式
- 决定未知样本类别的方式
尽管kNN理解和实现起来都很简单,但是在某些应用上仍然有较好的表现。Cover和Hart指出,在一些合理的假设下,kNN的分类误差的上界是贝叶斯分类器误差的两倍,并且kNN方法的分类误差渐渐逼近贝叶斯分类器。
要点
-
k的取值
k表示未知样本在分类时“邻居”的个数。
如果k过小,那么分类的风险就会变大,未知样本的分类会很容易受到噪音的干扰。比如古老的封建制度,风险较大,国家大事只有皇帝和极少数重臣拿主意,如果是个明君带领的团队,那很有可能早就诸如“贞观之治”、“康乾盛世”之类的治世,相反,如果是昏君团队,改朝换代也就不远了。
如果k过大,那么分类时就会考虑过多的样本点,其中很可能包括大量无关的样本。随着k值变大,模型会变得越来越简单。极端的情况是k的值等于所有训练样本的个数,那么在训练集不变的情况下,每次分类结果都会是相同的。
确定k值的大小可以采用交叉验证(cross-validation)的方式。
-
距离的衡量方式
衡量样本点之间的距离最常用得有cosine距离、欧式距离和曼哈顿距离。
- cosine距离:d(x, y) = cos(x, y)
- 欧氏距离:d(x, y) = sqrt(sum(xi - yi)^2)
- 曼哈顿距离:d(x, y) = sqrt(sum(abs(xi - yi)))
在实际应用中,当然应该根据需求对距离进行修改甚至重新设计,但是原则是不变的,就是越相似的两个样本的距离应该是越小的。同时还应该注意在需要的时候进行归一化,避免夸大或者忽略个别值域差别较大的属性。
-
确定未知样本类别的方式
确定未知样本类别是指,在选取好k个里邻居之后,如何根据这些邻居的类别确定未知样本的类别。
最简单的方式是多数投票,也就是取k个邻居中个数最多的那个类别作为未知样本的类别。这种方式的问题是,当k个邻居分布比较广泛时,距离未知样本近的那些样本理应有更大的贡献,而实际上在投票的时候,所有邻居的权重是一样的。
因此,稍微复杂一点的方法是,在投票时按照与未知样本的距离考虑训练样本的权重。权重的计算方法有多种,例如:距离平方的倒数。