简洁明了的搭建 KNN 仅公式无推导

网上关于机器学习算法的讲解很多,不过推导过程可能比较繁琐,结论比较隐蔽。为了能够让c/c++的初学者通过代码简单的实现、加深理解,所以本文章简单的总结出结论,尽量减少推导过程。并且将各个变量的范围、意义做出解释。

我目前大学本科在读,非人工智能专业,第一次接触机器学习,本文章仅是我的学习记录和总结,所有的处理方式都不一定是最正确的。但是致力于让只学完c\c++基本语法的人也能实现该算法。

不知道怎么处理数据、得到“输入”的请看我的文章:《机器学习数据的预处理》(如果找不到说明我还没写)。

另外,我会尽可能多打括号,防止各位对\sum到底对什么求和感到困惑,变量也用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],每个:

        d[a]=\sum_{k=0}^{N}(i[a][k]-t[k])^{2}

        (准确计算距离还需要开根号,但是开不开根不影响大小的比较)

2. 比较d[a],取出最近的K个距离d[a]与其对应的答案o[a],取出的K个点中属于哪一答案的点最多,则该答案作为测试或使用的答案输出。

要注意的一些问题:

1. K的取值会影响正确率。

可以将输入样本的一个或多个作为测试用例,反复调整K,找到正确率最大的K的值。或使用一些其他算法算出最合适的K值(这里不多作介绍)

2. 当某一答案其中的样本点非常少,甚至远远小于K时,该答案可能永远不会被输出。必要时可以将距离的倒数作为权,统计和比较每个答案的权重和。

最后:

写的比较匆忙,很多地方没有检查,我本人学习这些算法的时间也很短,如果存在任何问题,有任何意见或建议欢迎指出,我会马上进行更正。

另外,要深入理解一种算法,其具体原理和推导过程也是需要学习的。网上有太多这方面的文章,在这就不做详细解释。

谢谢。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值