Gary哥哥的哥哥 2021.1.30
如果评价的权重比较好获得,就不需要下面的较为复杂的方法了
层次分析法(AHP)的主要思想是根据研究对象的性质将要求达到的目标分解为多个组成因素,并按组成因素间的相互关系,将其层次化,组成一个层次结构模型,然后按层分析,最终获得最高层的重要性权值。层次分析法把一个复杂的无结构问题分解组合成若干部分或若干因素,上一层次对相邻的下一层次的全部或某些元素起支配作用,这样就形成了自上而下的层次结构,通过相关指标之间的两两比较对系统中各指标进行优劣判断,利用判断结果来综合计算各指标间的权重,从而对主要的影响因素进行排序。基本流程如下:
应用AHP解决问题的思路是:首先,把解决的问题分层系列化,即根据问题分解为不同的组成因素,按照因素之间的相互影响和隶属关系将其分层聚类组合,形成一个递阶的、有序的层次结构模型;然后,对模型中每一层次因素的相对重要性,依据人们对客观显示的判断给予定量表示,再利用数学方法确定每一层次全部因素相对重要性次序的权值;最后,通过综合计算各层因素相对重要性的权值,得到最底层值,以此作为评价和选择方案的依据。AHP方法将人们的思想过程和主观判断数学化,不仅简化了系统分析和计算工作,而且有助于决策者保持其思维过程和决策过程的一致性,所以,对于一些复杂问题能得到比较好的结果。AHP方法往往能够和其他模型相结合使用。
1.建立层次结构模型
确定问题所包含的指标,并根据各指标的相互关系将各因素分组、分层。按照最高层、中间层和最低层的形式进行排列,建立反映各指标关联隶属关系建立起层次结构模型。
2.建立判断矩阵
进行层次分析就要在建立问题层次模型的基础上,对层次结构中各指标的相对重要性做出判断,并将判断结果用一定的数值表示出来,写成矩阵形式,即所谓的判断矩阵。判断矩阵是进行层次分析的数据来源,构建判断矩阵是层次分析法的关键。
3.层次单排序和一致性检验
层次单排序是根据判断矩阵计算出对于上一层指标而言求层次与之有联系的指标的重要性权值。计算判断矩阵的特征值和特征向量,即对判断矩阵 计算满足下列关系的特征值和特征向量:
在实际分析中,由于客观事物的复杂性以及不同专家认识上的差异,使每一个判断矩阵都具有完全一致性是不可能的,为考察判断矩阵能否适用于层次分析,就要判断矩阵做一致性检验。为检验判断矩阵的一致性,需要计算一致性指标:
计算综合权重
计算目标准则层权重向量为:
以上来好久之前做的一个体系贡献率中部分用到的ahp方法,由于部分是公式所以就直接粘图了。
function [w,CR]=AHP(A)
n=size(A,1);
RI=getRI(n);
[V,D]=eig(A);
[lambda,index]=max(diag(D));
CI=(lambda-n)/(n-1);
CR=CI/RI;
fprintf('一致性比例为:%f\n',CR);
if CR>=0.1
fprintf('不通过一致性检验\n');
else
fprintf('通过一致性检验\n');
end
W=V(:,index);
w=W/sum(W);
function RI=getRI(n)
times=10000;
CIS=zeros(1,times);
for t=1:times
CI=getCI(n);
CIS(t)=CI;
end
RI=sum(CIS)/times;
function CI=getCI(n)
A=eye(n);
mat=[9 8 7 6 5 4 3 2 1 1/2 1/3 1/4 1/5 1/6 1/7 1/8 1/9];
for i=1:n-1
for j=i+1:n
randnum=randi(17);
A(i,j)=mat(randnum);
A(j,i)=mat(18-randnum);
end
end
Asum=sum(A,1);
Aprogress=A./(ones(n,1)*Asum);
W=sum(Aprogress,2)./n;
w=A*W;
lam=sum(w./W)/n;
CI=(lam-n)/(n-1);
end
end
两两方案之间评分(对准则1评一下,准则2评一下…)
function ahpactor
A = [1/1 2/1 5/1 3/1
1/2 1/1 3/1 1/2
1/5 1/3 1/1 1/4
1/3 2/1 4/1 1/1];
[w, CR] = AHP(A);
% face
A1 = [1/1 1/2 3/1
2/1 1/1 5/1
1/3 1/5 1/1];
[w1, CR1] = AHP(A1);
% body
A2 = [1/1 1/3 2/1
3/1 1/1 5/1
1/2 1/5 1/1];
[w2, CR2] = AHP(A2);
% voice
A3 = [1/1 2/1 1/5
1/2 1/1 1/7
5/1 7/1 1/1];
[w3, CR3] = AHP(A3);
% acting
A4 = [1/1 2/1 1/3
1/2 1/1 1/5
3/1 5/1 1/1];
[w4, CR4] = AHP(A4);
CRs = [CR1 CR2 CR3 CR4]
%最终的评分
P = [w1 w2 w3 w4] * w
% ------------------------------------------------------------------------
function [w, CR] = AHP(A)
% n= [ 1 2 3 4 5 6 7 8 9 ]
RI = [ 0.00 0.00 0.58 0.90 1.12 1.24 1.32 1.41 1.45];
n = size(A,1);
[V, D] = eig(A);
[lamda, i] = max(diag(D));
CI=(lamda-n)/(n-1);
CR = CI/RI(n);
W = V(:,i);
w = W/sum(W);
模糊数学:
- 秃子悖论: 天下所有的人都是秃子
- 设头发的根数为 n,n = 1 显然为秃子。
- 若 n = k 为秃子,则 n = k + 1 亦为秃子。(以此类推下去)
- 模糊概念:
- 从属于该概念到不属于该概念之间无明显分界线。
- 用==隶属程度==代替属或不属于,如某人属于秃子的程度为 0.8。(就是一个程度,同样也是模糊的)
- 应用:调查问卷
可先通过AHP得出准则权重值
因素集合
评语集合
给出每个方案的==综合评价==
多种运算方式
**W(权重)与R(评价)**合成运算
W = [0.4 0.2 0.1 0.3];
R = [0.38 0.34 0.17 0.11 0.00
0.26 0.41 0.20 0.13 0.00
0.27 0.23 0.21 0.15 0.14
0.14 0.19 0.22 0.12 0.33];
% B = max(R .* W')
B = max(R .* repmat(W',1,size(R,2)) )
B行向量当中,哪个值最大,对应就是哪个综合评价(优良中差)
拟合
ex:人口预测
注意:
- matlab中ployfit / fit 函数
- 在一些已知的拟合形式当中,就不要用别的拟合方式了
时间序列:将预测对象按照时间顺序排列而成的序列。
时序预测:根据时序过去的变化规律,推测今后趋势。
变化形式
常用模型:
适合用于数据平稳的,数据只在某个区间里面波动的
前t的值来预测t+1的值
企业收入
- n一般为波动的周期
y = [533.8 574.6 606.9 649.8 705.1, ...
772.0 816.4 892.7 963.9 1015.1]; %前九个月来计算10月收入
m = length(y);
n = 4;
c = cumsum(y);%叠加
yhat = ( c(n:end)-[0 c(1:end-n)] )/n;
S = norm(yhat(1:end-1) - y(n+1:end))/sqrt(m-n)
在简单移动平均公式中,每期数据在求平均时的作用是等同的。但是,每期数据所包含的信息量不一样,近期数据包含着更多关于未来情况的信心。因此,把各期数据等同看待是不尽合理的,应考虑各期数据的重要性,对近期数据给予较大的权重,这就 是加权移动平均法的基本思想。
例 2 我国 1979~1988 年原煤产量如表 2 所示,试用加权移动平均法预测 1989 年 的产量
计算的 MATLAB 程序如下:
y=[6.35 6.20 6.22 6.66 7.15 7.89 8.72 8.94 9.28 9.8];
w=[1/6;2/6;3/6];
m=length(y);n=3;
for i=1:m-n+1
yhat(i)=y(i:i+n-1)*w;
end
yhat
err=abs(y(n+1:m)-yhat(1:end-1))./y(n+1:m)
T_err=1-sum(yhat(1:end-1))/sum(y(n+1:m))
y1989=yhat(end)/(1-T_err)
在加权移动平均法中, 的选择,同样具有一定的经验性。一般的原则是:**近期 数据的权数大,远期数据的权数小。**至于大到什么程度和小到什么程度,则需要按照预 测者对序列的了解和分析来确定。
简单移动平均法和加权移动平均法,在时间序列没有明显的趋势变动时,能够准确 反映实际情况。但当时间序列出现直线增加或减少的变动趋势时,用简单移动平均法和 加权移动平均法来预测就会出现滞后偏差。因此,需要进行修正,修正的方法是作二次 移动平均,利用移动平均滞后偏差的规律来建立直线趋势的预测模型。这就是趋势移动平均法。 一次移动的平均数为
例 3 我国 1965~1985 年的发电总量如表 3 所示,试预测 1986 年和 1987 年的发 电总量。
解 由散点图 1 可以看出,发电总量基本呈直线上升趋势,可用趋势移动平均法 来预测。
计算的 MATLAB 程序如下:
clc,clear
load y.txt %把原始数据保存在纯文本文件 y.txt 中
m1=length(y);
n=6; %n 为移动平均的项数
for i=1:m1-n+1
yhat1(i)=sum(y(i:i+n-1))/n;
end
yhat1
m2=length(yhat1);
for i=1:m2-n+1
yhat2(i)=sum(yhat1(i:i+n-1))/n;
end
yhat2
plot(1:21,y,'*')
a21=2*yhat1(end)-yhat2(end)
b21=2*(yhat1(end)-yhat2(end))/(n-1)
y1986=a21+b21
y1987=a21+2*b21
- 趋势移动平均法对于同时存在直线趋势与周期波动的序列,是一种既能反映趋势变 化,又可以有效地分离出来周期变动的方法。
- 一次移动平均实际上认为近 N 期数据对未来值影响相同,都加权;而 N 期以前的数据对未来值没有影响,加权为 0。但是,二次及更高次移动平均数的权数却不是 ,且次数越高,权数的结构越复杂,但永远保持对称的权数,即两端项权数小,中间项权数大,不符合一般系统的动态性。
- ==一般说来历史数据对未来值的影响是随时间间隔的增长而递减的。==所以,==更切合实际的方法应是对各期观测值依时间顺序进行加权平均作为预测值。==指数平滑法可满足这一要求,而且具有简单的递推形式。
- 指数平滑法根据平滑次数的不同,又分为一次指数平滑法、二次指数平滑法和三 次指数平滑法等
例 4 某市 1976~1987 年某种电器销售额如表 4 所示。试预测 1988 年该电器销售 额。
clc,clear
load dianqi.txt %原始数据以列向量的方式存放在纯文本文件中
yt=dianqi;
n=length(yt);
alpha=[0.2 0.5 0.8];
m=length(alpha);
yhat(1,1:m)=(yt(1)+yt(2))/2;
for i=2:n
yhat(i,:)=alpha*yt(i-1)+(1-alpha).*yhat(i-1,:);
end
yhat
err=sqrt(mean((repmat(yt,1,m)-yhat).^2))
xlswrite('dianqi.xls',yhat)
yhat1988=alpha*yt(n)+(1-alpha).*yhat(n,:)
例 5 仍以例 3 我国 1965~1985 年的发电总量资料为例,试用二次指数平滑法预 测 1986 年和 1987 年的发电总量
clc,clear
load fadian.txt %原始数据以列向量的方式存放在纯文本文件中
yt=fadian;
n=length(yt);
alpha=0.3;
st1(1)=yt(1);
st2(1)=yt(1);
for i=2:n
st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1);
st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1);
end
xlswrite('fadian.xls',[st1',st2'])
a=2*st1-st2 b=alpha/(1-alpha)*(st1-st2)
yhat=a+b;
xlswrite('fadian.xls',yhat','Sheet1','C2')
str=char(['C',int2str(n+2)]);
xlswrite('fadian.xls',a(n)+2*b(n),'Sheet1',str)
例 6 某省 1978~1988 年全民所有制单位固定资产投资总额如表 7 所示,试预测 1989 年和 1990 年固定资产投资总额。
计算的 MATLAB 程序如下:
clc,clear
load touzi.txt %原始数据以列向量的方式存放在纯文本文件中
yt=touzi;
n=length(yt);
alpha=0.3;
st1_0=mean(yt(1:3));
st2_0=st1_0;
st3_0=st1_0;
st1(1)=alpha*yt(1)+(1-alpha)*st1_0;
st2(1)=alpha*st1(1)+(1-alpha)*st2_0;
st3(1)=alpha*st2(1)+(1-alpha)*st3_0;
for i=2:n
st1(i)=alpha*yt(i)+(1-alpha)*st1(i-1);
st2(i)=alpha*st1(i)+(1-alpha)*st2(i-1);
st3(i)=alpha*st2(i)+(1-alpha)*st3(i-1);
end
xlswrite('touzi.xls',[st1',st2',st3'])
st1=[st1_0,st1];
st2=[st2_0,st2];
st3=[st3_0,st3];
a=3*st1-3*st2+st3;
b=0.5*alpha/(1-alpha)^2*((6-5*alpha)*st1-2*(5-4*alpha)*st2+(4-3*alpha)*st3); c=0.5*alpha^2/(1-alpha)^2*(st1-2*st2+st3);
yhat=a+b+c;
xlswrite('touzi.xls',yhat','Sheet1','D1')
plot(1:n,yt,'*',1:n,yhat(1:n),'O')
legend('实际值','预测值',2)
xishu=[c(n+1),b(n+1),a(n+1)];
yhat1990=polyval(xishu,2)
指数平滑预测模型是以时刻t为起点,综合历史序列的信息,对未来进行预测的。 选择合适的加权系数 α 是提高预测精度的关键环节。根据实践经验, α 的取值范围一 般以 0.1~0.3 为宜。 α 值愈大,加权系数序列衰减速度愈快,所以实际上 α 取值大小 起着控制参加平均的历史数据的个数的作用。 α 值愈大意味着采用的数据愈少。因此, 可以得到选择 α 值的一些基本准则。
(1)如果序列的基本趋势比较稳,预测偏差由随机因素造成,则 α 值应取小一些, 以减少修正幅度,使预测模型能包含更多历史数据的信息。
(2)如果预测目标的基本趋势已发生系统地变化,则 α 值应取得大一些。这样, 可以偏重新数据的信息对原模型进行大幅度修正,以使预测模型适应预测目标的新变 化。
在上面我们已经讲过,当时间序列的变动具有直线趋势时,用一次指数平滑法会出现滞后偏差,其原因在于数据不满足模型要求。因此,我们也可以从数据变换的角度来考虑改进措施,即在运用指数平滑法以前先对数据作一些技术上的处理,使之能适合于 一次指数平滑模型,以后再对输出结果作技术上的返回处理,使之恢复为原变量的形态。 差分方法是==改变数据变动趋势==的简易方法。
在前面我们已分析过,指数平滑值实际上是一种加权平均数。因此把序列中逐期增 量的加权平均数(指数平滑值)加上当前值的实际数进行预测,比一次指数平滑法只用 变量以往取值的加权平均数作为下一期的预测更合理。从而使预测值始终围绕实际值上 下波动,从根本上解决了在有直线增长趋势的情况下,用一次指数平滑法所得出的结果 始终落后于实际值的问题。
例 7 某工业企业 1977~1986 年锅炉燃料消耗量资料如表 8 所示,试预测 1987 年 的燃料消耗量。
解 由资料可以看出,燃料消耗量,除个别年份外,逐期增长量大体在 200 吨左右,即呈直线增长,因此可用一阶差分指数平滑模型来预测。我们取 α = 0.4,初始值为新序列首项值,计算结果列于表 8 中。预测 1987 年燃料消耗量为
( 百吨 )
clc,clear
yt = load( 'ranliao.txt');%实际燃料消耗量数据以列向量的方式存放在纯文本文件中.
n= length(yt); alpha=0.4;
dyt =diff(yt); %求yt的一阶向前差分
dyt =[0;dyt]; %这里使用的是一阶向后差分,加“0”补位
dyhat(2) =dyt(2); %指数平滑值的初始值
for i =2:n
dyhat(i +1) =alpha *dyt(i) +(1 - alpha) * dyhat(i);
end
for i =1:n
yhat(i +1) =dyhat(i +1) +yt(i);
end
yhat
xlswrite( 'ranliao .xls' ,[yt ,dyt])
xlswrite( 'ranliao .x1s',[ dyhat' ,yhat'], 'Sheet1','C1')
差分方法和指数平滑法的联合运用,除了能克服一次指数平滑法的滞后偏差之外, 对初始值的问题也有显著的改进。因为数据经过差分处理后,所产生的新序列基本上是平稳的。这时,初始值取新序列的第一期数据对于未来预测值不会有多大影响。其次, 它拓展了指数平滑法的适用范围,使一些原来需要运用配合直线趋势模型处理的情况可用这种组合模型来取代。但是,于指数平滑法存在的加权系数 α 的选择问题,以及只能逐期预测问题,差分指数平滑模型也没有改进。
自适应滤波法与移动平均法、指数平滑法一样,也是以时间序列的历史观测值进行 某种加权平均来预测的,它要==寻找一组“佳”的权数,其办法是先用一组给定的权数 来计算一个预测值,然后计算预测误差,再根据预测误差调整权数以减少误差。==这样反 复进行,直至**找出一组“佳”权数,使误差减少到低限度。**由于这种调整权数的过程与通讯工程中的传输噪声过滤过程极为接近,故称为自适应滤波法。
下面举一个简单的例子来说明此法的全过程。设有一个时间序列包括 10 个观测值, 如表 9 所示。试用自适应滤波法,以两个权数来求第 11 期的预测值。
在实际应用中,权数调整计算工作量可能很大,必须借助于计算机才能实现。
计算的 MATLAB 程序如下:
clc,clear
yt=0.1:0.1:1;
m=length(yt);
k=0.9; N=2; Terr=10000;
w=ones(1,N)/N;
while abs(Terr)>0.00001
Terr=[];
for j=N+1:m-1
yhat(j)=w*yt(j-1:-1:j-N)';
err=yt(j)-yhat(j);
Terr=[Terr,abs(err)];
w=w+2*k*err*yt(j-1:-1:j-N);
end
Terr=max(Terr);
end
w, yhat
在开始调整权数时,首先要确定权数个数 N 和学习常数k 。一般说来,当时间序 列的观测值呈季节变动时, N 应取季节性长度值。如序列以一年为周期进行季节变动 时,若数据是月度的,则取 N =12 。若季节是季度的,则取N=4 。如果时间序列无 明显的周期变动,则可用自相关系数法来确定,即取 N 为高自相关系数的滞后时期。
k 的取值一般可定为1 / N,也可以用不同的k 值来进行计算,以确定一个能使S 小的k 值。
自适应滤波法有两个明显的优点:一是技术比较简单,可根据预测意图来选择权数 的个数和学习常数,以控制预测。也可以由计算机自动选定。二是它使用了全部历史数 据来寻求佳权系数,并随数据轨迹的变化而不断更新权数,从而不断改进预测。 由于自适应滤波法的预测模型简单,又可以在计算机上对数据进行处理,所以这种 预测方法应用较为广泛.
- 其他方法:趋势外推预测方法
- 平稳时间序列预测方法
- 模型使用的==不是原始数据,而是生成数据==。
- 不需要很多数据,一般只需 ≥ 4 个数据。
- 只适用于中短期的预测,只适合指数增长的预测。
- GM(1,1) 预测模型
- GM(1,1) 表示模型是 1 阶微分方程,且只含 1 个变量。
原始序列:
X (0) = { x (0)(1), x (0)(2), · · · , x (0)(n)}
可行性检验条件:
若不满足可行性检验条件,则可作数据平移处理:(加上一个常数)
y (0)(k) = x (0)(k) + c
一次累加生成序列:
X (1) = { x (1)(1), x (1)(2), · · · , x (1)(n)}, 其中x (1)(k) =∑=1x (0)(i)
均值生成序列:
Z (1) = { z (1)(2), z(1)(3), · · · , z (1)(n)}
微分方程:
- 白化方程求解最后项分母b改为a
- 残差检验分母漏了平方
未进行残差检验
t0 = [1999:2003]';
X0 = [89, 99, 109, 120, 135]';%原始序列
n = length(X0);
lambda = X0(1:n-1)./X0(2:n);
range = minmax(lambda')
exp([-2/(n+1), 2/(n+2)])
X1 = cumsum(X0);% 累加序列
Z1 = (X1(1:n-1)+X1(2:n))/2 %均值
B = [-Z1, ones(n-1,1)];
Y = X0(2:n);
u = B\Y; a = u(1); b = u(2);
k = 0:n+4;
xhat1 = (X0(1) - b/a).*exp(-a*k) + b/a;
xhat0 = [X0(1) diff(xhat1)] %还原
plot(t0,X0,'o',t0(1)+k, xhat0,'-+')