楼主: Bonnsecret
4052 1

[MATLAB] matlab个人学习笔记:数据清理 [推广有奖]

  • 2关注
  • 16粉丝

讲师

35%

还不是VIP/贵宾

-

威望
0
论坛币
5090 个
通用积分
74.4937
学术水平
72 点
热心指数
91 点
信用等级
54 点
经验
9636 点
帖子
282
精华
0
在线时间
512 小时
注册时间
2014-5-28
最后登录
2024-4-15

+2 论坛币
k人 参与回答

经管之家送您一份

应届毕业生专属福利!

求职就业群
赵安豆老师微信:zhaoandou666

经管之家联合CDA

送您一个全额奖学金名额~ !

感谢您参与论坛问题回答

经管之家送您两个论坛币!

+2 论坛币
所用的书是Matlab data analysis。学习的结果跟大家分享一下。其中所用的数据都可以在matlab中直接加载。

       分析数据的第一部是数据清理。首先可以将数据放在图上,看数据是否存在某些特征会使影响分析的结果。比如通过观察可以确定是否存在缺失值、异常值、时间趋势,以及数据是否平稳。如果存在这些问题,就要通过相应的方法对数据进行修正。处理完之后的数据才可以正式的进入分析。

    处理缺失值需要根据数据的具体情况来定:是直接忽略缺失值,还是用插值法(interpolation)来弥补缺失值。Matlab里边缺失值使用NaN来表示的。如果数据里边包含NaN,matlab不会发出警告,而是仍然按照你的编程进行运算。最后导致结果异常。以前计算逆矩阵的时候就遇到过这种情况,因为数据中存在NaN,导致矩阵不可逆。有时候直接从excel里边导入的数据,缺失值是用0来表示的。这个时候在matlab中不再显示NaN。但是在运算过程中有可能产生NaN,导致最后结果异常。

     对于缺失值NaN,如果要直接忽略的话,一般是用方程isnan来识别NaN,然后再进行替代。假设矩阵x中包含NaN,有下面几种方法可以去除NaN:

  1. >>i=find(~isana(x));      
  2. >>x=x(i)                %第一个命令首先识别那些不等于NaN的矩阵中要素的编号,然后第二个命令就要求只保留这些编号的要素。
  3. >>x=x(~isnan(x));         %可以直接去除NaN。
复制代码


或者:

>>x(isnan(x))=[];

如果要去除包含NaN的行:

>>x(any(isnan(x),2),:)=[];

如要用插值法替代NaN,可以用interp1这个方程,就是一维的插值方程。举个例子:

对于矩阵a=[8  1  6;  3  NaN  7;  4  9  2]。

>>b=a(:,2);

>>times=1:length(b);

>>mask=~isnan(b);

>>c=b;

>>c(~mask)=interp1(times(mask),a(mask),times(~mask));

     这是利用matlab的内置方程vq=interp1(x,v,xq)。其中x表示的插值法取值的点,v包含了相应的点的值,xq表示需要插值的点。因此,在使用这个方程之前,要对上述三个方面进行定义。该方程默认的是线性插值法,其他的选项可以参见matlab documentation center。


      处理异常值也要求对数据的生成过程有清楚的了解,为什么会有异常值产生。因为异常值也包含了重要的样本信息,因此是否要去掉异常值要慎重考虑。通常定义异常值是与样本标准差的差值大于3个标准差,也就是3 sigma准则。虽然去掉异常值对样本的均值影响很小,但是对标准差的影响很大。去掉异常值,有可能会引起标准差很大的变化,有可能产生更多的异常值。


    时间序列的数据在分析之前要进行滤波。Matlab内置的一维滤波方程为:

y=filter(b,a,x)

被滤波的数据为x,滤波子用b和a来描述。滤波使用的是差分方程。举个简单的例子,移动平均滤波。假设移动平均的窗口宽度为4,则

b=[1/4  1/4 1/4  1/4];

a=1;

加载数据

>>loadcount.dat

>>x=count(:,1);         %被滤波的数据

>>y=filter(b,a,x);

画图,查看一下滤波的结果:

>>t=1:length(x);

>>plot(t,x,’-.’,t,y,’-‘),gridon;

>>legend(‘OriginalData’, ‘Smoothed Data’, 2);

消除时间序列中的趋势也是常用的数据清理方法。消除趋势使用的是matlab的内置方程:

y=detrend(x)

其中x是要被去除趋势的数据。方法是首先用最小二乘拟合数据,得出一个线性的方程,然后从原始数据中减去拟合值。

所举的例子是消除股票市场数据中的线性趋势(不是说趋势一定是线性的,但是仅以消除线性趋势为例):

  1. >>loadpredict_ret_data.mat
  2. >>sdata(any(isnan(sdata),2),:)=[];    %sdata中存在NaN,需要消除
  3. >>t=length(sdata);
  4. >>plot(t, sdata,’+’);  %先观察一下原始数据
  5. >>legend(‘OriginalData’, 1);
  6. >>xlabel(‘Time(days)’);
  7. >>ylabel(‘StockPrice (dollars)’);
  8. >>detrend_sdata=detrend(sdata);  
  9. >>figure;
  10. >>plot(detrend_sdata,’-‘);   %观察去除线性趋势后的数据,基本上是以0为中心。
  11. >>legend(‘DetrendedData’, 2);
  12. >>xlabel(‘Time(days)’);
  13. >>ylabel(‘DetrendedStock Price (dollars)’);
复制代码


二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

关键词:MATLAB matla atlab 学习笔记 数据清理 清理 matlba 学习笔记 数据清理

已有 1 人评分经验 论坛币 收起 理由
niuniuyiwan + 60 + 60 精彩帖子

总评分: 经验 + 60  论坛币 + 60   查看全部评分

本帖被以下文库推荐

沙发
niuniuyiwan 在职认证  发表于 2015-10-30 23:23:36 |只看作者 |坛友微信交流群
感谢楼主分享!

使用道具

您需要登录后才可以回帖 登录 | 我要注册

本版微信群
加好友,备注jltj
拉您入交流群

京ICP备16021002-2号 京B2-20170662号 京公网安备 11010802022788号 论坛法律顾问:王进律师 知识产权保护声明   免责及隐私声明

GMT+8, 2024-4-27 15:11