灰色預測java實現
/**
* 灰度預測模型
*
* @author Sean Chen
* @version 1.0 2012-12-6
*/
public class GrayModel {
private double a0, a1, a2;
private int size;
private double error;
public GrayModel() {
}
public void build(double[] x0) {
size = x0.length;
double[] x1 = new double[size];
x1[0] = x0[0];
for (int i = 1; i < size; i++) {
x1[i] = x0[i] + x1[i - 1];
}
double[][] b = new double[size - 1][2];
double[][] bt = new double[2][size - 1];
double[][] y = new double[size - 1][1];
for (int i = 0; i < b.length; i++) {
b[i][0] = -(x1[i] + x1[i + 1]) / 2;
b[i][1] = 1;
bt[0][i] = b[i][0];
bt[1][i] = 1;
y[i][0] = x0[i + 1];
}
double[][] t = new double[2][2];
multiply(bt, b, t);
t = inverse(t);
double[][] t1 = new double[2][size - 1];
multiply(t, bt, t1);
double[][] t2 = new double[2][1];
multiply(t1, y, t2);
a0 = t2[0][0];
double u = t2[1][0];
a2 = u / a0;
a1 = x0[0] - a2;
a0 = -a0;
error = 0;
for (int i = 0; i < x0.length; i++) {
double d = (x0[i] - getX0(i));
error += d * d;
}
error /= x0.length;
}
/**
* 誤差
*
* @return
*/
public double getError() {
return error;
}
double getX1(int k) {
return a1 * Math.exp(a0 * k) + a2;
}
double getX0(int k) {
// return a0 * a1 * Math.exp(a0 * k);
if (k == 0)
return a1 * Math.exp(a0 * k) + a2;
else
return a1 * (Math.exp(a0 * k) - Math.exp(a0 * (k - 1)));
}
/**
* 預測後續的值
*
* @param index
* @return
*/
public double nextValue(int index) {
if (index < 0)
throw new IndexOutOfBoundsException();
return getX0(size + index);
}
/**
* 預測下一個值
*
* @return
*/
public double nextValue() {
return nextValue(0);
}
static double[][] inverse(double[][] t) {
double[][] a = new double[2][2];
double det = t[0][0] * t[1][1] - t[0][1] * t[1][0];
a[0][0] = t[1][1] / det;
a[0][1] = -t[1][0] / det;
a[1][0] = -t[0][1] / det;
a[1][1] = t[0][0] / det;
return a;
}
static void multiply(double[][] left, double[][] right, double[][] dest) {
int n1 = left.length;
int m1 = left[0].length;
int m2 = right[0].length;
for (int k = 0; k < n1; k++) {
for (int s = 0; s < m2; s++) {
dest[k][s] = 0;
for (int i = 0; i < m1; i++) {
dest[k][s] += left[k][i] * right[i][s];
}
}
}
}
public static void main(String[] args) {
GrayModel gs = new GrayModel();
// 函式 sin+cos
double[] y = new double[10];
double step = 0.001;
double x = 0.001;
for (int i = 0; i < y.length; i++) {
y[i] = Math.sin(x) + Math.cos(x);
x += step;
}
gs.build(y);
for (int i = 0; i < 5; i++) {
// 真實值與預測值的差值
System.out.println(Math.sin(x) + Math.cos(x) - gs.nextValue(i));
x += step;
}
System.out.println(Math.sqrt(gs.getError()));
}
}
文章轉自 http://chen-yongkai.iteye.com/blog/1742805
* 灰度預測模型
*
* @author Sean Chen
* @version 1.0 2012-12-6
*/
public class GrayModel {
private double a0, a1, a2;
private int size;
private double error;
public GrayModel() {
}
public void build(double[] x0) {
size = x0.length;
double[] x1 = new double[size];
x1[0] = x0[0];
for (int i = 1; i < size; i++) {
x1[i] = x0[i] + x1[i - 1];
}
double[][] b = new double[size - 1][2];
double[][] bt = new double[2][size - 1];
double[][] y = new double[size - 1][1];
for (int i = 0; i < b.length; i++) {
b[i][0] = -(x1[i] + x1[i + 1]) / 2;
b[i][1] = 1;
bt[0][i] = b[i][0];
bt[1][i] = 1;
y[i][0] = x0[i + 1];
}
double[][] t = new double[2][2];
multiply(bt, b, t);
t = inverse(t);
double[][] t1 = new double[2][size - 1];
multiply(t, bt, t1);
double[][] t2 = new double[2][1];
multiply(t1, y, t2);
a0 = t2[0][0];
double u = t2[1][0];
a2 = u / a0;
a1 = x0[0] - a2;
a0 = -a0;
error = 0;
for (int i = 0; i < x0.length; i++) {
double d = (x0[i] - getX0(i));
error += d * d;
}
error /= x0.length;
}
/**
* 誤差
*
* @return
*/
public double getError() {
return error;
}
double getX1(int k) {
return a1 * Math.exp(a0 * k) + a2;
}
double getX0(int k) {
// return a0 * a1 * Math.exp(a0 * k);
if (k == 0)
return a1 * Math.exp(a0 * k) + a2;
else
return a1 * (Math.exp(a0 * k) - Math.exp(a0 * (k - 1)));
}
/**
* 預測後續的值
*
* @param index
* @return
*/
public double nextValue(int index) {
if (index < 0)
throw new IndexOutOfBoundsException();
return getX0(size + index);
}
/**
* 預測下一個值
*
* @return
*/
public double nextValue() {
return nextValue(0);
}
static double[][] inverse(double[][] t) {
double[][] a = new double[2][2];
double det = t[0][0] * t[1][1] - t[0][1] * t[1][0];
a[0][0] = t[1][1] / det;
a[0][1] = -t[1][0] / det;
a[1][0] = -t[0][1] / det;
a[1][1] = t[0][0] / det;
return a;
}
static void multiply(double[][] left, double[][] right, double[][] dest) {
int n1 = left.length;
int m1 = left[0].length;
int m2 = right[0].length;
for (int k = 0; k < n1; k++) {
for (int s = 0; s < m2; s++) {
dest[k][s] = 0;
for (int i = 0; i < m1; i++) {
dest[k][s] += left[k][i] * right[i][s];
}
}
}
}
public static void main(String[] args) {
GrayModel gs = new GrayModel();
// 函式 sin+cos
double[] y = new double[10];
double step = 0.001;
double x = 0.001;
for (int i = 0; i < y.length; i++) {
y[i] = Math.sin(x) + Math.cos(x);
x += step;
}
gs.build(y);
for (int i = 0; i < 5; i++) {
// 真實值與預測值的差值
System.out.println(Math.sin(x) + Math.cos(x) - gs.nextValue(i));
x += step;
}
System.out.println(Math.sqrt(gs.getError()));
}
}
文章轉自 http://chen-yongkai.iteye.com/blog/1742805
相關文章
- 灰色預測分析
- 多維灰色預測模型心得模型
- 多維灰色預測模型的一點改進模型
- pytorch實現股票預測PyTorch
- 灰色預測GM(1,1)模型的理論原理模型
- 灰色預測改進—三角殘差擬合_pythonPython
- java實現文件線上預覽工具Java
- 使用Java預處理實現JSON插入PostgreSQLJavaJSONSQL
- 如何實現一流的專案可預測性?
- 碎片化學習Java(六)-- Java預測子女身高Java
- Java + SikuliX 基於影像實現自動化測試Java
- JAVA + LR實現apache流媒體的效能測試JavaApache
- 【Java】跳躍表的實現以及用例測試Java
- 採用線性迴歸實現訓練和預測(Python)Python
- ALS演算法實現使用者音樂打分預測演算法
- Vue開發微信公眾號預設背景為灰色Vue
- 2024年雲預測:多雲照進現實,但仍不會普及
- 工業物聯網如何實現能源資料預測性管理
- 峰會預告 | Android漏洞檢測沙箱的設計與實現Android
- 基於感知機的人名-性別預測系統 —— Python實現Python
- 軟體測試學習教程——Java實現氣泡排序Java排序
- 基於Java+SpringBoot心理測評心理測試系統功能實現九JavaSpring Boot
- 基於Java+SpringBoot心理測評心理測試系統功能實現十JavaSpring Boot
- java實現樹Java
- 用線性迴歸無編碼實現文章瀏覽數預測
- 實現智慧機器預測性維護收益的三個步驟
- 探索 YOLO v3 實現細節 – 第6篇 預測 (完結)YOLO
- 探索 YOLO v3 實現細節 - 第6篇 預測 (完結)YOLO
- 使用Playwright對Java API實現自動視覺測試 - applitoolsJavaAPI視覺APP
- 實現檔案快速預覽
- vue實現圖片預覽Vue
- JS 實現全景圖預覽JS
- 快速排序(java實現)排序Java
- 快速排序 java實現排序Java
- java實現快速排序Java排序
- JAVA AQS 實現原理JavaAQS
- PAT-A Java實現Java
- 用TensorFlow實現ML模型並調優:每秒可做3億次預測模型
- 在工業環境中透過預測性維護實現價值