BP神经网络sim函数的MATLAB和C实现
这两天在写论文,天天写程序,没什么新脑洞,而且最近也遇到不少事。手动转载一下几篇新浪博客的文章,有几篇的阅读量和转载还挺不错。。。只是当时的文风也是醉了。
第一篇是“BP神经网络sim函数的MATLAB和C实现” (原文链接),争取做一些改写,尤其在排版上规范一点。
问题描述
BP神经网络属于ANN的一种,相对于DNN,CNN而言,是比较浅层的分类器。不过BPNN由于参数比较少,网络简单,还是有广泛的应用,尤其在传统的人工特征提取加分类器的算法中。因为这篇文章是在本科毕业设计的时候写的,当时还用了SVM,这里插一句我的观点,“SVM虽然调参比较复杂,网格法耗时,GA又存在局部最优的问题,但如果特征选择比较合理,它的表现还是非常有竞争力的”。
言归正传,由于要使用C++写界面,很希望实现神经网络的MATLAB和C的混合编程,问了度娘以后,发现不可以,因为MATLAB的神经网络库有专利,具体的解释见http://www.ilovematlab.cn/thread-103075-1-1.html
经过多次尝试后,决定采用“曲线救国”的方式,即利用MATLAB进行训练,再手动编写C代码,实现用于预测结果的sim函数。本次网络,采用newff函数建立神经网络net,输入层的传递函数为tansig,隐含层的传递函数为purelin.(若输入层采用logsig函数,方法类似)。注意: newff在新的MATLAB版本中已经有更新,具体更新可以去官网看。推荐《MATLAB神经网络43个案例分析》
下面以三层BP神经网络为例,sim函数的MATLAB实现如下:
|
|
有一点需要注意的是,《MATLAB智能算法——30个案例分析》 这本书的第25章P238存在错误,其中的式25-3和式25-4中的减号应改为加号,否则与实际结果有较大误差。
C语言对sim的实现与以上程序类似,需要注意的是矩阵的乘法,由于matlab采用了优化,所以其计算矩阵乘法的速度相对于C要快很多,我没有找到很好的解决方法,采用的仍然是无脑的for循环, C++代码样例如下,