簡體   English   中英

Java中的馬爾可夫模型決策過程

[英]Markov Model descision process in Java

我正在用Java編寫輔助學習算法。

我遇到了一個我可以解決的數學問題,但由於處理過程很重,我需要一個最佳解決方案。

話雖這么說,如果有人知道一個非常棒的優化庫,但語言是Java所以需要考慮。

這個想法很簡單:

對象將存儲變量的組合,例如ABDC,ACDE,DE,AE。

組合的最大數量將取決於我可以在不減慢程序速度的情況下運行的數量,因此理論上可以說100。

決策過程將每次迭代生成一個隨機變量。 如果生成的變量是其中一個組合的一部分,例如。 'A'是ABDC和ACDE的一部分,而不是C和B(或存儲的組合中的任何后續字母)的傾向將增加。

為了使事情更加清晰,我們假設'A','B','C','D'和'E'是唯一可能的變量。 事實是,會有更多像12或14,但這個最大值還取決於我可以處理多少沒有滯后。

由於有五個可能的變量,它將為第一次迭代生成加權1/5隨機滾動。 如果該滾動結果為'A',則在下一次迭代中'B'和'C'現在將具有2/5傾向而不是1/5。

如果下一次迭代產生'B','D'傾向將增加到3/5。 注意:關系是指數關系; 實際上,它不會是1/5,而是像10%那樣略微提升,如果它達到序列中的第4個變量,它將滾雪球說50%。

現在,在Java中,我可以通過跟蹤每個對象的所有存儲組合來實現此功能。 我在想通過在每次迭代中以小步驟分配跟蹤過程,它不應該太慢。

另一種解決方案是繪制所有可能的組合及其潛在的傾向。 這當然只需要一個搜索功能,但也會在計算所有可能性和存儲在某個地方時出現問題,可能在文件中。

有人建議我應該使用Markov模型和/或庫,盡管我對這種類型的數學並不太熟悉。

如何在Java中快速計算此過程?

示例>>>

只有一個序列ABC。

對於三個數字,機會開始相等所以它看起來像蘭特(1,3)

如果A是結果,我們增加B的可能性,因為它是序列中的下一個字母。 讓我們說它加倍。

所以現在機會是:A = 1/4,C = 1/4,B = 2/4

該函數現在看起來像rand(1,4),其中3和4的結果都代表選項B.

如果下一個結果是B,我們希望增加C的可能性,因為它是序列中的下一個字符,但是它是上次增加的兩倍(指數)

機會現在類似於:A = 1/6,C = 1/6,B = 4/6

該函數現在為rand(1/6),其中值3,4,5,6表示C.

如果需要,您可以編寫C / C ++版本,並使用NDK(NDK的開銷是從Java到C / C ++方法的JNI轉換,但是一旦出現,它們就會快得多)

這是一個想法。 但是......我不認為你必須走得那么遠(至少要獲得一個適用於小型套裝的版本)(也許后來轉向NDK可能是LARGE套裝的更好選擇)

我認為你會更好地將它視為一組“整數分數”,也就是......每組動作概率的二維數組。 意思是“頂行”上的分子和“底行”上的分母。 由於您要使用的集合可能很小,我認為每個節點都有自己的概率集的節點的簡單鏈接列表將起作用。 (這些概率是從'那個'節​​點到S'到S'的轉換表。)

 int[][] probs = new int[100][2];

所以你可以把它想象成......

1 2 1 1

4 3 4 9

與整數算術一樣,1 / 4,2 / 3,1 / 4,1 / 9。 這在算法的“某些”部分會更容易,因為您將能夠為“removeColumn”(make 0/0,跳過其余的處理等等(或者你想要代表它)制作好的輔助函數)和'adjustProbabilities()'

(如果你將分母設為單個int(最小的公分母),你可能能夠使用單個數組的數組,但我可能會在使2D數組版本工作后進行優化)

然后只需編寫“簡單”通用P,R和V方法 ,這些方法就每個節點的數據進行交互。 然后使用可良的OO設計使它們可調節/可擴展/等。

然后只是“玩數字”的折扣因子等。

我認為這更像是“花時間來測試它”,而不僅僅是關於任何真正復雜的數學算法的問題等等,因為從我看來,沒有'明顯'的地方來優化核心算法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM