MATLAB实现四分位法--数据清洗(实测可用)


程序进行了更新,实测可用


理论基础

四分位法是分析数据集分布特征的重要方法之一,是指通过 3 个数据点将一个按大小
顺序排好的数据样本序列平均划分成四部分的,每部分包含的数据量是整个序列数据量的
四分之一。
在这里插入图片描述
四分位法的理论如下图所示,参考刘芳《风电功率预测数据集的建立》的论文。她论文中的部分描述出错意见直接看张军凯《 风电功率预测算法研究》的理论部分。这里我懒得改了。
在这里插入图片描述

根据风速剔除风电功率故障的数据

程序实现

%% 按照新的论文进行编程

clc,clear,close all;

% p=xlsread('treated_data.xlsx','fp');
p=xlsread('风速功率.xlsx','B2:C4001');
figure()
scatter(p(:,1),p(:,2))


B=p(:,2);
[a,b]=sort(B);
oldlt=0;
lengthdata=[];
p_b=40;
%% 构造三维数组

for i=p_b:p_b:max(B) %% 将数据分成40块,

    lt=length(find(a<i));%% 数据分组,这个需要根据自己数据的大小决定
    eval(['n',num2str(i),'=a(oldlt+1:lt);'])
    eval(['lengthdata=[lengthdata,length(n',num2str(i),')];'])
    oldlt=lt;
end
%% 奇偶数
IA=[];
IB=[];
for i=1:length(lengthdata)
    if mod(lengthdata(i),2)==0 %% 总数是偶数时
        eval(['n=n',num2str(p_b*i),';'])
        %% 找出对应的风速序列
        if i~=1
             fp_data = p(b(1+sum(lengthdata(1:i-1)):sum(lengthdata(1:i))));
        else
            fp_data = p(b(1:lengthdata(i)));
        end
        [fp_a,fp_b]=sort(fp_data);%% 对风速按照从小到大顺序排序
        nn=fp_a;
        %%
        ln=length(nn);
        if ln~=0
            Q2L = xunzhaozhongweishu(nn);
            newts1 = nn(1:ln/2);
            newts2 = nn(ln/2+1:end);
            Q1L = xunzhaozhongweishu(newts1);
            Q3L = xunzhaozhongweishu(newts2);
%             Q2L=mean([n(ln/2),n(ln/2+1)]);
%             if mod(lengthdata(i),4)==0 %%总数时4的倍数
%                 Q1L=mean([n(ln/4),n(ln/4+1)]);
%                 Q3L=mean([n(ln*3/4),n(ln*3/4+1)]);
%             else                        %%%总数不是4的倍数
%                 Q1L=n((ln/2+1)/2);
%                 Q3L=n((ln/2+1)/2+ln/2);
%             end
            IRL=Q3L-Q1L;
            eval(['ia',num2str(i-1),'=find(nn<Q1L-1.5*IRL);'])
            eval(['ib',num2str(i-1),'=find(nn>Q3L+1.5*IRL);'])
            ia=fp_b(find(nn<Q1L-1.5*IRL));
            ib = fp_b(find(nn>Q3L+1.5*IRL));

            %% 直接剔除数据
%             iab = [ia;ib];
%             fp_data(fp_b(iab))=[];
%             eval(['n',num2str(p_b*i),'(fp_b(iab))=[];'])
            %%
        end
    end
       if mod(lengthdata(i),2)~=0  %%% 总数是奇数时
        eval(['n=n',num2str(i*p_b),';'])
        %% 找出对应的风速序列
        if i~=1
            fp_data = p(b(1+sum(lengthdata(1:i-1)):sum(lengthdata(1:i))));
        else
            fp_data = p(b(1:lengthdata(i)));
        end
        [fp_a,fp_b]=sort(fp_data);%% 对风速按照从小到大顺序排序
        nn=fp_a;
        %%
        ln=length(nn);
        if ln~=0
            Q2L = xunzhaozhongweishu(nn);
            if mod(lengthdata(i),4)==1  %%除4取余为1时
                newts_k = (ln-1)/4;
                Q1L=0.25*nn(newts_k)+0.75*nn(newts_k+1);
                Q3L=0.75*nn(3*newts_k+1)+0.25*nn(3*newts_k+2);
            else                          %% 除4取余为3时
                newts_k = (ln-3)/4;
                Q1L=0.75*nn(newts_k+1)+0.25*nn(newts_k+2);
                Q3L=0.25*nn(3*newts_k+2)+0.75*nn(3*newts_k+3);
            end
                IRL=Q3L-Q1L;
                eval(['ia',num2str(i-1),'=find(n<Q1L-1.5*IRL);'])
%                 ia=find(n<Q1L-1.5*IRL);
                eval(['ib',num2str(i-1),'=find(n>Q3L+1.5*IRL);'])
%                 ib = find(n>Q3L+1.5*IRL);
                ia=fp_b(find(nn<Q1L-1.5*IRL));
                ib = fp_b(find(nn>Q3L+1.5*IRL));
        end
       end
    %% 对异常数据进行剔除
    %% 还原到a的对应的标签值
    if i ==1
        IA=[IA;ia];
        IB=[IB;ib];
    else
        if length(ia)~=0
            IA=[IA;sum(lengthdata(1:i-1))+ia];
        end
        if length(ib)~=0
            IB=[IB;sum(lengthdata(1:i-1))+ib];
        end
    end
end
I = b([IA;IB]);
p1=p(:,2);
p1(I)=[];
p2=p(:,1);
p2(I)=[];
% for i =1:length(I)
%     p1(I(i)) =(p(I(i)-1)+p(I(i)+1))/2;
% end

figure()
scatter(p2,p1)
%% 寻找中位数的函数
function zws = xunzhaozhongweishu(data)
n = data;
ln=length(n);
if mod(ln,2)==0 %% 总数是偶数时
    if ln~=0
        Q2L=mean([n(ln/2),n(ln/2+1)]);
    end
else
    if ln~=0
        Q2L=mean(n((ln+1)/2));
    end
end
zws = Q2L;
end

在这里插入图片描述
实际应用时还需根据风电功率提出风速存在问题的,就根据处理后的数据将两者调换再处理一次即可。


参考文献
[1]刘芳. 基于改进BP神经网络的风电功率预测方法研究[D].浙江大学,2020.
[2]张军凯, 风电功率预测算法研究 [D], 2019: 浙江大学.

评论 14
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值