• Matlab实现GM(1,1)模型(源代码)


    关于这个模型的介绍不想多说了,只是一个娱乐而已。下面是所有的代码,直接粘到你的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,用最简单的方法去实现。

    如果做到了以上两点,那么无论是在哪都能混得走。  如果只是用这个语言写过点什么,那个语言写过点什么,那么,你真的该去北大青鸟了。 这次不开玩笑!

  • 相关阅读:
    ubuntu下/etc/rc.local和/etc/init.d/rc.local的区别
    Shell 中的中括号用法总结
    基于C语言sprintf函数的深入理解
    linux下查看十六进制文件方法
    oracle load data infile
    linux bash中too many arguments问题的解决方法
    关于促进问题解决
    SYSTEM表空间过大问题
    01 Oracle分区索引
    oracle 11gR2 ASM添加和删除磁盘 转
  • 原文地址:https://www.cnblogs.com/sircauchy/p/3665036.html
Copyright © 2020-2023  润新知