加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

BP神经网络sim函数的MATLAB和C实现

(2014-04-02 19:16:49)
标签:

bp神经网络

matlab

c

tansig

it

分类: MATLAB
    这两天在用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循环。




0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有