最近看到很多会员需要使用MATLAB神经网络做如下的事情:

1:MATLAB神经网络对水的质量的分类、评估、预测 (属于环境类分类、评估预测)
2:MATLAB神经网络对空气质量的分类、评估、预测 (属于环境类分类、评估预测)
2:MATLAB神经网络对土壤质量的分类、评估、预测 (属于环境类分类、评估预测)
3:MATLAB神经网络对学员的个人表现进行分类、评估、预测 (属于个人业绩鉴定)
4:MATLAB神经网络对医学、生物学上的细胞、疾病等分类、评估等(属于医学、生物学)
5:MATLAB神经网络对交通、物流等效率方面的分类、评估、预测等(属于交通、物流管理)
6:MATLAB神经网络用于故障诊断
7:概括来讲,就是使用神经网络对某些指标(如空气质量、水质量、个人业绩等)进行“有限”的分类、预测、评价等。

在这里,我特别强调“有限”两个字,因为这正是模式识别工具箱可以解决的问题。我看到很多会员使用不同的神经网络(如模糊识别,RBF, SVM等)。根据我多年的使用经验,其实基于多层BP网络的模式识别是最容易实现、效果非常满意、且结果非常具有说服力。很多会员没有掌握模式识别的精髓,或者网络训练好以后不知道如何评估、使用等。现在我用一个完整的例子来给大家展示一下它的优点。

不知道什么是模式识别,什么是BP网络的会员,请先看一下这个视频:MATLAB模式识别工具箱视频教学

用MATLAB模式识别工具箱(函数)来对某些指标(如空气质量、水质量、个人业绩等)进行分类、评估、预测,分为三步:

  • 数据准备
  • 训练和评估
  • 预测

下面我来一步一步讲解,先谈数据的准备:

  • 确保输入数据(包括训练以及将来要预测的数据)在比较接近的范围里(归一化是其中一种方式)。

    这一个步骤不仅仅是在模式识别里,其实在任何一种网络里,这一步都是必须的。比如说你有400组数据,每组数据对应一个中国县城的空气质量。假设每组数据含有6个指标(称之为A,B,C,D,E,F,G), 如果数据A的范围是10^5-10^7, F的范围是0.1-0.5, 如果用这些数据来训练,很容易导致网络的权重也有同样的数量级的差别,结果是你的网络会非常的“敏感”(可以想象一下,如果F对应的权重是10^10,那么即使F稍微变化一下,都有可能导致网络的输出结果不同。而有时候这样的敏感度并不是你想要的,你可以对数据进行归一化处理,把数据都转换到0-1的区间内。

    MATLAB模式识别工具箱可以自动对输入数据进行归一化处理,所以你只要明白这个过程,但是并不需要你额外写程序来处理这些数据。

  • 对输出数据进行二进制量化

    通常情况下,用于测试的输入数据所对应的输出数据不是量化数据,比如说:优、良,或者是一级、二级等等。那么通常我们用二进制来表达,两位数字的二进制可以表示3类(01,10,11),三位数字的二进制可以表示7类(001,010,011,100,101,110,111,通常我们不使用000)。二进制的顺序不重要,比如说优可以对应001,也可以用010来表示。

    经过简单处理,输入数据和新添加的二进制输入数据如下图所示:

     
    登录/注册后可看大图
  • 把数据导入到MATLAB程序里
    1. close all
    2. clear all
    3. clc
    4. x=xlsread('training_data.xls',['B2:G401']);
    5. y=xlsread('training_data.xls',['I2:K401']);
    6. inputs = x';
    7. targets = y';

    复制代码

我们再谈谈网络的训练和评估:

  • 你可以使用MATLAB自带的模式识别工具箱界面(nprtool)来导入数据、调整参数等,然后得到结果。我通常第一次这样使用,得到一个基础架构以后,然后生成m代码,再在代码上修改。这里我演示给大家,如果通过程序来实现。
  • 下面是用来做模式识别的代码(工具箱产生的函数):
    1. % 创建一个模式识别网络(两层BP网络),同时给出中间层神经元的个数,这里使用20
    2. hiddenLayerSize = 20;
    3. net = patternnet(hiddenLayerSize);
    4. % 对数据进行预处理,这里使用了归一化函数(一般不用修改)
    5. % For a list of all processing functions type: help nnprocess
    6. net.inputs{1}.processFcns = {'removeconstantrows','mapminmax'};
    7. net.outputs{2}.processFcns = {'removeconstantrows','mapminmax'};
    8. % 把训练数据分成三部分,训练网络、验证网络、测试网络
    9. % For a list of all data division functions type: help nndivide
    10. net.divideFcn = 'dividerand';  % Divide data randomly
    11. net.divideMode = 'sample';  % Divide up every sample
    12. net.divideParam.trainRatio = 70/100;
    13. net.divideParam.valRatio = 15/100;
    14. net.divideParam.testRatio = 15/100;
    15. % 训练函数
    16. % For a list of all training functions type: help nntrain
    17. net.trainFcn = 'trainlm';  % Levenberg-Marquardt
    18. % 使用均方误差来评估网络
    19. % For a list of all performance functions type: help nnperformance
    20. net.performFcn = 'mse';  % Mean squared error
    21. % 画图函数
    22. % For a list of all plot functions type: help nnplot
    23. net.plotFcns = {'plotperform','plottrainstate','ploterrhist', ...
    24. 'plotregression', 'plotfit'};
    25. % 开始训练网络(包含了训练和验证的过程)
    26. [net,tr] = train(net,inputs,targets);
    27. % 测试网络
    28. outputs = net(inputs);
    29. errors = gsubtract(targets,outputs);
    30. performance = perform(net,targets,outputs)
    31. % 获得训练、验证和测试的结果
    32. trainTargets = targets .* tr.trainMask{1};
    33. valTargets = targets  .* tr.valMask{1};
    34. testTargets = targets  .* tr.testMask{1};
    35. trainPerformance = perform(net,trainTargets,outputs)
    36. valPerformance = perform(net,valTargets,outputs)
    37. testPerformance = perform(net,testTargets,outputs)
    38. % 可以查看网络的各个参数
    39. view(net)
    40. % 根据画图的结果,决定是否满意
    41. % Uncomment these lines to enable various plots.
    42. figure, plotperform(tr)
    43. figure, plottrainstate(tr)
    44. figure, plotconfusion(targets,outputs)
    45. figure, ploterrhist(errors)
    46. % Test the Network
    47. z=xlsread('dj.xls',['A1:F24']);
    48. testinputs= z';
    49. testoutputs = net(testinputs);

    复制代码

  • 网络训练的每次结果都有可能不一样,比如说第一次得到不太满意的结果(准确率低于80%):
     
    登录/注册后可看大图
  • 多训练几次,可以得到不错的结果(准确率达到97.5%):
     
    登录/注册后可看大图
  • 如果你对训练结果满意,请务必保存好网络,留着以后预测使用:
    1. %如果你对该次训练满意,可以保存训练好网络
    2. save('training_net.mat','net','tr');

    复制代码

最后我们讨论一下如何使用训练好的网络:

  • 首先确保你用来预测的输入数据,格式跟训练数据一样(否则肯定不能使用)。在上面的网络里,我们的每组输入数据含有6个指标,那么用来预测的数据,也必须符合以上要求。

    样本如下:

     
    登录/注册后可看大图
  • 目的是得到二进制输出,以及把二进制输出转换成对应的类别,并且写入到该Excel文件里。
  • 我们导入刚才已经保存好的网络
    1. clear all
    2. close all
    3. clc
    4. load 'training_net.mat'

    复制代码

  • 导入测试数据:
    1. %导入测试数据
    2. new_input = xlsread('new_data.xls',['A2:F25']);

    复制代码

  • 获得预测结果
    1. new_output = round(net(new_input'));

    复制代码

  • 把二进制预测结果写入到excel文件里
    1. xlswrite('new_data.xls',new_output','result','G2');

    复制代码

  • 把二进制对应的类别写入到excel文件里
    1. new_output=new_output';
    2. [r c]=size(new_output);
    3. my_category=zeros(r,1)
    4. for i=1:r
    5. my_category(i,1)=2^new_output(i,1)+2^new_output(i,2)+2^new_output(i,3);
    6. end
    7. xlswrite('new_data.xls',my_category,'result','K2');

    复制代码

  • 结果如下:
     
    登录/注册后可看大图
  • 看懂了么?希望能对你有所帮助

MATLAB模式识别基本操作函数解析相关推荐

  1. Matlab的filtfilt函数解析与C++实现

    Matlab的filtfilt函数解析与C++实现 0.前言 1.filtfilt函数的解析 1.1 主要流程 1.2 边界的延拓 1.3 边界效应的优化 1.4 滤波器系数获取 2.C++实现及对比 ...

  2. matlab中filtfilt函数解析

    紧接上一篇,简单分析matlab中的非常好用的 filtfilt 函数,一款零相移滤波函数. 其matlab中的语法如下: y = filtfilt(data,x); 非常简单,不是一般的简单!然而, ...

  3. MATLAB里sortrows是什么意思,Matlab中sortrows函数解析

    一.问题来源 返回检索到的数据(按相关度排序)在原始数据中的索引. 二.问题解析 x = [1 4 3 5; 1 3 2 6]:sortrows(x)其结果是按照row来排列,默认首先排第一列,1和1 ...

  4. 【matlab】:matlab的linspace函数解析

    大家点进来看这篇文章,很直白的目的就是想知道linspace这个函数该如何使用,我这里就简单的给大家讲下linspace函数如何使用 linspace函数是用来生成一组从a1到a2的等距的数据 用法为 ...

  5. Matlab中plot函数参数解析

    功能 二维曲线绘图 语法 1 2 3 4 5 6 7 plot(Y) plot(X1,Y1,...) plot(X1,Y1,LineSpec,...) plot(...,'PropertyName', ...

  6. Matlab中bsxfun和unique函数解析

    一.问题来源 来自于一份LSH代码,记录下来. 二.函数解析 2.1 bsxfun bsxfun是一个matlab自版本R2007a来就提供的一个函数,作用是"applies an elem ...

  7. rectpuls函数 matlab,Matlab中的rectpuls函数解析

    Matlab中的rectpuls函数解析 Matlab中的rectpuls函数解析 1.先看Matlab中的解释: This MATLAB function returns a continuous, ...

  8. matlab中频域信号IFFT,MATLAB中ifft函数用法、性质、特性-以及与fft的组合应用全面深入解析(含程序)...

    MATLAB中ifft函数用法.性质.特性,以及与fft的组合应用全面深入解析(含程序) 前言 在我之前的<MATLAB中fft函数用法.性质.特性.缺陷全面深入解析(含程序)>中,我已经 ...

  9. MATLAB函数解析:colormap——查看并设置当前颜色图

    MATLAB函数解析:colormap 语法 说明 示例 更改图窗的颜色图 将颜色图设置回默认值 对图窗中的每个坐标区使用不同的颜色图 指定颜色图的颜色数 创建自定义颜色图 返回用在绘图中的颜色图值 ...

  10. matlab stem 属性,matlab中stem函数用法_常见问题解析

    matlab中如何自定义图例_常见问题解析 matlab中自定义图例的方法:首先打开matlab软件:然后点击勾选按钮,新建一个文件并输入代码为"x = 0:pi/50:2*pi;" ...

最新文章

  1. Zookeeper学习总结2
  2. 2016/12summary
  3. C指针原理(15)-C指针基础
  4. 基于正样本的表面缺陷检测
  5. 手把手教你成为年薪60万的架构师
  6. c语言编程计算平分,用C语言编程平均分数
  7. 利用GridView显示主细表并添加打开、关闭功能
  8. 踩坑记录——ProxyServer删除问题经验分享
  9. 操作简单、功能务实——四维星软件
  10. Matlab实现图像识别(一)
  11. APtos 简介及机制
  12. 发现讯时CMS4.5的几个问题
  13. 【二】Centos 7.6下载与安装
  14. 使用多个路由器有线桥接实现无线漫游/Lan口连接
  15. vfp导出excel的简单方法
  16. Supporting Online Material for Lab Experiments for the Study of Social-Ecological Systems
  17. mac下修改文件的md5值
  18. WordPress安装短信宝短信插件教程
  19. 显著性检测论文解析2——Visual Saliency Detection Based on Bayesian Model, Yulin Xie, ICIP2011
  20. 项目管理之如何控制项目进度和质量

热门文章

  1. Python 2.7的新特性
  2. 关于ROS的设置问题
  3. java clone数组_Java中的数组有对应的类么,为什么数组可以直接调用clone()方法?...
  4. Servlet 实现验证码
  5. java代码sudo命令_讓Java程序運行sudo命令
  6. php实现小说字典功能_PHP实现微信小程序人脸识别刷脸登录功能
  7. c string erase_威刚推出SE770G移动固态硬盘:提供两年质保 附送双头USB-C
  8. int main(argc,char *argv[])的含义
  9. 兰州烧饼 NYOJ--779
  10. 小米Android OS特别高,干翻小米,最强定制安卓系统诞生?Color OS11表现如何