机器学习常识 6: kNN

摘要: 具有讽刺意味的是: 机器学习最基本的算法居然是不学习, 也称为惰性学习 (lazy learning). k k kNN (k nearest neighbors) 通过计算样本间的距离 (相似度) 来确定待预测样本应与哪些训练样本的标签保持一致.

1. 基本思想

为了应对一场考试, 我们可以不学习, 而在考场上去翻书. 是的, 在解决实际问题时, 完全可以是开卷考试.
继续使用前面提到的例子. 上午来了 60 个就诊者, 根据他们的各项检测指标 (即数据), 主治医生给出了诊断结论 (如是否患病, 以及患哪种病). 实习医生只是用小本本把带标签数据记录下来, 并没往心里去. 下午来了 1 个就诊者 A, 实习医生将他的检测指标与上午 60 个就诊者的数据逐一比对, 并找出 k = 3 k = 3 k=3 个最相似的. 根据这 k k k 个就诊者的情况, 就可以对 A 的患病情况进行预测 (例如, 他们都没患病, 就预测 A 也没病).
这种方式极度简单, 但揭示了人类认识世界的一个本质而有效的思想: 根据相似性进行预测.
人们常说“见多识广”, 本质上就是大脑内存储的样本多, 就可以对新样本进行准确的判断.大医院的医生更靠谱, 一些小医院所说的疑难杂症, 对他们而言可能是天天见的病例. 因此, 在学习更多的算法之后, 仍然需要记住一句话: 永远不要小瞧 k k kNN. 你很难找到一种算法在随机选择的 100 个数据集上完美地打败它.
前段时间热炒的大数据概念, 其中一个思想就是: 如果训练数据的量足够大, 那么我们只需要用很简单方法 (如 k k kNN) 即可. 假设一个实习生见到的不是 60 个样本, 而是 1 亿个样本, 那么他的判断应该可以达到惊人的准确性. 西瓜书上也说了, 理论上可以证明, 当样本量足够大时, k k kNN 的误差不超过贝叶斯误差 (即理论最大误差) 的 2 倍.

2. 参数设置

k k k 是一个需要调整的参数. 如果是二分类问题, 一般将其设置为奇数, 方便投票. 要知道 k k k 设置为多少合适, 可以使用前面所描述的验证集.

3. 距离度量 distance measure

k k kNN 涉及相似性的计算. 假设就诊者 x 1 x_1 x1 x 2 x_2 x2 的 3 项检测指标值分别为 [ 0.3 , 1.7 , 380 ] [0.3, 1.7, 380] [0.3,1.7,380] [ 0.25 , 1.9 , 400 ] [0.25, 1.9, 400] [0.25,1.9,400], 则它们的欧氏距离为
( 0.3 − 0.25 ) 2 + ( 1.7 − 1.9 ) 2 + ( 380 − 400 ) 2 (1) \sqrt{(0.3 - 0.25)^2 + (1.7 - 1.9)^2 + (380 - 400)^2} \tag{1} (0.30.25)2+(1.71.9)2+(380400)2 (1)
曼哈顿距离为
∣ 0.3 − 0.25 ∣ + ∣ 1.7 − 1.9 ∣ + ∣ 380 − 400 ∣ (2) \vert 0.3 - 0.25\vert + \vert 1.7 - 1.9\vert + \vert 380 - 400\vert \tag{2} ∣0.30.25∣+∣1.71.9∣+∣380400∣(2)
当然还有其它的距离度量方式.

4. 主要缺点

慢.
试想别人学习到知识, 考试的时候刷刷地做题, 而你要一页页地翻书, 速度就不是一个量级的了.
为了缓解这个问题, 可以先把 10,000 条训练数据聚为 50 个簇, 每簇约 200 个样本 (聚类问题), 并获得这些簇中心点. 进行比对的时候, 先确定与哪个簇中心最近, 然后再在这个簇中心找邻居. 这样就可以把 10,000 次对比降为约 50 + 200 次.

5. 归一化 normalization

从 (1)(2) 式可以看出, 由于最后一个指标的值比较大, 前面两个指标对距离的贡献几乎可以忽略不计. 甚至这种指标值大小是由单位所导致的 (如毫升与升). 为消除不同指标取值范围的影响, 可使用归一化, 即所有指标均取 [ 0 , 1 ] [0, 1] [0,1] 区间的值. 例如, 第 3 项指标的最大值是 500, 最小值是 100, 则数据 380 归一化变为
380 − 100 500 − 100 = 280 400 = 0.7 \frac{380 - 100}{500 - 100} = \frac{280}{400} = 0.7 500100380100=400280=0.7

6. 度量学习 metric learning

归一化还是会引入新的问题: 认为所有的指标同等重要. 在现实应该中, 应该为每个指标赋予一定的权值 w w w, 并使得该指标的取值范围成为 [ 0 , w ] [0, w] [0,w]. 相应的权值可以从数据中学习到. 这就是度量学习的初衷.

7. 常见误区

  • 小瞧 k k kNN, 觉得它过于简单.
  • 没有认识到 k k kNN 正是人类认识物体的基本方式.
  • 不知道 k k kNN 可以做回归 (把邻居的实数型标签值取平均即可).

8. 延伸阅读

k k kNN 的 Java 代码参见 日撸 Java 三百行(51-60天,kNN 与 NB).

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值