网上关于机器学习算法的讲解很多,不过推导过程可能比较繁琐,结论比较隐蔽。为了能够让c/c++的初学者通过代码简单的实现、加深理解,所以本文章简单的总结出结论,尽量减少推导过程。并且将各个变量的范围、意义做出解释。
我目前大学本科在读,非人工智能专业,第一次接触机器学习,本文章仅是我的学习记录和总结,所有的处理方式都不一定是最正确的。但是致力于让只学完c\c++基本语法的人也能实现该算法。
不知道怎么处理数据、得到“输入”的请看我的文章:《机器学习数据的预处理》(如果找不到说明我还没写)。
另外,我会尽可能多打括号,防止各位对到底对什么求和感到困惑,变量也用x[a]而非表示,便于直接写成代码。
首先:
该算法的输入是离散的,连续的数据需要在预处理过程中处理成离散的。不需要“标准化”或“归一化”。
如图所示,可以简单的得到当然,如果有多个输入且每个输入有多种可能的情况,也可以通过下面的方法计算。
在了解下方的变量前,请确认:
1. 你有非常多的样本(即多组输入)
2. 你的每个样本(即每组输入)有一个或多个输入的值。
3. 你的每个输入的值(可能原本是连续的或离散的)已经被处理成离散的。换而言之每个输入的值只有有限种可能,而且种类可知,比如二分只有2种可能,0或1。
图中未标记任何变量,所有可能需要的变量如下:
1. i_num,你有的样本的个数。显然是整型
2. i_width,每个样本,输入的值的个数。显然是整型
3. i_depth[a],每个样本,第a个输入的值,可能的取值的数量。如果所有的值都是二分,就不需要这个变量。显然是整型
4. i[a][b],第a个样本,第b个值的取值。是整型
5. o_depth,每个样本,答案可能的取值的数量。如果答案的值是二分,就不需要这个变量。显然是整型
6. o[a],第a个样本对应的答案。是整型
7. Po[a],样本中答案为a的概率。是浮点型
8. Pio[a][b][c],答案值为c时,第a个输入值为b的概率,即P{输入[a]=b|输出=c}。是浮点型
9. Poi[a][b][c],第b个输入为c时,答案值为a的相对概率,即K * P{输出=c|输入[a]=b},是浮点型
学习:
1. 拷贝所有样本的输入到i中,拷贝所有样本的答案到o中。
2. 根据样本计算所有Po、Pio、Poi
(c\c++,计算概率只需要该情况数简单求和,再除总数即可,实在太简单不再多做介绍,另外,,而可以当常数约去,不影响最后的大小比较,所以称Poi为相对概率,并非真实概率)
测试或使用:
学习结束后,只需保存Poi,即保存了学习结果,当然学习的样本与测试、使用的样本应该有相同的i_width、i_depth与o_depth(忘了这几个变量的含义看上方变量的意义)。
这里定义2个临时变量:
1. input[a],测试的一个样本中,第a个值的取值
2. tempP[a],根据input与Poi所得出,答案为a的相对概率。
然后
1. 拷贝输入的样本到input
2. 计算tempP:
3. 找到最大的tempP,其下标即为输出的答案。
最后:
写的比较匆忙,很多地方没有检查,我本人学习这些算法的时间也很短,如果存在任何问题,有任何意见或建议欢迎指出,我会马上进行更正。
另外,要深入理解一种算法,其具体原理和推导过程也是需要学习的。网上有太多这方面的文章,在这就不做详细解释。
谢谢。