最近在做项目时,用户不想使用平均值来判断当前数据状态,想用其他的方式来分析数据的变化状态,在查找了一些资料后,想使用灰色预测来进行数据的预测。下面的内容是从网上综合下来的,java代码也做了一点改动,以做记录和学习。

1.什么是灰色预测

  灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。
  灰色时间序列预测,即用等时距观测到的反应预测对象特征的一系列数量值构造灰色预测模型,预测未来某一时刻的特征量,或达到某一特征量的时间。

2.灰色预测的数学建模

  1).数据的检验与处理

    为了保证GM(1,1)建模方法的可行性,需要对已知数据做必要的检验处理。
    设原始数据列为 ,计算数列的级比

                    

    如果所有的级比都落在可容覆盖区间
    内,则数据列可以建立GM(1,1)模型且可以进行灰色预测。否则,对数据做适当的变换处理,如平移变换:取C使得数据列
    的级比都落在可容覆盖区间内。

  2).建立GM模型

    不妨设 满足上面的要求,

    以它为数据列建立GM(1,1)模型 

    用回归分析求得a,b的估计值,于是相应的白化模型为

            
    解为

    于是得到预测值 

    从而相应地得到预测值  

  3).检验预测值

    采用残差检验的方式进行检验。

      
    如果对所有的 ,则认为达到较高的要求;

    否则,若对所有的 ,则认为达到一般的要求。

3.java实现

  

  1. public class GM {
  2.  
  3. /**
  4. * @param args
  5. */
  6. public static void main(String[] args) {
  7. double []arr={2.67,3.13,3.25,3.36,3.56,3.72,3.12,3.33,2.12};
  8. System.out.println(gm(arr,3));
  9. }
  10.  
  11. public static double gm(double[] fs, int T) {
  12.  
  13. // 预测模型函数
  14. int size = fs.length;
  15. int tsize = fs.length - 1;
  16. double[] arr = fs;// 原始数组
  17. double[] arr1 = new double[size];// 经过一次累加数组
  18. double sum = 0;
  19. for (int i = 0; i < size; i++) {
  20. sum += arr[i];
  21. arr1[i] = sum;
  22. }
  23. double[] arr2 = new double[tsize];// arr1的紧邻均值数组
  24. for (int i = 0; i < tsize; i++) {
  25. arr2[i] = (double) (arr1[i] + arr1[i + 1]) / 2;
  26. }
  27. /*
  28. *
  29. * 下面建立 向量B和YN求解待估参数向量, 即求参数a,b
  30. */
  31. /*
  32. * 下面建立向量B, B是5行2列的矩阵, 相当于一个二维数组。
  33. */
  34. double[][] B = new double[tsize][2];
  35. for (int i = 0; i < tsize; i++) {
  36. for (int j = 0; j < 2; j++) {
  37. if (j == 1)
  38. B[i][j] = 1;
  39. else
  40. B[i][j] = -arr2[i];
  41. }
  42.  
  43. }
  44. /*
  45. * 下面建立向量YN
  46. */
  47. double[][] YN = new double[tsize][1];
  48. for (int i = 0; i < tsize; i++) {
  49. for (int j = 0; j < 1; j++) {
  50. YN[i][j] = arr[i + 1];
  51. }
  52. }
  53.  
  54. /*
  55. * B的转置矩阵BT,2行5列的矩阵
  56. */
  57. double[][] BT = new double[2][tsize];
  58. for (int i = 0; i < 2; i++) {
  59. for (int j = 0; j < tsize; j++) {
  60. BT[i][j] = B[j][i];
  61. }
  62. }
  63. /*
  64. * 将BT和B的乘积所得到的结果记为数组B2T,则B2T是一个2*2的矩阵
  65. */
  66. double[][] B2T = new double[2][2];
  67. for (int i = 0; i < 2; i++) {// rows of BT
  68.  
  69. {
  70. for (int j = 0; j < 2; j++)// cloums of B
  71. {
  72. for (int k = 0; k < tsize; k++)// cloums of BT=rows of B
  73. {
  74. B2T[i][j] = B2T[i][j] + BT[i][k] * B[k][j];
  75. }
  76. }
  77.  
  78. }
  79. }
  80. /* 下面求B2T的逆矩阵,设为B_2T,怎么适用于一般的矩阵? */
  81. double[][] B_2T = new double[2][2];
  82. B_2T[0][0] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
  83. * B2T[1][1];
  84. B_2T[0][1] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
  85. * (-B2T[0][1]);
  86. B_2T[1][0] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
  87. * (-B2T[1][0]);
  88. B_2T[1][1] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
  89. * B2T[0][0];
  90. /*
  91. * 根据以上所求的各已知量下面求待估参数的未知量a和b,待估向量矩阵等于B_2T*BT*YN
  92. * 下面我们分别求这些矩阵的乘积,首先求B_2T*BT,令B_2T*BT的乘积为A矩阵,则A就是一个2*5的矩阵
  93. */
  94. /*
  95. *
  96. *
  97. *
  98. * 下面先求A矩阵
  99. */
  100. double[][] A = new double[2][tsize];
  101. for (int i = 0; i < 2; i++) {// rows of B_2T
  102. {
  103. for (int j = 0; j < tsize; j++)// cloums of BT
  104. {
  105. for (int k = 0; k < 2; k++)// cloums of B_2T=rows of BT
  106. {
  107. A[i][j] = A[i][j] + B_2T[i][k] * BT[k][j];
  108. }
  109. }
  110.  
  111. }
  112. }
  113. /*
  114. *
  115. *
  116. * 下面求A和YN矩阵的乘积,令乘积为C矩阵,则C就是一个2*1的矩阵
  117. */
  118. double[][] C = new double[2][1];
  119. for (int i = 0; i < 2; i++) {// rows of A
  120.  
  121. {
  122. for (int j = 0; j < 1; j++)// cloums of YN
  123. {
  124. for (int k = 0; k < tsize; k++)// cloums of A=rows of YN
  125. {
  126. C[i][j] = C[i][j] + A[i][k] * YN[k][j];
  127. }
  128. }
  129.  
  130. }
  131. }
  132. /* 根据以上所得则a=C[0][0],b=C[1][0]; */
  133. double a = C[0][0], b = C[1][0];
  134. int i = T;// 读取一个数值
  135. double Y = (arr[0] - b / a) * Math.exp(-a * (i + 1)) - (arr[0] - b / a)
  136. * Math.exp(-a * i);
  137.  
  138. return Y;
  139. }
  140.  
  141. }

灰色预测原理及JAVA实现的更多相关文章

  1. R实现灰色预测

    1.简介 预测就是借助于对过去的探讨去推测.了解未来.灰色预测通过原始数据的处理和灰色模型的建立,发现.掌握系统发展规律,对系统的未来状态做出科学的定量预测.对于一个具体的问题,究竟选择什么样的预测模 ...

  2. python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导

    来源公式推导连接 https://blog.csdn.net/qq_36387683/article/details/88554434 关键词:灰色预测 python 实现 灰色预测 GM(1,1)模 ...

  3. matlab批量灰色预测

    没事玩了一下matlab 发现现在网上的代码都是一组数据预测 所以我就写个批量数据的预测 顺便学习下matlab ----------------------------------我是快乐的分割线- ...

  4. [matlab] 21.灰色预测、线性回归分析模型与最小二乘回归 (转载)

    灰色预测的主要特点是只需要4个数据,就能解决历史数据少,序列的完整性以及可靠性低的问题,能将无规律的原始数据进行生成得到规律性较强的生成序列,易于检验 但缺点是只适合中短期的预测,且只适合指数级增长的 ...

  5. 灰色预测 GM11模型

    灰色预测实现见:https://www.jianshu.com/p/a35ba96d852b from pandas import Series from pandas import DataFram ...

  6. 灰色预测--matlab&python实现

    function SGrey X0 = input('请输入原始负荷数据:'); %输入原始数据 n = length(X0); %原始n年数据 %累加生成 X1 = zeros(1,n); for ...

  7. CLH lock 原理及JAVA实现

    --喜欢记得关注我哟[shoshana]--​ 前记 JUC中的Lock中最核心的类AQS,其中AQS使用到了CLH队列的变种,故来研究一下CLH队列的原理及JAVA实现 一. CLH背景知识 SMP ...

  8. 跳跃表-原理及Java实现

    跳跃表-原理及Java实现 引言: 上周现场面试阿里巴巴研发工程师终面,被问到如何让链表的元素查询接近线性时间.笔者苦思良久,缴械投降.面试官告知回去可以看一下跳跃表,遂出此文. 跳跃表的引入 我们知 ...

  9. 一致性Hash算法原理,java实现,及用途

    学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使 ...

随机推荐

  1. ORACLE 导出(exp) & 导入(imp)

    导出(exp) & 导入(imp)     利用Export可将数据从数据库中提取出来,就是将select的结果存到一个FS二进制文件上    利用Import则可将提取出来的数据送回到Ora ...

  2. new与malloc

    首先将new与malloc的区别总结如下: 1 new可以自动计算需要分配多大的内存,而malloc必须指明. 2 new返回的指针是有类型的,malloc返回void*类型的指针. 3 new在分配 ...

  3. ubuntu如何傻瓜式安装eric6

    最近在搞PyQt5,听闻eric6是一个不错的IDE,但就是配置起来略蛋疼. 在网上搜到不少教程,都是要先编译安装Qt5, PyQt5, sip, qscintilla2, qscintilla2又分 ...

  4. MMS彩信字符集(字符编码)

    彩信字符集在CharacterSets类中定义 android\frameworks\opt\telephony\src\java\com\google\android\mms\pdu\Charact ...

  5. rsync排除文件同步

    排除扩展名为log的文件 rsync -ave ssh --exclude '*.log' root@192.168.168.188:/website/abc.com/* /website/abc.c ...

  6. WampServer3.0.4 允许外网访问配置教程

    原文地址:http://jingyan.baidu.com/album/acf728fd556c93f8e410a344.html?picindex=1

  7. STL库的内存配置器(allocator)

    正在学习中,如果有错,还请多多指教,根据不断的理解,会进行更改,更改之前的样子都会保留下来,记录错误是最大的进步,嗯嗯! 具有次配置力的SGI空间配置器(SGI是STL的一种版本,也有其他的版本) 这 ...

  8. php mysql支持emoji表情方案

    将emoji转换成utf8 然后存储到数据库,但是 效率低 public function rrr($text) { $text = 'a

  9. iOS开发中的各种错误

    提交iTunesconnect遇到的问题: 1. error itms-90179 Invalid Code Signing. 解决:发现是发布正式被撤销了,重新生成发布Certificates,重新 ...

  10. mysql +ibatis

    1.返回插入ID a.xml <insert id="insert" parameterClass="klcQuestion"> insert in ...