為了預測下一步的變化率,我需要獲得建立馬爾可夫鏈模型的轉移矩陣,利用現有資料計算變化率,計算出相應的狀態,然后求出每個狀態的轉移概率 。 通過轉移概率,我們可以預測下一步的變化率,但是我得到的轉移概率矩陣有問題。 幾行概率的總和不等于1。我不知道如何修改它。 請幫忙!代碼如下:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
public class TestA {
public static void main(String[] args) {
//12個測驗的真實資料
double [] rainFall = new double[] {
1438.646484,1445.384766,1884.957031,1878.256836,1891.259766,
2364.574219,2773.780273,2865.074219,3365.361328,3390.108398,
4417.552734,5636.793945
};
double max = rainFall[0];
for(int e = 1;e<rainFall.length;e++){
if(rainFall[e]>max){
max = rainFall[e];
}}
double min = rainFall[0];
for(int k = 1;k<rainFall.length;k++){
if(rainFall[k]<min){
min = rainFall[k];
}}
double cha=0;
cha=max-min;
System.out.print("總變化量:"+cha+"\n");
double[] arr=new double[rainFall.length];
List<Integer> levelList = new ArrayList<Integer>();
//對應的狀態值為0,1,2,3,4,5
int[] statusValue = new int[] {0,1,2,3,4,5};
// 此陣列用于存盤每種狀態對應出現的次數及其狀態值
int[] statusValueNum = new int[statusValue.length];
//計算改變率
for (int i =1; i < rainFall.length; i++) {
double h=rainFall[i]-rainFall[i-1];
arr[i]=new Double(Math.round(h*1000/cha)/1000.0);
System.out.print("變化率為:"+arr[i]+"\n");
}
//分為六個狀態
// 改變率為-0.35--0.2為狀態0,-0.2--0.1為狀態1,-0.1-0為狀態2,0-0.1為狀態3,0.1-0.2為狀態4,0.2-0.35為狀態5
for(int j = 1; j < rainFall.length; j++){
if (arr[j] >= -0.35 && arr[j] < -0.2) {
statusValueNum[0]++;
levelList.add(0);
}
else if (arr[j]>=-0.2 &&arr[j]< -0.1) {
statusValueNum[1]++;
levelList.add(1);
}
else if (arr[j]>=-0.1 && arr[j]< 0) {
statusValueNum[2]++;
levelList.add(2);
}
else if (arr[j]>=0 && arr[j]< 0.1) {
statusValueNum[3]++;
levelList.add(3);
}
else if (arr[j]>=0.1 && arr[j]< 0.2) {
statusValueNum[4]++;
levelList.add(4);
}
else if(arr[j]>=0.2 && arr[j]< 0.35){
statusValueNum[5]++;
levelList.add(5);
}
//}
}
//對應的狀態值
System.out.println("對應的狀態值:\n" + levelList + "\n");
System.out.println("狀態0,1,2,3,4,5分別出現的次數:\n" + Arrays.toString(statusValueNum) + "\n");
// 獲取轉移概率矩陣
Double[][] transProbablityMatrix = statusTransProbablity(statusValueNum, levelList);
System.out.println("一步轉移概論矩陣結果:");
for (int i = 0; i < transProbablityMatrix.length; i++) {
for (int j = 0; j < transProbablityMatrix.length; j++) {
System.out.printf("%.4f\t", transProbablityMatrix[i][j]);// 輸出格式化后的資料
}
System.out.println();
}
}
/* 一步轉移概率矩陣 解釋:狀態有0 1 2 3 4 5 ,當 當前狀態如0且下一狀態為如1,稱為一步狀態轉移 */
public static Double[][] statusTransProbablity(int[] statusValueNum, List<Integer> levelList) {
Double[][] transProbablityMatrix = new Double[6][6];
// 一步轉移概率矩陣
// /**********************************遍歷結果是一步狀態轉移概率矩陣*******************************/
for (int s = 0; s < statusValueNum.length; s++) {
// 控制陣列的行數變化 s充當了狀態值
int status = 0;
// 狀態的型別取值為0 1 2 3 4 5當每一次遍歷完之后,status要重新變化
for (int i = 0; i < statusValueNum.length; i++) {
int index = 0; // 記錄一步轉移狀態的次數 每一次遍歷完畢清0
for (int j = 0; j < levelList.size() - 1; j++) {
// levelList.size()-1 原因是k+1 已經可以達到鏈尾
int k = j;
// k值是為了在當前遍歷中使用 如果當前狀態值和下一次狀態值相等遍歷整個資料鏈 每次只查找一次狀態的改變
// 例如先查找0轉移到0,然后是0到1 依次類推
while (levelList.get(k).intValue() == s && levelList.get(k + 1).intValue() == status) {
index++;// 計數器加1
if (k < levelList.size() - 2) {// 減2解釋 當k=28時 levelList.get(k+1) 此處會下標越界,已超出表述范圍
k++;// 當前位置向后移動一位 即為了查詢某個狀態值連續出現的次數
} else {
break; // 當不滿足當前條件,終止最近的回圈體
}
}
}
// System.out.println("Trans[" + s + "][" + i + "] " + index);
// 計算概率值
transProbablityMatrix[s][i] = Double.valueOf(index) / Double.valueOf(statusValueNum[s]);
status++;
}
}
return transProbablityMatrix;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/204922.html
標籤:Java相關
上一篇:感謝
