0
点赞
收藏
分享

微信扫一扫

数据的质量分析与预处理

郝春妮 2022-03-26 阅读 75
matlab
x=[1,3,2,4,2;2,3,3,4,1;NaN,1,NaN,2,1;1,2,3,1,2;1,3,2,3,1];

%这是一个含有两个缺失值的5*5矩阵

x=[1,3,2,4,2;2,3,3,4,1;987,1,878,2,1;1,2,3,1,2;1,3,2,3,1];

%这是一个有两个异常值的5*5矩阵

一、数据的质量分析

1、异常值的判别;

异常值是存在于数据集中、与其他数据差别极大的数据,通常通过箱型图来寻找异常值

boxplot(x);

%x可以是向量或者矩阵

boxplot函数将[q1 – 1.5(q3 – q1)]至[q3 + 1.5(q3 – q1)]范围之外的数据作为异常值(或离群值)

 

如图,出现的红色加号就是异常值,分别是给定矩阵x的第一列(第三个)元素987和第三列(第13个元素)878。

Q3 = prctile(x,75);

%上四分位

Q1 = prctile(x,25);

%下四分位。

IQR = Q3-Q1;

%四分位距

y = find(x>Q3+1.5*IQR | x<Q1-1.5*IQR)

%上极限和下极限,超过的就是异常值,这个y就是异常值的索引(先从上到下,再从左到右)

这种方法从根源解决了找异常值的办法,y就是异常值的索引,需要异常值的值索引矩阵即可

2、缺失值的判别;

给定的数据集可能缺少一些数据,这些数据对于matlab会显示为NaN,我们得想办法找出。

z = isnan(x);		 

%对于矩阵x,产生一个规格相同的矩阵z,z的1的位置为x的缺失值

z1=find(z==1)

%用find找出缺失值索引

二、数据预处理

1、数据清洗;

1)缺失值的处理

a、直接剔除缺失值

i=find(~isnan(x));

%isnan(x)可以把矩阵中NaN返回成1,其他地方返回为0;find(~x)可以把所有为0的元素的索引赋给i;

%这个语句整体的意思就是把x的有效元素的索引赋给i

x=x(i);

%把矩阵x中所有为0的元素赋给x

x=x(~isnan(x));

b、一维插值处理缺失值

[m,n]=size(x);

%把矩阵的列数赋值给n

for i=1:n

    b=x(:,i);

%把含有缺失值的第i列提出赋值给b

    times=1:length(b);


    mask=~isnan(b);

    c=b;

    c(~mask)=interp1(times(mask),x(mask),times(~mask));

%用interp1函数做一维插值

    x(:,i)=c;

end

x

2)异常值的处理

a、直接剔除异常值

[n,p]=size(x);

for c=1:p

    c_x=x(:,c);         %依次将样本数据表中变量一列一列赋值给c_x

    Q3 = prctile(x,75);

    %上四分位

    Q1 = prctile(x,25);

    %下四分位。

    IQR = Q3-Q1;

    j=1; %i为行,j为列

    for i=1:n

        if c_x(i,:)>Q3+1.5*IQR | c_x(i,:)<Q1-1.5*IQR

            c_x(i,:)=0;          %将异常值赋值为0,这个0可以改成任何夸张的数

            c_tbj(j,c)=i;        %标记异常数据的坐标

            j=j+1;

        end
    end

    ty_x(:,c) = c_x;     %将剔除异常数据后的变量依次一列一列填入ty_x

end

ty_x;%这个矩阵和x的规格完全一样,但是异常值全都变成了指定值

num=n*p;

%将矩阵的元素数量赋值给num,方便索引

u=1;

%设置一个新向量来储存剔除异常值后的数据

for k=1:num

    if ty_x(k)~=0

        real(u)=ty_x(k);

        u=u+1;

    end

%把所有不等于预设值(正常值)排成一个行向量

end

real=real'%将行向量换成列向量方便使用

b、用一维插值处理异常值

先把异常值全部换成缺失值,再按缺失值处理即可

c、三种去噪法

c.1:高斯去噪

a=rand(100,1); %创建一个随机矩阵 

b=smoothdata(a); %使用该函数对数据进行简单的平滑处理。

plot(a);

hold on

plot(b);

c.2:均值去噪

a=rand(100,1);%创建一个随机矩阵 

b=movmean(a,5);%这个5放在这儿不要管

plot(a);

hold on

plot(b);%黄色为移动平均值求出的平滑曲线

c.3:中位数去噪

a=rand(100,1);%创建一个随机矩阵 

b=movmedian(a,5);

plot(a);

hold on

plot(b);%黄色为移动平均值求出的平滑曲线

举报

相关推荐

0 条评论