📄 auto_regression.java
字号:
package com.strongit.bi.mbs.model;
/**
*
*/
import java.math.BigDecimal;
import java.util.List;
import org.dom4j.Document;
import org.dom4j.DocumentException;
import org.dom4j.DocumentHelper;
import org.dom4j.Element;
/**
* <p>
* 自回归模型
* </p>
*/
public class Auto_Regression {
public String stat(String xmlString) {
Document requestDoc = null;
try {
requestDoc = DocumentHelper.parseText(xmlString);
} catch (DocumentException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
List<Element> dataList = requestDoc
.selectNodes("/Submodel/Data/RowData/ColumnData");
double[] originData = new double[dataList.size()];
// 获取原始数据
for (int i = 0; i < dataList.size(); i++) {
if (dataList.get(i).getText() != null
&& !"".equals(dataList.get(i).getText())) {
originData[i] = Double.valueOf(dataList.get(i).getText())
.doubleValue();
}
}
// 获取时间段长度
Element timespanElement = (Element) requestDoc
.selectSingleNode("/Submodel/Common/Timespan");
int timespan = 0;
if (timespanElement.getText() != null
&& !"".equals(timespanElement.getText()))
timespan = Integer.valueOf(timespanElement.getText()).intValue();
// 获取预测时间长度
Element fcstTimespanElement = (Element) requestDoc
.selectSingleNode("/Submodel/Common/FcstTimespan");
int fcstTimespan = 0;
if (fcstTimespanElement.getText() != null
&& !"".equals(fcstTimespanElement.getText()))
fcstTimespan = Integer.valueOf(fcstTimespanElement.getText())
.intValue();
// 获取p参数
List<Element> argumentList = requestDoc
.selectNodes("Submodel/Argument");
String[] p_array = new String[1];
if (!argumentList.isEmpty() && argumentList.size() > 0)
p_array[0] = argumentList.get(0).getText();
//下面校验参数
ValidatePara paramValid = new ValidatePara();
if (p_array[0] == null ||!paramValid.getValidate(p_array[0])|| p_array[0].startsWith("-")
|| "".equals(p_array[0]))
p_array[0] = "3";
int p = (int)Double.valueOf(p_array[0]).doubleValue();
if (p > 1000 || p > timespan)
p = 3;
double[] Auto_Regression_array = new double[timespan + fcstTimespan];
double[][] A_array = new double[timespan - p][p + 1];
double[][] A_array_Trans = new double[p + 1][timespan - p];
double[][] origin_part = new double[timespan - p][1];
double sum, temp;
// 形成数组Y
for (int i = p; i < timespan; i++) {
origin_part[i - p][0] = originData[i];
}
// 形成数组A的第1列;
for (int i = 0; i < timespan - p; i++) {
A_array[i][0] = 1;
}
// 形成数组A的第2至第p+1列;
for (int i = 0; i < timespan - p; i++) {
for (int j = p; j >= 1; j--) {
A_array[i][j] = originData[i + p - j];
}
}
// 形成数组A的转置数组;
for (int i = 0; i < timespan - p; i++) {
for (int j = 0; j < p + 1; j++) {
A_array_Trans[j][i] = A_array[i][j];
}
}
//
MultiMatrix multi = new MultiMatrix();
double temp1[][] = multi.mMatrix(A_array_Trans, A_array); // 形成A的转置与A的乘积数组;
//
C_Matrix cmatri = new C_Matrix();
double Athwart_temp1_array[][] = cmatri.getMatrix(temp1); // 形成上述乘积数组的逆矩阵;
double temp2[][] = multi.mMatrix(Athwart_temp1_array, A_array_Trans);
double Regression_Coefficient[][] = multi.mMatrix(temp2, origin_part); // 形成回归系数数组B;
//
for (int i = 0; i < p; i++) {
Auto_Regression_array[i] = originData[i];
} // 对返回的结果数组前p项初始化;
//
sum = Regression_Coefficient[0][0];
int maxCycle=Math.min(Auto_Regression_array.length, timespan+1);
for (int i = p; i < maxCycle; i++) {
for (int j = 1; j <= p; j++) {
sum = sum + Regression_Coefficient[j][0] * originData[i - j];
}
temp = sum;
BigDecimal c = new BigDecimal(temp);
Auto_Regression_array[i] = c.setScale(2, BigDecimal.ROUND_HALF_UP)
.doubleValue();
sum = Regression_Coefficient[0][0];
} // 形成结果数组的第p+1项至第n+1项;
// 添加应用该模型后的时序结果
Element resultDatas=requestDoc.getRootElement().element("ResultDatas");
Element timeResultData = resultDatas.addElement("ResultData")
.addAttribute("view", "TimeSeries");
Element timeResultRow = timeResultData.addElement("RowData")
.addAttribute("label", "p次自回归");
for (int i = 0; i < Auto_Regression_array.length; i++) {
timeResultRow.addElement("ColumnData").setText(
String.valueOf(Auto_Regression_array[i]));
}
// 添加该模型的回归系数
Element coefResultData = resultDatas.addElement("ResultData")
.addAttribute("view", "Coef");
for (int i = 0; i < Regression_Coefficient.length; i++) {
Element coefResultRow = null;
if (i == 0) {
coefResultRow = coefResultData.addElement("RowData")
.addAttribute("label", "回归常数");
} else {
coefResultRow = coefResultData.addElement("RowData")
.addAttribute("label", "前" + i + "期回归系数");
}
coefResultRow.addElement("ColumnData").setText(
String.valueOf(Regression_Coefficient[i][0]));
}
return requestDoc.asXML();
}
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -