首页/文章/ 详情

Matlab数据预处理技巧分享

3年前浏览2804

 image.png

 过冷水诚挚邀请你加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载,qq:927550334 

QQ图片20210424105303.png

经常使用matlab绘图或者做计算自然而然遇到一个很基础的步骤,数据处理,本期过冷水就和大家分享一下matlab数据预处理技巧。

平滑&插值

过冷水再做计算过程中会得到一组数据,对该数据做积分运算。首先就需要做数据拟合,所以自然就会涉及的数据的平滑处理和插值。

image.png 

过冷水在这里使用的就是fit拟合函数的光滑模式

fun = fit( rawdata(:,1),rawdata(:,2),'*oothingspline' )

    该方法可以很好的给出数据的解析式Fun,可用该函数数据范围内任意值的计算,该函数的用法过冷水在往期讲的比较多了,就不在讲了,在学习过程中,过冷水还有接触到其它函数,过冷水在这里和大家一起学习一下,开阔思路。

yy=s*ooth(y)

利用一定平均滤波器对向量y进行平滑处理,返回等长的向量yy具体计算方法为:

image.png

image.png 

原程序

t=linspace(0,2*pi,500)';
y=100*sin(t)
noise=normrnd(1,15,500,1)
y=y noise
yy=s*ooth(y)
figure1 = figure;
subplot1=subplot(1,2,1,'Parent',figure1);
hold(subplot1,'on');
plot(t,y,'Parent',subplot1,'MarkerFaceColor',[1 0 0],'MarkerSize',8,'LineWidth',3);
ylabel(subplot1,'$y$','FontSize',30,'Interpreter','latex');
xlabel(subplot1,'$x$','FontSize',30,'Interpreter','latex');
hold(subplot1,'off');
title(subplot1,'原数据');
set(subplot1,'FontSize',20,'LineWidth',3);
subplot2=subplot(1,2,2,'Parent',figure1);
hold(subplot2,'on');
plot(t,yy,'Parent',subplot2,'MarkerFaceColor',[0 0 1],'MarkerSize',8,'LineWidth',3);
ylabel(subplot2,'$y$','FontSize',30,'Interpreter','latex');
xlabel(subplot2,'$x$','FontSize',30,'Interpreter','latex');
hold(subplot2,'off');
title(subplot2,'平滑数据');
set(subplot2,'FontSize',20,'LineWidth',3);

medfilt1

Matlab信号处理模块可以使用medfilt1函数对原信号数据进行中值滤波处理

y=medfilt1(x,n)

    对向量x进行一维中值滤波,返回与x等长的向量y。这里的n是窗宽参数,n是奇数,y的第k个元素等于x的第k-(n-1)/2个元素至k (n-1)/2元素的中位数;当n为偶数,y的第k个元素等于x的第k-(n)/2个元素至k (n)/2-1元素的中位数;

image.png 

原程序

t=linspace(0,2*pi,500)';
y=100*cos(t)
noise=normrnd(1,15,500,1)
y=y noise
yy=medfilt1(y,30)
figure1 = figure;
subplot1=subplot(1,2,1,'Parent',figure1);
hold(subplot1,'on');
plot(t,y,'Parent',subplot1,'MarkerFaceColor',[1 0 0],'MarkerSize',8,'LineWidth',3);
ylabel(subplot1,'$y$','FontSize',30,'Interpreter','latex');
xlabel(subplot1,'$x$','FontSize',30,'Interpreter','latex');
hold(subplot1,'off');
title(subplot1,'原数据');
set(subplot1,'FontSize',20,'LineWidth',3);
subplot2=subplot(1,2,2,'Parent',figure1);
hold(subplot2,'on');
plot(t,yy,'Parent',subplot2,'MarkerFaceColor',[0 0 1],'MarkerSize',8,'LineWidth',3);
ylabel(subplot2,'$y$','FontSize',30,'Interpreter','latex');
xlabel(subplot2,'$x$','FontSize',30,'Interpreter','latex');
hold(subplot2,'off');
title(subplot2,'平滑数据');
set(subplot2,'FontSize',20,'LineWidth',3);


    过冷水新学习的数据平滑处理的函数就是以上几个,大致上差不多,但又有不同的地方,最好是针对不同数据类型选用对应的函数平滑处理,而不fit( x,y,'*oothingspline' )到底,在某些情况下有可能会失真。

数据标准化变换

对于多元数据,当各变量的量纲和数量级不一致时,往往需要对数据进行变换处理,以消

除量纲和数量级的限制,过冷水在做做神经网络工作时候,各变量之间量纲不一样,为了使得构建一个合理矩阵就需要做数据变换。以便进行后续统计分析。标准化变换和极差归一化变换是比较常用的方式。

标准化变换公式


image.png


zscore函数为标准化变化函数,调用格式为:

rand('seed',1);
x=[rand(5,1),5*rand(5,1),10*rand(5,1),500*rand(5,1)]
[xz,mu,sigma]=zscore(x)
x0=bsxfun(@plus,bsxfun(@times,xz,sigma),mu)%逆标准化变换
x =
    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390
xz =
    0.8641    1.5868   -0.9347   -1.1208
    0.5460   -0.5145    0.1286   -0.8787
   -0.1220   -0.6487   -1.1146    0.1862
   -1.6714    0.3826    1.0672    0.5239
    0.3833   -0.8062    0.8535    1.2895
mu =
0.3705    1.3062    4.3760  248.7203
sigma =
 0.1648    1.4116    2.6259   29.2518
x0 =
    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390

极差归一化变换公式

image.png


代码

rand('seed',1);
x=[rand(5,1),5*rand(5,1),10*rand(5,1),500*rand(5,1)]
dim=1;
xmin = min(x,[],dim);
xrange = range(x,dim);
xrange0 = xrange;
xrange0(xrange0==0) = 1;
R = bsxfun(@minus,x, xmin);
R = bsxfun(@rdivide, R, xrange0)
 
x =
 
    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390
 
 
R =
 
    1.0000    1.0000    0.0824         0
    0.8745    0.1219    0.5698    0.1005
    0.6111    0.0658         0    0.5422
         0    0.4968    1.0000    0.6824
0.8104         0    0.9020    1.0000

mapminmax函数

    在matlab神经网络建模中还有mapminmax函数也可以作为数据映射变换

[Y,PS]=mapminmax(x,xmin,xmax)
x=mapminmax('reverse',Y,PS)

mapminmax函数可以将矩阵X中每行数据映射到区间[xmin,xmax]内,代码案例

rand('seed',1);
x = [rand(5,1), 5*rand(5,1), 10*rand(5,1), 500*rand(5,1)]
[y,Ps] = mapminmax(x', 0, 1);
x0 = mapminmax('reverse',y,Ps)' 
x =
 
    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
    0.4337    0.1681    6.6171  286.4390
x0 =
    0.5129    3.5462    1.9215  215.9352
    0.4605    0.5798    4.7136  223.0174
    0.3504    0.3904    1.4492  254.1658
    0.0950    1.8463    7.1784  264.0439
0.4337    0.1681    6.6171  286.4390

    本期过冷水想要分享的使用数据处理方法就是这么多,读者在应用过程,有遇到其它比较常用的数据处理方法,可以留言分享,过冷水也会在后期详细分享等多的数据处理方法。

图片

        过冷水发表于 仿真秀 平台原创文章,未经授权禁止私自转载,如需转载请需要和作者沟通表明授权声明,未授权文章皆视为侵权行为,必将追责。如果您希望加入Matlab仿真秀官方交流群进行Matlab学习、问题咨询、 Matlab相关资料下载均可加群:927550334。

精品回顾

 matlab绘制农夫过河动态图

分子动力学的原子空间运动轨迹演示编程

过冷水带你用matlab制作演示动画

python批量移动文件&重命名代码分享

过冷水和你分享 matlab读取存储各种文件的方法 文末有独家金曲分享

image.png

附件

50积分data_processing.rar
MATLAB
著作权归作者所有,欢迎分享,未经许可,不得转载
首次发布时间:2021-07-21
最近编辑:3年前
过冷水
博士 | 讲师 讨论号:927550334
获赞 361粉丝 184文章 107课程 11
点赞
收藏
作者推荐
未登录
还没有评论
课程
培训
服务
行家
VIP会员 学习 福利任务 兑换礼品
下载APP
联系我们
帮助与反馈