⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 auto_regression.java

📁 对数据进得自回归分析预测。并生成下一周期的预测值
💻 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 + -