这两天在用SVM进行分类,发现效果一直不好,偶然用BP神经网络,发现分类效果很好。同时,由于要使用C++写界面,很希望实现神经网络的matlab和C的混合编程,问了度娘以后,发现不可以,解释见如下链接:
http://www.ilovematlab.cn/thread-103075-1-1.html
通过尝试后,决定采用“曲线救国”的方式,即利用matlab进行训练,再利用C手动编写,实现用于预测结果的sim函数。训练中采用newff函数建立神经网络net,输入层的传递函数为tansig,隐含层的传递函数为purelin.(若输入层采用logsig函数,方法类似)。
以三层BP神经网络为例,sim函数的matlab实现如下:
function out =
MyBPSim(net,Test_data)
%Test_data,待分类的数据,每行表示一个特征向量
IW = net.IW{1,1};
% net是训练得到的网络,IW表示隐含层的权矩阵
% 维数 =
隐含层神经元个数 * 特征数
LW = net.LW{2,1};
% LW表示隐含层权矩阵,维数 = 1 * 隐含层神经元个数
b1 = net.b{1,1}
% 输入层的阈值
b2 = net.b{2,1}
% 隐含层的阈值
n1 = (IW * Test_data) +
b1;
out1 = 2/(1 + exp(2 *
n1)) - 1; %
tansig函数的表达式,out1表示输入层的输出结果
out2 = LW * out1 + b2;
%
purelin函数就是形如 y = x,所以直接可以得到out2
end
以上即为sim函数的matlab形式,有一点需要注意的是,《MATLAB智能算法——30个案例分析》这本书的第25章P238存在错误,其中的式25-3
和式25-4中的减号应改为加号,否则与实际结果有较大误差。
C语言对sim的实现与以上程序类似,需要注意的是矩阵的乘法,由于matlab采用了优化,所以其计算矩阵乘法的速度相对于C要快很多,我没有找到很好的解决方法,采用的仍然是无脑的for循环。