灰色理论
关于这个模型的介绍不想多说了,只是一个娱乐而已。下面是所有的代码,直接粘到你的M文件里面,然后跑就是了。 一分钱不收。
function [ simulation,params] = GM( org )
n=length(org);
%一次累加
for i=1:n
acc(i)=sum(org(1:i));
end
%计算背景值
for i=1:(n-1)
zk(i)=0.5*(acc(i)+acc(i+1));
end
%求解参数
params=polyfit(zk,org(2:end),1);
%计算模拟值
for i=1:n
if i==1
simulation(i)=org(1);
else
simulation(i)=(org(1)+params(2)/params(1))*(1-exp(-params(1)))*exp(params(1)*(i-1));
end
end
plot(1:n,org,'-o',1:n,simulation,'-*');
legend('原始序列','拟合序列');
细心的朋友应该会注意到一件事情:灰色预测模型里面不是有那么多矩阵运算吗,在这里怎么没有? 如果你跑了程序又会发现,这个程序计算出来的结果,跟任何一本书上写的结果完全一样。这是为啥嘞?
如果再细心点,会看到我这里获取参数的代码 : params=polyfit(zk,org(2:end),1);。 没错, 就是线性拟合。
任何一本讲灰色理论的书上都会告诉你,参数估计是由这个式子加上最小二乘法得到的。
这事情的确没有错,但如果你仔细点,把移到等式的右边去,你发现了什么。 没错,这TM不就是一个离散直线方程么。
那么这里只需要把看成是直线方程里的y,而把看成是x。 那这个参数估计,就只是个简单的线性回归而已。
这样一来,只要是能实现线性回归的函数,完全都可以实现它所谓的参数估计。它那些大片大片的矩阵计算,完全只是为了忽悠你们而已,呵呵呵呵呵呵呵呵。
我大概数了一下,去掉我那些注释和画图,写一个GM(1,1)模型只需要10几行代码。如果你想偷懒,让它更简省,其实还可以更少。 比如累加的时候直接就把背景值算了,少一次循环。当然这种事情其实也没必要做。
至于学术圈里,各种各样的改进模型,尤其背景值改进模型。 你只需要把这段代码里面的计算公式换成那些看起来很牛B的文献里的公式就可以了。 这是高中生都应该办得到的事情。
好了,这个文章好像也没有什么主题,其实就是想让大家了解一下,所谓的牛B的灰色理论到底是个什么玩意。 (一个直线拟合就拿来吹出那么多东西,也真心佩服!)
希望大家不要被学术圈的忽悠们给忽悠了,不要在没必要的地方浪费太多时间。
番外篇:
有了上述的思路,相信你们应该能想得到其它的模型该如何实现了。 可以这样讲,在灰色理论中提到的最小二估计,实质上都只是将LS的线性回归中的功能用起来了,所以其它的各种各样的模型都可以用这段代码的思路来实现。
我上面也说过了,只要是能实现线性拟合的工具,都可以实现它了吧。那么你还能想到什么嘞?
1、SPSS,当然这个多此一举了;
2、EXCEL, 对,就是微软的那个OFFICE里面的EXCEL。 你甚至都用不着去用它的数据分析工具,只需要用slope和intercept两个函数就够了。
3、各种版本的统计学工具,开源工具,这里就不一一列举了。你去GOOGLE上 搜一下 "statistical " +[任意一种程序语言],你会找到无数个这种东西。
那么综上所述,可以看出几件事:
1、这玩意没啥神秘的;
2、这玩意是骗人的;
3、如果你还在写矩阵,呵呵呵,你还是回北大青鸟吧。(哈哈,开个玩笑)
其实我真正想说的是,不管是做学术还是玩技术,最重要的不外乎两点:1.认识问题的实质;2.不要装B,用最简单的方法去实现。
如果做到了以上两点,那么无论是在哪都能混得走。 如果只是用这个语言写过点什么,那个语言写过点什么,那么,你真的该去北大青鸟了。 这次不开玩笑!