网上关于机器学习算法的讲解很多,不过推导过程可能比较繁琐,结论比较隐蔽。为了能够让c/c++的初学者通过代码简单的实现、加深理解,所以本文章简单的总结出结论,尽量减少推导过程。并且将各个变量的范围、意义做出解释。
我目前大学本科在读,非人工智能专业,第一次接触机器学习,本文章仅是我的学习记录和总结,所有的处理方式都不一定是最正确的。但是致力于让只学完c\c++基本语法的人也能实现该算法。
不知道怎么处理数据、得到“输入”的请看我的文章:《机器学习数据的预处理》(如果找不到说明我还没写)。
另外,我会尽可能多打括号,防止各位对到底对什么求和感到困惑,变量也用x[a]而非表示,便于直接写成代码。
首先:
该算法的输入可以是连续的,“归一化”可以排除样本中可能出现的极端值对距离计算的影响,直接使用原始数据可能结果较差。
在了解下方的变量前,请确认:
1. 你有非常多的样本(即图中表示的非常多的点)
2. 你的每个样本有多个的输入的值(即每个点处于二维平面、三维或多维空间中)。
该算法将最近的K个点中最多的一类点作为答案输出。点较多、维度较高时该算法会非常慢。
所有变量,意义如下:
1. K,取最近的K个点作为参考。显然是整型
2. N,输入点与输出点的维度。显然是整型
3. i[a][b],全部输入样本中,第a个点第b维的值。是浮点型
4. o[a],全部输入样本中,第a个点的答案。是整型
5. t[a],测试或使用样本,该点第a维的值。是浮点型
6. d[a],是第a个输入点i[a]与测试或使用点t的距离的平方。是浮点型
测试或使用,没有所谓“学习”的步骤:
1. 计算出所有d[a],每个:
(准确计算距离还需要开根号,但是开不开根不影响大小的比较)
2. 比较d[a],取出最近的K个距离d[a]与其对应的答案o[a],取出的K个点中属于哪一答案的点最多,则该答案作为测试或使用的答案输出。
要注意的一些问题:
1. K的取值会影响正确率。
可以将输入样本的一个或多个作为测试用例,反复调整K,找到正确率最大的K的值。或使用一些其他算法算出最合适的K值(这里不多作介绍)
2. 当某一答案其中的样本点非常少,甚至远远小于K时,该答案可能永远不会被输出。必要时可以将距离的倒数作为权,统计和比较每个答案的权重和。
最后:
写的比较匆忙,很多地方没有检查,我本人学习这些算法的时间也很短,如果存在任何问题,有任何意见或建议欢迎指出,我会马上进行更正。
另外,要深入理解一种算法,其具体原理和推导过程也是需要学习的。网上有太多这方面的文章,在这就不做详细解释。
谢谢。