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: 浙江大学.