灰色预测原理及JAVA实现
最近在做项目时,用户不想使用平均值来判断当前数据状态,想用其他的方式来分析数据的变化状态,在查找了一些资料后,想使用灰色预测来进行数据的预测。下面的内容是从网上综合下来的,java代码也做了一点改动,以做记录和学习。
1.什么是灰色预测
灰色预测是一种对含有不确定因素的系统进行预测的方法。灰色预测通过鉴别系统因素之间发展趋势的相异程度,即进行关联分析,并对原始数据进行生成处理来寻找系统变动的规律,生成有较强规律性的数据序列,然后建立相应的微分方程模型,从而预测事物未来发展趋势的状况。
灰色时间序列预测,即用等时距观测到的反应预测对象特征的一系列数量值构造灰色预测模型,预测未来某一时刻的特征量,或达到某一特征量的时间。
2.灰色预测的数学建模
1).数据的检验与处理
为了保证GM(1,1)建模方法的可行性,需要对已知数据做必要的检验处理。
设原始数据列为 ,计算数列的级比
如果所有的级比都落在可容覆盖区间
内,则数据列可以建立GM(1,1)模型且可以进行灰色预测。否则,对数据做适当的变换处理,如平移变换:取C使得数据列
的级比都落在可容覆盖区间内。
2).建立GM模型
不妨设 满足上面的要求,
以它为数据列建立GM(1,1)模型
用回归分析求得a,b的估计值,于是相应的白化模型为
解为
于是得到预测值
从而相应地得到预测值
3).检验预测值
采用残差检验的方式进行检验。
如果对所有的 ,则认为达到较高的要求;
否则,若对所有的 ,则认为达到一般的要求。
3.java实现
public class GM { /**
* @param args
*/
public static void main(String[] args) {
double []arr={2.67,3.13,3.25,3.36,3.56,3.72,3.12,3.33,2.12};
System.out.println(gm(arr,3));
} public static double gm(double[] fs, int T) { // 预测模型函数
int size = fs.length;
int tsize = fs.length - 1;
double[] arr = fs;// 原始数组
double[] arr1 = new double[size];// 经过一次累加数组
double sum = 0;
for (int i = 0; i < size; i++) {
sum += arr[i];
arr1[i] = sum;
}
double[] arr2 = new double[tsize];// arr1的紧邻均值数组
for (int i = 0; i < tsize; i++) {
arr2[i] = (double) (arr1[i] + arr1[i + 1]) / 2;
}
/*
*
* 下面建立 向量B和YN求解待估参数向量, 即求参数a,b
*/
/*
* 下面建立向量B, B是5行2列的矩阵, 相当于一个二维数组。
*/
double[][] B = new double[tsize][2];
for (int i = 0; i < tsize; i++) {
for (int j = 0; j < 2; j++) {
if (j == 1)
B[i][j] = 1;
else
B[i][j] = -arr2[i];
} }
/*
* 下面建立向量YN
*/
double[][] YN = new double[tsize][1];
for (int i = 0; i < tsize; i++) {
for (int j = 0; j < 1; j++) {
YN[i][j] = arr[i + 1];
}
} /*
* B的转置矩阵BT,2行5列的矩阵
*/
double[][] BT = new double[2][tsize];
for (int i = 0; i < 2; i++) {
for (int j = 0; j < tsize; j++) {
BT[i][j] = B[j][i];
}
}
/*
* 将BT和B的乘积所得到的结果记为数组B2T,则B2T是一个2*2的矩阵
*/
double[][] B2T = new double[2][2];
for (int i = 0; i < 2; i++) {// rows of BT {
for (int j = 0; j < 2; j++)// cloums of B
{
for (int k = 0; k < tsize; k++)// cloums of BT=rows of B
{
B2T[i][j] = B2T[i][j] + BT[i][k] * B[k][j];
}
} }
}
/* 下面求B2T的逆矩阵,设为B_2T,怎么适用于一般的矩阵? */
double[][] B_2T = new double[2][2];
B_2T[0][0] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
* B2T[1][1];
B_2T[0][1] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
* (-B2T[0][1]);
B_2T[1][0] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
* (-B2T[1][0]);
B_2T[1][1] = (1 / (B2T[0][0] * B2T[1][1] - B2T[0][1] * B2T[1][0]))
* B2T[0][0];
/*
* 根据以上所求的各已知量下面求待估参数的未知量a和b,待估向量矩阵等于B_2T*BT*YN
* 下面我们分别求这些矩阵的乘积,首先求B_2T*BT,令B_2T*BT的乘积为A矩阵,则A就是一个2*5的矩阵
*/
/*
*
*
*
* 下面先求A矩阵
*/
double[][] A = new double[2][tsize];
for (int i = 0; i < 2; i++) {// rows of B_2T
{
for (int j = 0; j < tsize; j++)// cloums of BT
{
for (int k = 0; k < 2; k++)// cloums of B_2T=rows of BT
{
A[i][j] = A[i][j] + B_2T[i][k] * BT[k][j];
}
} }
}
/*
*
*
* 下面求A和YN矩阵的乘积,令乘积为C矩阵,则C就是一个2*1的矩阵
*/
double[][] C = new double[2][1];
for (int i = 0; i < 2; i++) {// rows of A {
for (int j = 0; j < 1; j++)// cloums of YN
{
for (int k = 0; k < tsize; k++)// cloums of A=rows of YN
{
C[i][j] = C[i][j] + A[i][k] * YN[k][j];
}
} }
}
/* 根据以上所得则a=C[0][0],b=C[1][0]; */
double a = C[0][0], b = C[1][0];
int i = T;// 读取一个数值
double Y = (arr[0] - b / a) * Math.exp(-a * (i + 1)) - (arr[0] - b / a)
* Math.exp(-a * i); return Y;
} }
灰色预测原理及JAVA实现的更多相关文章
- R实现灰色预测
1.简介 预测就是借助于对过去的探讨去推测.了解未来.灰色预测通过原始数据的处理和灰色模型的建立,发现.掌握系统发展规律,对系统的未来状态做出科学的定量预测.对于一个具体的问题,究竟选择什么样的预测模 ...
- python 实现 灰色预测 GM(1,1)模型 灰色系统 预测 灰色预测公式推导
来源公式推导连接 https://blog.csdn.net/qq_36387683/article/details/88554434 关键词:灰色预测 python 实现 灰色预测 GM(1,1)模 ...
- matlab批量灰色预测
没事玩了一下matlab 发现现在网上的代码都是一组数据预测 所以我就写个批量数据的预测 顺便学习下matlab ----------------------------------我是快乐的分割线- ...
- [matlab] 21.灰色预测、线性回归分析模型与最小二乘回归 (转载)
灰色预测的主要特点是只需要4个数据,就能解决历史数据少,序列的完整性以及可靠性低的问题,能将无规律的原始数据进行生成得到规律性较强的生成序列,易于检验 但缺点是只适合中短期的预测,且只适合指数级增长的 ...
- 灰色预测 GM11模型
灰色预测实现见:https://www.jianshu.com/p/a35ba96d852b from pandas import Series from pandas import DataFram ...
- 灰色预测--matlab&python实现
function SGrey X0 = input('请输入原始负荷数据:'); %输入原始数据 n = length(X0); %原始n年数据 %累加生成 X1 = zeros(1,n); for ...
- CLH lock 原理及JAVA实现
--喜欢记得关注我哟[shoshana]-- 前记 JUC中的Lock中最核心的类AQS,其中AQS使用到了CLH队列的变种,故来研究一下CLH队列的原理及JAVA实现 一. CLH背景知识 SMP ...
- 跳跃表-原理及Java实现
跳跃表-原理及Java实现 引言: 上周现场面试阿里巴巴研发工程师终面,被问到如何让链表的元素查询接近线性时间.笔者苦思良久,缴械投降.面试官告知回去可以看一下跳跃表,遂出此文. 跳跃表的引入 我们知 ...
- 一致性Hash算法原理,java实现,及用途
学习记录: 一致性Hash算法原理及java实现:https://blog.csdn.net/suifeng629/article/details/81567777 一致性Hash算法介绍,原理,及使 ...
随机推荐
- Leetcode Elemination Game
题目网址:https://leetcode.com/contest/2/problems/elimination-game/ 题意: 给定一个从1到n的数列,第一次从最左边开始,每隔一个淘汰一个数字. ...
- Java汉字转拼音
import net.sourceforge.pinyin4j.PinyinHelper; import net.sourceforge.pinyin4j.format.HanyuPinyinCase ...
- H5学习系列之Communication API
1 .postMessage API 首先介绍一下什么是iframe? 百度百科里这样写道:IFRAME,HTML标签,作用是文档中的文档,或者浮动的框架(FRAME). 我的理解就是网页中的网页. ...
- web测试方法总结
链接地址:http://www.cnblogs.com/Jessy/p/3539638.html 一.输入框 1.字符型输入框: (1)字符型输入框:英文全角.英文半角.数字.空或者空格.特殊字符“~ ...
- jQuery事件笔记
bind(eventType[,data],hanlder):eventType表示要创建的处理器指定事件类型的名称.可以使用空格分隔的列表指定多个事件类型.data(对象)调用者提供的数据,用来附加 ...
- 安装ubuntu系统
1. CTRL+ALT+F2 由图形界面进入命令行界面 ALT+CTRL+F7切换到图形界面 2. ubuntu12.04不会在安装时确定root的密码,需要你在后来更改密码有其他方法更改文件:在终端 ...
- web测试
1.验证码在不同浏览器兼容性(兼容测试) 2.登录时间cookie及session
- java学习教程
java依然是目前比较流行的语言.虽然,本人是C#开发者,但是由于公司决定使用java开发,所以只好开始学习java.在学校时候只是接触过没有过深的学习过,而且参加工作后基本也一直在搞C#.好在,现在 ...
- 运用requirejs的异步加载方式
很容易让人以为是权重出问题了,但就我自己多个项目动画导出的经验来看,大 我们说程序员核心能力有以下几点:自学能力,解决问题的能力,团队合作能力.自学可以让我们在这个日新月异的时代不被淘汰;解决问题可以 ...
- OD使用教程10
首先载入程序,然后Ctrl+N打开输入输出表 然后直接输入要找到函数,找到之后下断点,右键-在每个参考上设置断点 然后运行程序来到第一个断点处 然后f8走,开始找注册码没找到就换一个函数,然后看 ...