机器学习这几年越来越火, 特别是相关算法五花八门, 但最有名的就那么几种, 而在这几种中, 要数KNN算法最为简单, 高效并且有鲁棒性 (Robustness).
我们先来看一问题: 已知正方形和三角形的归类, 请问绿色的圆是属于三角还是属于正方形?
这里的KNN 指的是 K-nearest neighbour 翻译过来就是 K个最近的邻居, 如果我们指定K=3, 那么和绿色圆最近的是2个三角形和1个正方形, 所以按多数为主的标准, 我们预测这个圆属于三角, 相反, 如果K=5的情况, 和圆最近的有3个正方形和2个三角形, 这时候我们就按多数投正方形.
用 MySQL 来演示 KNN算法
我们先创建一个表含有两个字段x和y,
1 2 3 4 5 6 7 8 9 10 11 | mysql> select * from test1; +------+------+ | x | y | +------+------+ | 1 | 23 | | 1.2 | 17 | | 3.2 | 12 | | 4 | 27 | | 5.1 | 8 | +------+------+ 5 rows in set (0.04 sec) |
mysql> select * from test1; +------+------+ | x | y | +------+------+ | 1 | 23 | | 1.2 | 17 | | 3.2 | 12 | | 4 | 27 | | 5.1 | 8 | +------+------+ 5 rows in set (0.04 sec)
假设已知一个新点x=6.5, 我们想通过KNN (K=2)来预测y的值, 那么我们可以通过以下SQL语句来查找和6.5最近的两个点:
1 2 3 4 5 6 7 8 | mysql> select x,y from test1 order by abs(6.5-x) limit 2; +------+------+ | x | y | +------+------+ | 5.1 | 8 | | 4 | 27 | +------+------+ 2 rows in set (0.00 sec) |
mysql> select x,y from test1 order by abs(6.5-x) limit 2; +------+------+ | x | y | +------+------+ | 5.1 | 8 | | 4 | 27 | +------+------+ 2 rows in set (0.00 sec)
然后需要做的就是平均这两个点的y值, 用一个嵌套SQL语句就可以了:
1 2 3 4 5 6 7 | mysql> select avg(y) as predicted from (select y from test1 order by abs(6.5-x) limit 2) as KNN; +-----------+ | predicted | +-----------+ | 17.5 | +-----------+ 1 row in set (0.00 sec) |
mysql> select avg(y) as predicted from (select y from test1 order by abs(6.5-x) limit 2) as KNN; +-----------+ | predicted | +-----------+ | 17.5 | +-----------+ 1 row in set (0.00 sec)
KNN算法简单 但是有一个很大的问题是这个算法是属于 lazy 算法, 意思是拿到数据 (training set) 后并不是马上训练(甚至是并没有训练这个过程)而是等需要预测的时候实时去找最近的K个邻居, 所以当数据量大的时候 效率就比较低了.
英文: The K Nearest Neighbor Algorithm (Prediction) Demonstration by MySQL
强烈推荐
- 英国代购-畅购英伦
- TopCashBack 返现 (英国购物必备, 积少成多, 我2年来一共得了3000多英镑)
- Quidco 返现 (也是很不错的英国返现网站, 返现率高)
- 注册就送10美元, 免费使用2个月的 DigitalOcean 云主机(性价比超高, 每月只需5美元)
- 注册就送10美元, 免费使用4个月的 Vultr 云主机(性价比超高, 每月只需2.5美元)
- 注册就送10美元, 免费使用2个月的 阿里 云主机(性价比超高, 每月只需4.5美元)
- 注册就送20美元, 免费使用4个月的 Linode 云主机(性价比超高, 每月只需5美元) (折扣码: PodCastInit2022)
- PlusNet 英国光纤(超快, 超划算! 用户名 doctorlai)
- 刷了美国运通信用卡一年得到的积分 换了 485英镑
- 注册就送50英镑 – 英国最便宜最划算的电气提供商
- 能把比特币莱特币变现的银行卡! 不需要手续费就可以把虚拟货币法币兑换
微信公众号: 小赖子的英国生活和资讯 JustYYUK