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);%黄色为移动平均值求出的平滑曲线