%自适应过滤法模型一第六次修改
clc
clear
[filename,pathname]=uigetfile({'*.xlsx';'*.xls'},'请选择数据文件:');
LUJING=strcat(pathname,filename);
PD=LUJING(strfind(LUJING,'.'):length(LUJING));%裁切小数点后后缀名
if strcmp('.xlsx',PD)||strcmp('.xls',PD)
tic
[data,txt,raw]=xlsread(LUJING);
T=data(:,1);
xt=data(:,2);
p=input('请输入权数个数p=');
%标准化模块开始
for i=1:length(T)
xtp(i)=xt(i)^2;
if i<=p
at(i)=NaN;
continue;
end
at(i)=sum(xtp(i-p:i-1));
end
at=at';
at(1:p)=[];
bt=sqrt(at);
for i=1:p
xt21(:,i)=xt(i:length(xt)-p+i-1)./bt;
q(i)=1/p;%初始权数
end
x_New=xt(p+1:length(xt))./bt;
%标准化模块结束
%开启主迭代模块
%精度确定标准:以前一个大循环MSE除以后一个大循环MSE,也就是循环结束标志为精度趋向于1
JIAN=sort(x_New,'descend');%对标准化xt进行降序排列
k=1/sum(JIAN(1:p));%对降序排列的标准化xt去前p项值进行计算学习常数
%以下对k进行判别与选择
if k<=1/p
k=k;
else
k=1/p;
end
%以上判别结束,并返回k值
t=T(p+1:length(T));
J=input('\n精度确定标准:\n以新的大循环MSE除以旧的大循环MSE,\n也就是循环结束标志为精度趋向于1。\n请输入循环结束精度J=');
MSE=inf;%初始化MSE
C_MSE=0;%初始化精度
n=0;%初始化大循环次数
while C_MSE<J%&&C_MSE~=NaN
for i=1:length(t)
xt_G(i)=q*rot90(xt21(i,:));%rot90为逆时针旋转90度,对下一期进行估计
e(i)=x_New(i)-xt_G(i);%获得残差
Q=q+2*k*e(i)*rot90(xt21(i,:),2);%rot90(A,2)为逆时针旋转180度,其中Q为新的权数
q=Q;
end
n=n+1;%大循环计数器
A_Q(n,:)=Q;
Q_MSE=MSE;
MSE=sum(e.^2)/length(t);
A_MSE(n,:)=MSE;
C_MSE=MSE/Q_MSE;
end
fprintf(2,'************************************输出模块*********************************\n');
fprintf(2,'执行大循环次数:%d次\n',n);
fprintf(2,'执行总循环次数:%d次\n',n*(length(t)));
min_MSE=min(A_MSE);
fprintf('最小均方MSE=%d\n',min_MSE);
fprintf('残差标准差=%f\n',sqrt(min_MSE));
YOU_Q=A_Q(find(A_MSE==min_MSE),:);
if size((YOU_Q),1)>1
YOU_Q=YOU_Q(2,:);
else
YOU_Q=YOU_Q;
end
fprintf('最优权为:\n');
YOU_Q
fprintf(2,'******************对下一期进行预测*********************\n');
JISHU=length(xt);
YUCE=xt(JISHU-p+1:JISHU)'*rot90(YOU_Q);
fprintf(2,'第%d期的预测值为:%f\n',JISHU+1,YUCE);
toc
else
errordlg('读入数据文件格式错误!本程序仅支持excel文件');
end
fprintf(2,'\n**************湖南工程-统计学1301**********************\n');



雷达卡



京公网安备 11010802022788号







