1. 程式人生 > >隱馬爾可夫模型(五)——隱馬爾可夫模型的解碼問題(維特比演算法)

隱馬爾可夫模型(五)——隱馬爾可夫模型的解碼問題(維特比演算法)

複製程式碼
#include <stdio.h>
#include <stdlib.h>
#include <string.h>


int main()
{
        float trans_p[3][3] = {{0.5,0.2,0.3},{0.3,0.5,0.2},{0.2,0.3,0.5}};
        float emit_p[3][2] = {{0.5,0.5},{0.4,0.6},{0.7,0.3}};
        float result[4][3];
        int list[4] = {0,1,0,1};
        int max[4][3];
        float tmp;
        //step1:Initialization
        result[0][0] = 0.2*0.5;
        result[0][1] = 0.4*0.4;
        result[0][2] = 0.4*0.7;


        int i,j,k, count = 1, max_node;
        float max_v;
        //step2:歸納運算
        for (i=1; i<=3; i++)
        {
            for(j=0; j<=2; j++)
            {
                tmp = result[i-1][0] * trans_p[0][j] * emit_p[j][list[count]];
                max[i][j] = 0;
                for(k=1; k<=2; k++)
                {
                    if(result[i-1][k] * trans_p[k][j] * emit_p[j][list[count]] > tmp)
                    {
                        tmp = result[i-1][k] * trans_p[k][j]* emit_p[j][list[count]];
                        max[i][j] = k;
                    }
                   result[i][j] = tmp;
                }
                max_v = result[3][0];
                max_node = 0;
                for (k=1; k<=2; k++)
                {
                    if(result[3][k] > max_v)
                    {
                        max_v = result[3][k];
                        max_node = k;
                    }
                }
            }
            count += 1;
        }
        //step3:終結
       for (i=0; i<=3; i++)
        {
            for(j=0; j<=2; j++)
            {
                printf("%d %d     %f\n",i+1,j+1,result[i][j]);


            }
        }
        printf("Pmax=%f\n", max_v);
        printf("step4:%d   \n", max_node+1);
        //step4:回溯
        for(k=3; k>=1; k--)
        {
            printf("step%d:%d  \n",k, max[k][max_node]+1);
            max_node = max[k][max_node];
        }
        return 0;
    }
複製程式碼

相關推薦

模型——模型解碼問題(演算法

#include <stdio.h> #include <stdlib.h> #include <string.h> int main() {         float trans_p[3][3] = {{0.5,0.2,0.3},{0.3,0.5,0.2},{0

hmm前後向演算法 模型HMM鮑姆-韋演算法求解HMM引數 模型HMM演算法解碼隱藏狀態序列 模型HMMHMM模型

跟醫生就醫推導過程是一樣的 隱馬爾科夫模型HMM(一)HMM模型     隱馬爾科夫模型HMM(二)前向後向演算法評估觀察序列概率     隱馬爾科夫模型HMM(三)鮑姆-韋爾奇演算法求解HMM引數     隱馬爾科夫模型HMM(四)維特比演算法解碼隱藏狀態序列     在隱馬爾科夫模型HMM(一)

模型(HMMs)之演算法及前向後向演算法

維特比演算法(Viterbi Algorithm) 找到可能性最大的隱藏序列 通常我們都有一個特定的HMM,然後根據一個可觀察序列去找到最可能生成這個可觀察序列的隱藏序列。 1.窮舉搜尋 我們可以在下圖中看到每個狀態和觀察的關係。 通過計算所有可能的隱藏序列的概率,

中文 NLP3 -- 四大概率演算法模型模型 HMM 和 演算法 Viterbi

之前說過,基於NLP處理的演算法思想目前主要有兩大流派:統計論流派和深度學習流派。而在統計論中,常用的 4 大概率模型分別是 樸素貝葉斯模型,隱馬爾科夫模型,最大熵模型和條件隨機場模型。 對於樸素貝葉斯模型,前面已經多次打過交道,原理也相對簡單。這裡解析第二大模型 -- 隱

詳解模型(HMM)中的演算法

筆記轉載於GitHub專案:https://github.com/NLP-LOVE/Introduction-NLP 4. 隱馬爾可夫模型與序列標註 第3章的n元語法模型從詞語接續的流暢度出發,為全切分詞網中的二元接續打分,進而利用維特比演算法求解似然概率最大的路徑。這種詞語級別的模型無法應對 OOV(Out

模型(前向後向演算法、鮑姆-韋演算法演算法)

 概率圖模型是一類用圖來表達變數相關關係的概率模型。它以圖為表示工具,最常見的是用一個結點表示一個或一組隨機變數,結點之間的變表是變數間的概率相關關係。根據邊的性質不同,可以將概率圖模型分為兩類:一類是使用有向無環圖表示變數間的依賴關係,稱為有向圖模型或貝葉斯網;另一類是使用無向圖表示變數間的相關關係,稱為無

動態規劃之隱含模型(HMM)和演算法(Viterbi Algorithm)

動態規劃之(HMM)和(Viterbi Algorithm) 1. 實際問題 HMM-韋小寶的骰子 • 兩種骰子,開始以2/5的概率出千。 – 正常A:以1/6的概率出現每個點 – 不正常B: 5,6出現概率為3/10,其它為1/10 • 出千的

自然語言處理 HMM 演算法Viterbi Algorithm 例項轉載

給大家推薦一個講解HMM比較詳細入門的內容: wiki上一個比較好的HMM例子 這是另外一個例子,結合分詞舉例的HMM: 這是詳細講解維位元演算法的系列文章,維特比演算法(Viterbi Algorithm)  HMM學習最佳範例六:維特比演算法 來自52nlp

HMM學習筆記:動態規劃與演算法

學習隱馬爾可夫模型(HMM),主要就是學習三個問題:概率計算問題,學習問題和預測問題。在前面講了概率計算問題:前後向演算法推導,Baum-Welch演算法。最後在這裡講最後的一個問題,預測問題。 預測問題:給定HMM引數

HMM-演算法理解與實現python

[HMM-前向後向演算法理解與實現(python)](https://www.cnblogs.com/gongyanzh/p/12880387.html) [HMM-維特比演算法理解與實現(python)]() --- ### 解碼問題 - 給定觀測序列 $O=O_1O_2...O_T$,模型 $\lamb

模型HMMViterbi演算法通俗理解

隱馬爾科夫模型:https://blog.csdn.net/stdcoutzyx/article/details/8522078 維特比演算法:https://blog.csdn.net/athemeroy/article/details/79339546 隱含馬爾可夫模型並不是俄

深入理解Java內存模型——鎖

運行 包含 示意圖 支持 ole img api turn before 本文轉自:http://www.infoq.com/cn/articles/java-memory-model-5 鎖的釋放-獲取建立的happens before 關系 鎖是java並發編程中最重要

資料庫_資料模型

笛卡爾乘積(cross-product)× 例: R1 sid bid day 22 101 10/10/96 58 103

[學習筆記]機器學習——演算法模型:貝葉斯演算法

傳統演算法(五) 貝葉斯演算法 一、貝葉斯定理 簡介 貝葉斯定理是18世紀英國數學家托馬斯·貝葉斯(Thomas Bayes)提出得重要概率論理論;貝葉斯方法源於他生前為解決一個“逆概”問題寫的一篇文章

同步和Java記憶體模型Volatile

作者:Doug lea 譯者:杜建雄校對者:方騰飛 Volatile 從原子性,可見性和有序性的角度分析,宣告為volatile欄位的作用相當於一個類通過get/set同步方法保護普通欄位,如下: final class VFloat { private float value;

深入理解Java記憶體模型——鎖

鎖的釋放-獲取建立的happens before 關係 鎖是java併發程式設計中最重要的同步機制。鎖除了讓臨界區互斥執行外,還可以讓釋放鎖的執行緒向獲取同一個鎖的執行緒傳送訊息。下面是鎖釋放-獲取的示例程式碼: class MonitorExample { int a = 0;

Akka併發程式設計——第六節:Actor模型

本將主要內容: 1. !訊息傳送,Fire-and-Forget訊息模型 2. ?訊息傳送,Send-And-Receive-Future訊息模型 Akka提供了兩種訊息模型:fire-and-forget和Send-And-Receive-Future。

乾貨|個性化推薦系統五大研究熱點之解釋推薦

【編者按】微軟亞洲研究院社會計算組的研究員們從深度學習、知識圖譜、強化學習、使用者畫像、可解釋性推薦等五個方面,展望了未來推薦系統發展的方向。 在前幾篇文章中,我們分別介紹了深度學習、知識圖譜、強化學習、使用者畫像在推薦系統中的應用以及未來可能的研究方向。在今天的最後一篇文章中,我們將介紹推薦系

C++中的單例模式及按需釋放模型

四、多執行緒安全的通用單例類例項獲取器 例子工程的名稱是SingletonThreadSafeInstanceGetter。 剛開始寫本文時,本沒有想實現多執行緒版本,主觀上以為同通常的單例模式一樣,多個多執行緒同步就可以了,很簡單,讓讀者自己開發就好了,不過後來真正去思考

資料結構之圖帶權圖 迪傑斯演算法

// 主要思想是: 每次尋找最小的邊  這樣的話從上一個節點 到這個節點的值 是最小的 當找到最小的邊時,把final[v] = true 表示從原點到這個節點的最小值 已經找到了   <!DOCTYPE html> <html> &l