matlab简单统计学预测方法分析

 基础的统计学预测方法分析,内容参考国防工业出版社-司守奎,孙玺菁主编-《数学建模算法与应用(第三版)》。本文结合实际应用对文章内容进行了提取,结合matlab算法进行程序编写。

本文所涉及的所有代码内容可通过百度网盘进行下载:下载地址

统计学预测方法Statistical data prediction methods

Contents

  • 1.典型微分方程、指数平滑法和灰色预测
  • 1.1.典型微分方程
  • 1.2.指数平滑法
  • 1.3.灰色预测
  • 2.马尔可夫预测Markov predicted
  • 3.ARIMA预测ARIMA Forecast
  • 3.1.平稳性Daniel检验
  • 3.2.自相关系数与偏自相关系数
  • 3.3.ARIMA
  • 4.插值与拟合Interpolation and fitting
  • 4.1.插值
  • 4.2.拟合

1.典型微分方程、指数平滑法和灰色预测

Typical differential equation, exponential smoothing method and grey prediction

1.1.典型微分方程

微分方程是数学建模的重要方法,许多实际问题的数学描述将导致微分方程的定解问 题。列方程常见的类型有3种:(1)按规律直接列方程;(2)微元分析与区域积分;(3) 模拟近似法。 在各类学科都有很多经过实践检验的规律和定律可以列写微分方程,如牛顿运动定律、 基尔霍夫电流电压定律、物质放射性规律、曲线切线性质等。

例(物体冷却过程):牛顿冷却定律指出,当物体表面与周围存在温度差时,单位时间 内从单位面积散失的热量与温度差成正比,比例系数为热传递系数,记为k,试建立 相关传热模型。我们使用2018年全国大学生数学建模国赛A题第一问进行一些分析:

(2018数学建模国赛A.1)高温作业服可避免人们在高温环境下作业受到灼伤。防护服分 为4层,其中Ⅰ、Ⅱ、Ⅲ层为织物制造,第Ⅳ层为织物与皮肤之间的空气间隙;第Ⅰ 层直接与外部环境接触,假人体内恒温为 37℃,外界温度为75℃。试建立非稳态传热 模型,反应不同时间节点的传热情况。 数据见文件:data1。

利用文件中附件1信息可以建立逻辑严密的热传导模型,读者不妨思考,可不可以只 用附件1有关厚度信息,忽略边界效应直接利用牛顿冷却建立微分方程,利用优化算法 去逼近附件2中数据呢?答案是可行的。 设最外层防护服与空气间热传递系数为k0,Ⅰ、Ⅱ、Ⅲ、Ⅳ层内部热传递系数分别为 k1,k2,k3,k4,Ⅳ与皮肤间热传递系数为k5,问题变为建立模型,求Ⅳ靠近皮肤的表面 温度,使其值逼近附件2。 可编写如下程序建立简单的传热模型:

clear,clc
k0=1;k1=0.99;k2=0.98;k3=0.9;k4=0.99;k5=0.01;% 传热系数
d=[0.6,0.6,3.6,0.6];% 厚度设置
d1=cumsum(d);
dx=[1e-2,1e-2,1e-1,1e-2];% 厚度微元设置
tw=75;% 外部温度75
tn=37;% 假人温度37
u1=tn*ones(1,length(0:dx(1):d1(1)));
u2=tn*ones(1,length(d1(1):dx(2):d1(2)));
u3=tn*ones(1,length(d1(2):dx(3):d1(3)));
u4=tn*ones(1,length(d1(3):dx(4):d1(4)));% 防护服温度初始化
tm=5400;% 总时间
u=zeros(1,tm);
for t=1:tm
    tic
    for i=1:length(0:dx(1):d1(1)) % 第一层防护服温度迭代
        if(i==1)
            deltau=-k0*(u1(i)-tw)-k1*(u1(i)-u1(i+1));
            u1(i)=u1(i)+deltau;
        elseif(i==length(0:dx(1):d1(1)))
            deltau=-k1*(u1(i)-u1(i-1))-k2*(u1(i)-u2(1));
            u1(i)=u1(i)+deltau;
        else
            deltau=-k1*(u1(i)-u1(i-1))-k1*(u1(i)-u1(i+1));
            u1(i)=u1(i)+deltau;
        end
    end
    for i=1:length(d1(1):dx(2):d1(2)) % 第二层防护服温度迭代
        if(i==1)
            deltau=-k1*(u2(i)-u1(end))-k2*(u2(i)-u2(i+1));
            u2(i)=u2(i)+deltau;
        elseif(i==length(d1(1):dx(2):d1(2)))
            deltau=-k2*(u2(i)-u2(i-1))-k3*(u2(i)-u3(1));
            u2(i)=u2(i)+deltau;
        else
            deltau=-k2*(u2(i)-u2(i-1))-k2*(u2(i)-u2(i+1));
            u2(i)=u2(i)+deltau;
        end
    end
    for i=1:length(d1(2):dx(3):d1(3)) % 第三层防护服温度迭代
        if(i==1)
            deltau=-k2*(u3(i)-u2(end))-k3*(u3(i)-u3(i+1));
            u3(i)=u3(i)+deltau;
        elseif(i==length(d1(2):dx(3):d1(3)))
            deltau=-k3*(u3(i)-u3(i-1))-k4*(u3(i)-u4(1));
            u3(i)=u3(i)+deltau;
        else
            deltau=-k3*(u3(i)-u3(i-1))-k3*(u3(i)-u3(i+1));
            u3(i)=u3(i)+deltau;
        end
    end
    for i=1:length(d1(3):dx(4):d1(4)) % 第四层防护服温度迭代
        if(i==1)
            deltau=-k3*(u4(i)-u3(end))-k4*(u4(i)-u4(i+1));
            u4(i)=u4(i)+deltau;
        elseif(i==length(d1(3):dx(4):d1(4)))
            deltau=-k4*(u4(i)-u4(i-1))-k5*(u4(i)-tn);
            u4(i)=u4(i)+deltau;
        else
            deltau=-k4*(u4(i)-u4(i-1))-k4*(u4(i)-u4(i+1));
            u4(i)=u4(i)+deltau;
        end
    end
    toc
    u(t)=u4(end);% 第四层靠近皮肤表面温度
end
此时需要做的工作是利用最小二乘编写优化算法,优化各层传热系数,使其逼近附件2值即可。
例(导弹追击问题):设为一导弹发射点A(0,0),(0,10)处有目标物向右以恒定速率v运动,0时刻处发射一枚导弹以2v的速度追赶目标物,试通过编程,输入b、v,输出导弹动态路线。
clear,clc
b=input('请输入初始时刻目标物的高度:');
v=input('请输入目标物运动速度大小:');
m=0;% 目标物横坐标
q=0;% 导弹横坐标
p=0;% 导弹纵坐标
dt=1;% 时间微元
for i=1:1000
    plot(m,b,'b*-',p,q,'rx--');% 绘制当前导弹和目标物位置
    axis([0,p+10,0,b+1]);
    hold on
    pause(0.2);% 动态显示
    m=m+v*dt;% 目标物横坐标运动
    d=sqrt((m-p)^2+(b-q)^2);% 目标物与导弹间距
    p=p+(2*v/d)*(m-p)*dt;% 导弹横坐标运动
    q=q+(2*v/d)*(b-q)*dt;% 导弹纵坐标运动
    if d<0.05% 当两者距离小于某值时停止
        break
    end
end
hold off
% 例(传染病SIR模型):假设人群分为健康者,病人,和病愈后具有免疫力不得病三类设任意时刻t,这三类人群占总人口比例分别为s(t),i(t),r(t),设病人的日接触率为lamda,日治愈率为miu,则有传染强度delta=lamda/miu,若人口总数为N,则有微分方程组:
s(t)+i(t)+r(t)=1;
dr/dt=miu*i;
ds/dt=-lamda*s*i;
di/dt=lamda*s*i-miu*i;
利用matlab仿真此类传染病的发病过程。
clear,clc
N=1e6;% 人口总数
s0=0.98;% 健康者初始比例
i0=0.02;% 病人初始比例
r0=0;% 免疫者初始比例
dt=1;% 单位时间/天
lamda=3;% 病人日接触率
miu=0.5;% 日治愈率
s=s0;i=i0;r=r0;
for k=1:1e2 % 总天数
    plot(k,N*s,'b*-',k,N*i,'rx--',k,N*r,'bx--');% 绘制当前各类人群人数
    axis([0,k+10,0,N]);
    legend('健康者','病人','免疫者');
    hold on
    pause(0.2);% 动态显示
    i=i+(lamda*s*i-miu*i)*dt;
    s=s+(-lamda*s*i)*dt;
    r=r+(miu*i)*dt;
end
hold off
利用该模型可以简单模拟传染病发病过程。
对于常微分方程,matlab提供了几个解常微分方程数值解的函数,如:ode45,ode23,ode113等,其中ode45采用四五阶龙格-库塔法(RK方法),是解非刚性微分方程的首选方法,ode23采用23阶RK方法,ode113采用多步法,效率一般比ode45高。
例(Logistic-弱肉强食模型):对于一种群,当存在自然资源,环境条件限制时,种群增长率将会随种群数量增加而减小,设t时刻种群数量为x(t),种群增长率r(x)为x的线性函数,即:r(x)=R-s*x;则不考虑其他条件时,该种群数量增长可表示为:
dx/dt=r(x)*x;
当自然界存在捕食者和被捕食者两种群时,设t时刻两种群数量分别为x1(t),x2(t),种群增长率分别为r1(x1)=(1e2-x1)/(50),r2(x2)=(1e3-x2)/(100);,捕杀量为0.2*x1*x2;利用matlab仿真两种群数量变化。
clear,clc
x10=5;% 捕食者初值
x20=500;% 被捕食者初值
dx=@(t,x)[(1e2-x(1))/(50)*x(1)+0.01*x(1)*x(2);
    (1e3-x(2))/(100)*x(2)-0.005*x(1)*x(2)];% 列写微分方程
[t,x]=ode45(dx,[0,100],[x10,x20]);
plot(t,x(:,1),'b*-',t,x(:,2),'rx--')
legend('捕食者','被捕食者')

1.2.指数平滑法

本节及之后讨论对时间序列数据的预测问题。假设预测时,离预测点越近的点作用越 大,随着时间变化权重以指数形式变化,则可以采用指数平滑法。一般情况下,时间 序列可以分解为水平部分(均值),趋势部分(上升或下降),季节性部分(周期重复), 随机波动(白噪声)。

当数据没有趋势和季节性时,可以采用一次指数平滑法;当数据有趋势无季节性时, 可以采用二次指数平滑法;当数据既有趋势又有季节性时,采用三次指数平滑法。 对于数据噪声,可以采用信号处理相关方法,如小波变换进行滤除。

现做以下规定:y(t)为t时刻数据,y'(t)为t时刻预测值,sn(t)为t时刻n次指数平滑值,alpha为记忆衰减因子。

一次指数平滑:y'(t+1)=alpha*y(t)+(1-alpha)*y'(t);s1(t)=y'(t);

二次指数平滑:y'(t+T)=a(t)+b(t)*T;其中,a(t)=2*s1(t)-s2(t);

b(t)=alpha/(1-alpha)*(s1(t)-s2(t));s2(t)=alpha*s1(t)+(1-alpha)*s2(t-1);

三次指数平滑:y'(t+T)=a(t)+b(t)*T+c(t)*T^2;其中,a(t)=3*s1(t)-3*s2(t)+s3(t);

b(t)=alpha/(2*(1-alpha)^2)*((6-5*alpha)*s1(t)-2*(5-4*alpha)*s2(t)+(4-3*alpha)*s3(t)); s3(t)=alpha*s2(t)+(1-alpha)*s3(t-1);

alpha取值标准:水平趋势,0.05~0.2;有波动,长期趋势变化不大,0.1~0.4;波动 大,长期趋势变化大,0.6~0.8;上升或下降的发展趋势,0.6~1。 本节利用指数平滑法对具有上升趋势和周期性的数据进行预测:

clc,clear
x=0:1e-1:20;y=2*exp(-0.16*x).*sin(2*x)+1/2*x;% 原始信号
alpha=0.6;% alpha值
n=length(y);% 原始信号长度
s10=mean(y(1:3));% 取y前三个数据均值作为各次指数平滑初值
s20=s10;
s30=s10;
s1=alpha*y(1)+(1-alpha)*s10;% 各次指数平滑值初始化
s2=alpha*s1(1)+(1-alpha)*s20;
s3=alpha*s2(1)+(1-alpha)*s30;
for i=2:n+20 % 预测原始信号后20位数据值
    if i>n
        y=[y,a+b+c];% T=1时,三次指数平滑预测值,此处进行滚动预测
    end
    s1=alpha*y(i)+(1-alpha)*s1;% 各次指数平滑值迭代
    s2=alpha*s1+(1-alpha)*s2;
    s3=alpha*s2+(1-alpha)*s3;
    a=3*s1-3*s2+s3;
    b=alpha/(2*(1-alpha)^2)*((6-5*alpha)*s1-2*(5-4*alpha)*s2+(4-3*alpha)*s3);
    c=alpha^2/(2*(1-alpha)^2)*(s1-2*s2+s3);
end
plot(1:n+20,y)% 绘制预测图

1.3.灰色预测

灰色预测适合处理小样本,中短期,指数变化的数据。设有时间序列x(n),n=1,2,...,N ,计算序列级比lamda(k)=x(k-1)/x(k),k=2,3,...,N,若对于任意 lamda(k) 属于 (exp(-2/(N+1)),exp(2/(N+1))),则可进行GM(1,1)预测。

现令:x1(n)=cumsum(x(n)),n=1,2,...,N为x(n)一次累加序列;

x0(n)=diff(x(n)),n=1,2,...,N-1为x(n)一次累减序列:

z(n)=1/2*(x1(2:end)+x1(1:end-1))为x1(n)均值序列。

GM(1,1)预测: 求解:[a,b]'=(B'*B)\B'*x(1:N)';

其中,B=[-z(1:N)',ones(N,1)];

则可预测得到: x1'(k+1)=(x(1)-b/a)*exp(-a*k)+b/a;x'(k+1)=x1'(k+1)-x1'(k);

进行GM(1,1)相对误差检验:delta(k)=abs(x'(k)-x(k))/x(k),k=1,2,...,N,当 delta(k)<0.1时,达到较高精度;delta(k)<0.2时,达到一般精度。

进行GM(1,1) 级比偏差值检验:rho(k)=1-((1-1/2*a)/(1+1/2*a))*lamda(k);rho(k)<0.1时,达到 较高精度;rho(k)<0.2时,达到一般精度.

GM(2,1)预测: 对于非单调摆动发展序列或有饱和s型序列,可以考虑建立GM(2,1),DGM,Verhulst模型:

称d2(x1(t))/xt2+a1*dx1(t)/dt+a2*x1(t)=b为GM(2,1)的白化方程。

令: B=[-x(2:end)',-z(1:end)',ones(1:N-1)'];Y=[x0(1:end)']; 则有GM(2,1)模型最小二乘估计:[a1,a2,b]'=(B'*B)\B'*Y; 得到参数后利用边界条件x1(1),x1(end)求解白化方程即可进行预测。

DGM(2,1)预测: 令B=[-x(2:end)',ones(1:N-1)'];Y=[x0(1:end)'];得到:[a,b]'=(B'*B)\B'*Y; 则可预测得到:x1'(k+1)=(b/a-x(1)/a)*exp(-a*k)+b/a*k+(1+a)/a*x(1)-b/a^2; Verhulst模型: 令B=[-z(1:end)',[z(1:end).^2]'];Y=[x(2:end)'];得到:[a,b]'=(B'*B)\B'*Y; x1'(k+1)=a*x(1)/(b*x(1)+(a-b*x(1))*exp(a*k)); 本节给出matlab简要计算各灰色预测模型的代码: 

clear,clc
% 生成各类型序列
x=0:0.1:10;
f1=diff(exp(-0.02*x)+1);% % 指数下降类序列,适合GM(1,1)预测
f2=diff(1e2*exp(x)-1e1*exp(0.001*x)+2);% 双指数综合,可选用GM(2,1)预测
f3=diff(2.7*exp(-0.4*x)+4*x+1);% 指数与一次综合,可选用DGM(2,1)预测
f4=diff(1./(1+50*exp(-0.01*x)));% s型曲线,可选用Verhulst预测
f=[f1;f2;f3;f4];
% 预测数据,与原始数据作比较
for i=1:4
    data=f(i,:);
    n=length(data);% 原始数据长度
    data0=diff(data);
    data1=cumsum(data);
    z_data=1/2*(data1(2:end)+data1(1:end-1));
    if(i==1)% GM(1,1)
        B=[-z_data(1:end)',ones(n-1,1)];
        Y=[data(2:end)]';
        u=(B'*B)\B'*Y;
        pre=@(k)(data(1)-u(2)/u(1))*exp(-u(1)*(k-1))+u(2)/u(1);
        fp=pre(1:n);fp=diff(fp);
    end
    if(i==2)% GM(2,1)
        B=[-data(2:end)',-z_data(1:end)',ones(n-1,1)];
        Y=data0';
        u=(B'*B)\B'*Y;
        syms x_un(t)
        x_un=dsolve(diff(x_un,2)+u(1)*diff(x_un)+u(2)*x_un==u(3), ...
            x_un(0)==data1(1),x_un(n-1)==data1(end));% 求解白化方程
        xt=vpa(x_un,6);
        fp=double(subs(x_un,t,0:n-1));
    end
    if(i==3)% DGM(2,1)
        B=[-data(2:end)',ones(n-1,1)];
        Y=data0';
        u=(B'*B)\B'*Y;
        pre=@(k)(u(2)/u(1)^2-data(1)/u(1))*exp(-u(1)*(k-1))+...
        u(2)/u(1)*(k-1)+(1+u(1))/u(1)*data(1)-u(2)/u(1)^2;
        fp=pre(1:n);fp=diff(fp);
    end
    if(i==4)% Verhulst
        B=[-z_data',z_data'.^2];
        Y=data(2:end)';
        u=(B'*B)\B'*Y;
        pre=@(k)u(1)*data(1)./(u(2)*data(1)+(u(1)-u(2)*data(1))*exp(u(1)*(k-1)));
        fp=pre(1:n);fp=diff(fp);
    end
    figure(i)
    plot(data,'b*-')
    hold on
    plot(fp,'r*-')
    hold off
    legend('实际值','预测值')
end
从预测结果中可以清楚的观察到部分结果预测并不准确,灰色预测适合小样本数据,当样本数据足够多时可选择其他时间序列预测方法,此外,样本变化幅度不能过大,在预测前需要对数据进行检验,灰色预测只能进行中短期预测,长期预测结果将出现较大误差。

2.马尔可夫预测Markov predicted

某一系统在已知现在情况的条件下,系统未来时刻的情况只与现在的情况有关,而与 历史无直接关系,则该系统可称其位马尔可夫系统。 有马氏链模型:某序列x(n)满足: p{x(n+1)=j|x(n)=i(n),x(n-1)=i(n-1),...,x(1)=i(1)}=p{x(n+1)=j|x(n)=i(n)}; 即未来时刻值只与现在值有关的序列。 时齐的马氏链:由一个状态转移到另一个状态的概率只与时间间隔有关,与起始时刻 无关。称以m步转移概率Pij(m)位元素的矩阵P(m)为马氏链的m步转移矩阵。 例:设某系统状态空间为:

E=[1,2,3,4];
% 有观察数据:
a=num2str([4,3,2,1,4,3,1,1,2,3,2,1,2,3,4,4,3,3,1,1,1,3,3,2,1,2,2,2,4,4,2,3,2,3,1,1,2,4,3,1]);
% 则有该马氏链一步转移矩阵P(1):
f=zeros(length(E));
for i=E
    for j=E
        f(i,j)=length(strfind(a,num2str([i j])));% 寻找a中出现[i,j]的次数
    end
end
p=sum(f,2);
for i=1:4
    f(i,:)=f(i,:)/p(i);
end% 一步转移矩阵

3.ARIMA预测ARIMA Forecast

3.1.平稳性Daniel检验

设有一组观察数据:(x(1),y(1)),(x(2),y(2)),...,(x(n),y(n)),设{x(1),x(2),...,x(n)} 的秩统计量为{R(1),R(2),...,R(n)}(秩统计量可理解为若将总数居从小到大排,该数 据排到第几),{y(1),y(2),...,y(n)}的秩统计量为{S(1),S(2),...,S(n)}。令: d={R(1)-S(1),R(2)-S(2),...,R(n)-S(n)}则观察数据有Spearman相关系数: Qxy=1-6/(n*(n^2-1))*sum(d.^2); 做假设检验:H0:rho(xy)=0,H1:rho(xy)~=0,其中rho(xy)为x,y总体相关系数。 令T=Qxy*sqrt(n-2)/sqrt(1-Qxy^2);,当abs(T)<=t(alpha/2)(n-2)时接受H0。 当H0检验通过时,说明观察数据序列平稳,不通过时说明存在上升或下降趋势。

clear,clc
% 设有数据列:
n=1000;
x=cumsum(ones(1,n));
y=randn(1,n);% 高斯噪声列
ry=sort(y);Ry=zeros(1,n);
for i=1:n
    [~,r]=find(y==ry(i));
    Ry(i)=r;% 获得y数据列秩统计量
end
d=x-Ry;
Qxy=1-6/(n*(n^2-1))*sum(d.^2);
T=Qxy*sqrt(n-2)/sqrt(1-Qxy^2);
t_0=tinv(0.975,n-2);% 计算上alpha/2分位数
% 由于abs(T)<t_0,则通过假设检验,数据列平稳。

3.2.自相关系数与偏自相关系数

clear,clc
% 设有数据列:
n=1000;
x=cumsum(ones(1,n));
y=randn(1,n);% 高斯噪声列
y_mean=mean(y);% 数据y平均值
y_0=y-y_mean;% 原始序列减去其均值
% 则自相关系数可表示为:
rho=zeros(1,n);
for k=0:n-1
    rho(k+1)=sum(y_0(1:n-k).*y_0(k+1:n))/sum(y_0.^2);
end
% 当序列为噪声序列时,自相关系数rho(k+1)~N(1,1/n)。
% 偏自相关系数计算:
phi=zeros(1,n-1);
for k=0:n-2
    rho1=rho(2:k+2);
    kp=length(rho1);
    rho2=zeros(kp);
    for k0=1:kp
        rho2(k0,k0:end)=rho(1:kp-k0+1);
        if(k0>=2)
            rho2(k0,1:k0-1)=fliplr(rho1(1:k0-1));
        end
    end
    phi1=rho2\rho1';phi(k+1)=phi1(end);
end

3.3.ARIMA

AR(p)模型:p阶自回归,y(t)=miu+sum(r(i)*y(t-i))(i=1:p)+et,其中,et为残差, miu,r为待定系数。 MA(q)模型:q阶滑动回归:y(t)=miu+sum(r(i)*e(t-i))(i=1:q)+et,其中,et为残差, miu为待定系数。 ARIMA中I指差分,ARIMA模型处理的数据为平稳数据,当数据有上升下降趋势时,需 要通过差分获得平稳数据列,若令需要差分的次数为d,则有完整的ARIMA(p,q,d)模 型:y(t)=miu+sum(r(i)*y(t-i))(i=1:p)+sum(r(i)*e(t-i))(i=1:q)+et。 本节给出matlab ARIMA模型预测的简单方法: (程序可见文件:ARIMA_model_prediction.m) ARIMA模型预测ARIMA model prediction

clear,clc
% 原始数据列:
n=1000;
x=cumsum(ones(1,n));
y=1/n*x+sin(x/(4*pi))/10+randn(1,n);% 具有上升趋势,小幅周期波动,噪声的数据列
% 判断数据列平稳性并做差分处理
dm=4;% 约束最大进行4次差分
yd=y;% 差分数列初始化
for dp=1:dm+2
    n1=length(yd);
    ry=sort(yd);Ry=zeros(1,n1);
    for i=1:n1
        [~,r]=find(yd==ry(i));
        Ry(i)=r;% 获得y数据列秩统计量
    end
    xp=cumsum(ones(1,n1));
    d=xp-Ry;
    Qxy=1-6/(n1*(n1^2-1))*sum(d.^2);
    T=Qxy*sqrt(n1-2)/sqrt(1-Qxy^2);
    t_0=tinv(0.975,n1-2);% 计算上alpha/2分位数
    if(abs(T)<=t_0)
        break
    elseif(dp==dm+2)
        disp('原始数据列无法差分平稳化,可能不适合ARIMA模型')
        break
    else
        yd=diff(yd);
    end
end
d_p=dp-1;% 最终差分次数
% 自相关系数,偏自相关系数计算
y_mean=mean(yd);% 数据yd平均值
y_0=yd-y_mean;% 序列减去其均值
rho=zeros(1,n1);
for k=0:n1-1
    rho(k+1)=sum(y_0(1:n1-k).*y_0(k+1:n1))/sum(y_0.^2);
end
phi=zeros(1,n1-1);
for k=0:n1-2
    tic
    rho1=rho(2:k+2);
    kp=length(rho1);
    rho2=zeros(kp);
    for k0=1:kp
        rho2(k0,k0:end)=rho(1:kp-k0+1);
        if(k0>=2)
            rho2(k0,1:k0-1)=fliplr(rho1(1:k0-1));
        end
    end
    phi1=rho2\rho1';phi(k+1)=phi1(end);
    toc
end
定阶预测
ARMA(p,q)预测一般需满足:数据自相关系数(ACF)q阶后衰减趋于0,偏自相关系数(PACF)p阶后衰减趋于0.
如果样本ACF和样本PACF在最初k阶明显大于2倍标准差,而后几乎95%的系数都落在2倍标准差的范围内,且非零系数衰减为小值波动的过程非常突然,通常视为k阶截尾;如果有超过5%的样本相关系数大于2倍标准差,或者非零系数衰减为小值波动的过程比较缓慢或连续,通常视为拖尾。
rho_std=std(rho);% 自相关系数标准差
phi_std=std(phi);% 偏自相关系数标准差
p=0;q=0;
for i=rho
    if(abs(i)>2*rho_std)
        p=p+1;
    else
        break
    end
end
for i=phi
    if(abs(i)>2*phi_std)
        q=q+1;
    else
        break
    end
end
以上程序简单进行了定阶,通常利用贝叶斯信息等可以更准确的进行定阶,限于篇幅本文不再赘述。
利用matlab内置函数进行预测;
AR_Order=p;
MA_Order=q;
AR=arima(AR_Order, d_p, MA_Order);
EstMdl=estimate(AR,y');
step=100;% 预测步数
fore_y=forecast(EstMdl,step,'Y0',y');
figure(1)
plot([y,fore_y'],'r*-')
hold on
plot(y,'b*-')
hold off
legend('预测值','实际值')
% 由结果分析可知,ARIMA模型适合短期的预测,且阶数的选择会影响预测结果。

4.插值与拟合Interpolation and fitting

4.1.插值

若数据有多项式特征,则可以用多项式函数进行插值。可利用待定系数法确定插值多 项式。

clear,clc
% 设有待插值原始数据列:
x0=(1:6)';y0=[16,18,21,17,15,12]';
A=vander(x0);% 返回x0范德蒙德矩阵
p=A\y0;% 求出多项式系数
x=0:0.1:6;
yh=polyval(p,x);plot(x,yh)% 绘制函数插值图像
% 用多项式做插值函数,随着插值节点的增加,插值多项式的次数越多,高次插值不但
% 计算复杂而且会产生龙格振荡现象。因此实际情况中一般会采用其他插值方法。
% 分段线性插值:将相邻节点用直线连接起来;
% 三次样条插值:插值函数在每个子区间均为三次多项式,且满足一定边界条件。
% 本节介绍matlab中一维插值函数:
clear,clc
% 设有待插值原始数据列:
x0=(1:6)';y0=[16,18,21,17,15,12]';
method='spline';% 设置插值方法,可以为'nearest'最近邻插值;'linear'线性插值;
% 'spline'三次样条插值;'cubic'立方插值
xq=0:0.1:6;% 待求点位置
vq=interp1(x0,y0,xq,method);plot(xq,vq)
% 二维插值函数interp2与interp1用法基本相同。

4.2.拟合

已知一组二维数据(x(i),y(i)),i=1,2,...,n,要寻找一个函数y=f(x)使f(x)在某准 则下与所有数据点最为接近。此时可以采用偏差平方和最小准则。即: min J=sum((f(1:n)-y(1:n)).^2);这一原则称为最小二乘元则。 线性最小二乘: 给定一个线性无关的函数系{phi(k)|,k=1,2,...,m},若拟合函数可以以其线性组合 形式出现:f(x)=sum(a(1:m).*phi(1:m)),则f(x)为关于系数{a(k)|,k=1,2,...,m} 的线性函数。 对于拟合函数:f(x)=a(1)*phi(1)+a(2)*phi(2)+,...,+a(m)*phi(m); 记:R=[phi(1:m)|x(1);phi(1:m)|x(2);...;phi(1:m)|x(n)];A=[a(1:m)];Y=[y(1:n)]; 有:A=(R'*R)\R'*Y。 matlab求约束线性最小二乘解:

clear,clc
x=[3,5,6,7,4,8,5,9]';y=[4,9,5,3,8,5,8,5]';% 观测数据
c=[exp(x),log(x)];% 线性无关函数系
a=lsqlin(c,y);% 拟合参数
% matlab求多项式拟合:
clear,clc
x=[3,5,6,7,4,8,5,9]';y=[4,9,5,3,8,5,8,5]';% 观测数据
p=polyfit(x,y,3);% 拟合3次多项式,返回值p为多项式系数,从高次幂到低次幂
% matlab fit和fittype函数
clear,clc
x=[3,5,6,7,4,8,5,9]';y=[4,9,5,3,8,5,8,5]';% 观测数据
g=fittype('a*exp(x)+b*log(x)','dependent',{'y'},'independent',{'x'});
f=fit(x,y,g,'StartPoint',rand(1,2));


Published with MATLAB® R2022b

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/558730.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

iOS -- 工厂设计模式

iOS -- 工厂设计模式 设计模式概念设计模式七大准则简单工厂模式优点缺点主要作用示例 工厂方法模式优点缺点主要作用&#xff1a; 抽象工厂方法缺点主要作用&#xff1a;文件分类 设计模式概念 所谓设计模式&#xff08;Design pattern&#xff09; 是解决软件开发某些特定问…

nginx installed inLinux

yum install nginx [rootmufeng ~]# yum install nginx CentOS系列&#xff1a;【Linux】CentOS7操作系统安装nginx实战&#xff08;多种方法&#xff0c;超详细&#xff09; ———————————————— 版权声明&#xff1a;本文为博主原创文章&#xff0c;遵循 CC …

Maven通过flatten-maven-plugin插件实现多模块版本统一管理

正文 起因是公司开始推代码版本管理的相关制度&#xff0c;而开发过程中经常使用多模块构建项目&#xff0c;每次做版本管理时都需要对每个模块及子模块下的pom文件中parent.version和模块下依赖中的version进行修改&#xff0c;改的地方非常多&#xff0c;且非常容易漏。为此…

Pytorch 学习路程

目录 下载Pytorch 入门尝试 几种常见的Tensor Scalar Vector Matrix AutoGrad机制 线性回归尝试 使用hub模块 Pytorch是重要的人工智能深度学习框架。既然已经点进来&#xff0c;我们就详细的介绍一下啥是Pytorch PyTorch 希望将其代替 Numpy 来利用 GPUs 的威力&…

深度学习pytorch实战4---猴逗病识别·

>- **&#x1f368; 本文为[&#x1f517;365天深度学习训练营](https://mp.weixin.qq.com/s/0dvHCaOoFnW8SCp3JpzKxg) 中的学习记录博客** >- **&#x1f356; 原作者&#xff1a;[K同学啊](https://mtyjkh.blog.csdn.net/)** 引言 1.复习上周并反思 K同学针对大家近…

【数据结构】图论(图的储存方式,图的遍历算法DFS和BFS、图的遍历算法的应用、图的连通性问题)

目录 图论一、 图的基本概念和术语二、图的存储结构1. 数组(邻接矩阵)存储表示无向图的数组(邻接矩阵)存储表示有向图的数组(邻接矩阵)存储表示 邻接表存储表示有向图的十字链表存储表示无向图的邻接多重表存储表示 三、图的遍历算法图的遍历——深度优先搜索&#xff08;DFS&a…

FPGA_verilog语法整理

FPGA_verilog语法整理 verilog的逻辑值 verilog的常数表达 位宽中指定常数的宽度&#xff08;表示成二进制数的位数&#xff09;&#xff0c;单引号加表示该常数为几进制的底数符号。 二进制底数符号为b&#xff0c;八进制为 o&#xff0c;十进制为d&#xff0c;十六进制为 h…

递归、搜索与回溯算法——穷举vs暴搜vs深搜

T04BF &#x1f44b;专栏: 算法|JAVA|MySQL|C语言 &#x1faf5; 小比特 大梦想 此篇文章与大家分享递归、搜索与回溯算法关于穷举vs暴搜vs深搜的专题 如果有不足的或者错误的请您指出! 目录 1.全排列1.1解析1.2题解 2.子集2.1解析2.1.1解法12.1.2解法1代码2.1.3解法22.1.4解法…

vscode微博发布案例

样例: CSS代码: * {margin: 0;padding: 0; }ul{list-style: none; }.w {width: 900px;margin: 0 auto; }.controls textarea {width: 878px;height: 100px;resize: none;border-radius: 10px;outline: none;padding-left: 20px;padding-top: 10px;font-size: 18px; }.controls…

yolov8 区域计数

yolov8 区域计数 1. 基础2. 计数功能2.1 计数模块2.2 判断模块 3. 主代码4. 实验结果5. 源码 1. 基础 本项目是在 WindowsYOLOV8环境配置 的基础上实现的&#xff0c;测距原理可见上边文章 2. 计数功能 2.1 计数模块 在指定区域内计数模块 def count_objects_in_region(bo…

Redis: 在项目中的应用

文章目录 一、Redis的共享session应用二、分布式缓存1、缓存2、缓存一致性问题解决方案&#xff08;缓存更新策略&#xff09;&#xff08;1&#xff09;作用&#xff08;2&#xff09;三种策略&#xff08;3&#xff09;主动更新策略&#xff08;数据库、缓存不一致解决方案&a…

SSL证书在HTTP与HTTPS中的角色差异是什么?

在互联网的广泛应用背景下&#xff0c;随着网络攻击和数据泄露事件频发&#xff0c;保障用户的数据安全已成为至关重要的议题。传统的HTTP协议在传输数据时不进行加密处理&#xff0c;导致数据在传输过程中暴露于潜在的窃听和篡改风险中&#xff0c;安全性薄弱。而通过引入SSL/…

【HC32L110】华大低功耗单片机启动文件详解

本文主要记录华大低功耗单片机 HC32L110 的 汇编启动过程&#xff0c;包括startup_hc32l110启动文件详细注释 目录 1.启动文件的作用2.堆栈定义2.1 栈2.2堆 3.向量表4.复位程序5.中断服务程序6.堆栈初始化启动过程详解7.1从0地址开始7.2在Reset_Handler中干了啥&#xff1f; 8.…

危险场景智能运维巡检系统

在石油、天然气、煤炭和化工等行业&#xff0c;特别是在I/IIC级防爆区场景中&#xff0c;存在着诸如易燃、易爆、高温、有毒有害以及粉尘等危险因素。例如&#xff0c;油气转运站、催化裂化装置、煤化工甲醇车间以及制氢站等地点&#xff0c;都面临着这些潜在的危险。传统的人工…

VOJ 网页跳转 题解 STL栈

网页跳转 用例输入 10 VISIT https://www.jisuanke.com/course/476 VISIT https://www.taobao.com/ BACK BACK FORWARD FORWARD BACK VISIT https://www.jisuanke.com/course/429 FORWARD BACK用例输出 https://www.jisuanke.com/course/476 https://www.taobao.com/ https…

echart实现排名列表

function createHorizontalBarChart(chartId, data) {if (typeof echarts undefined) {console.error(请先引入 ECharts 库);return;}// 初始化echarts实例var myChart echarts.init(document.getElementById(chartId));// 对数据按照 value 进行降序排序var sortedData dat…

k8s配置configmap指定到容器的指定文件

我们需要将名称为walletkey.properties的文件做成configmap&#xff0c;然后将walletkey.properties文件单独挂载出来到/data/walletkey.properties&#xff0c;且不能覆盖/data目录&#xff0c;具体如下 1、创建configmap configmap文件内容 其中walletkey.properties: >-引…

课时100:正则表达式_基础实践_基础知识

3.1.1 基础知识 学习目标 这一节&#xff0c;我们从 基础知识、简单实践、小结 三个方面来学习 基础知识 需求 我们之前的一些操作&#xff0c;很大程度上都是基于特定的关键字来进行实践的&#xff0c;尤其是面对一些灵活的场景&#xff0c;我们因为过于限定一些关键字&am…

【配电网故障定位】基于二进制矮猫鼬优化算法的配电网故障定位 33节点配电系统故障定位【Matlab代码#82】

文章目录 【获取资源请见文章第6节&#xff1a;资源获取】1. 配电网故障定位2. 二进制矮猫鼬优化算法3. 算例展示4. 部分代码展示5. 仿真结果展示6. 资源获取 【获取资源请见文章第6节&#xff1a;资源获取】 1. 配电网故障定位 配电系统故障定位&#xff0c;即在配电网络发生…

Tensorflow2.0笔记 - 使用卷积神经网络层做CIFA100数据集训练(类VGG13)

本笔记记录CNN做CIFAR100数据集的训练相关内容&#xff0c;代码中使用了类似VGG13的网络结构&#xff0c;做了两个Sequetial&#xff08;CNN和全连接层&#xff09;&#xff0c;没有用Flatten层而是用reshape操作做CNN和全连接层的中转操作。由于网络层次较深&#xff0c;参数量…
最新文章