国产xxxx99真实实拍_久久不雅视频_高清韩国a级特黄毛片_嗯老师别我我受不了了小说

資訊專欄INFORMATION COLUMN

viterbi 維特比解碼過(guò)程,狀態(tài)轉(zhuǎn)移矩陣

tuantuan / 846人閱讀

摘要:狀態(tài)轉(zhuǎn)移,發(fā)射概率逐次計(jì)算每個(gè)序列節(jié)點(diǎn)的所有狀態(tài)下的概率值,最大概率值對(duì)應(yīng)的。應(yīng)用狀態(tài)轉(zhuǎn)移求解最佳轉(zhuǎn)移路徑。狀態(tài)轉(zhuǎn)移矩陣的作用在于在每個(gè)狀態(tài)轉(zhuǎn)移概率計(jì)算時(shí),和固有的狀態(tài)轉(zhuǎn)移矩陣進(jìn)行加和,再計(jì)算。

viterbi過(guò)程
1.hmm類似。 狀態(tài)轉(zhuǎn)移,發(fā)射概率
2.逐次計(jì)算每個(gè)序列節(jié)點(diǎn)的所有狀態(tài)下的概率值,最大概率值對(duì)應(yīng)的index。
3.概率值的計(jì)算,上一個(gè)節(jié)點(diǎn)的概率值*轉(zhuǎn)移概率+當(dāng)前概率值。
4.最后取出最大的一個(gè)值對(duì)應(yīng)的indexes




難點(diǎn):    理解viterbi的核心點(diǎn),在于每個(gè)時(shí)間步都保留每一個(gè)可視狀態(tài),每一個(gè)可視狀態(tài)保留上一個(gè)時(shí)間步的最大隱狀態(tài)轉(zhuǎn)移,
     每一個(gè)時(shí)間步t記錄上一個(gè)最大概率轉(zhuǎn)移過(guò)來(lái)的時(shí)間步t-1的信息,包括index/概率值累積。
         迭代完時(shí)間步,根據(jù)最后一個(gè)最大累積概率值,逐個(gè)往前找即可。 根據(jù)index對(duì)應(yīng)的狀態(tài)逐個(gè)往前找。

應(yīng)用:     狀態(tài)轉(zhuǎn)移求解最佳轉(zhuǎn)移路徑。  只要連續(xù)時(shí)間步,每個(gè)時(shí)間步有狀態(tài)分布,前后時(shí)間步之間有狀態(tài)轉(zhuǎn)移,就可以使用viterbi進(jìn)行最佳狀態(tài)轉(zhuǎn)移計(jì)算求解。
         狀態(tài)轉(zhuǎn)移矩陣的作用在于 在每個(gè)狀態(tài)轉(zhuǎn)移概率計(jì)算時(shí),和固有的狀態(tài)轉(zhuǎn)移矩陣進(jìn)行加和,再計(jì)算。相當(dāng)于額外的概率添加。
 import numpy as np


def viterbi_decode(score, transition_params):
    """
    保留所有可視狀態(tài)下,對(duì)seqlen中的每一步的所有可視狀態(tài)情況下的中間狀態(tài)求解概率最大值,如此
    :param score:
    :param transition_params:
    :return:
    """
    # score  [seqlen,taglen]  transition_params [taglen,taglen]
    trellis=np.zeros_like(score)
    trellis[0]=score[0]
    backpointers=np.zeros_like(score,dtype=np.int32)

    for t in range(1,len(score)):
        matrix_node=np.expand_dims(trellis[t-1],axis=1)+transition_params  #axis=0 代表發(fā)射概率初始狀態(tài)
        trellis[t]=score[t]+np.max(matrix_node,axis=0)
        backpointers[t]=np.argmax(matrix_node,axis=0)

    viterbi=[np.argmax(trellis[-1],axis=0)]
    for backpointer in reversed(backpointers[1:]):
        viterbi.append(backpointer[viterbi[-1]])
    viterbi_score = np.max(trellis[-1])
    viterbi.reverse()
    print(trellis)
    return viterbi,viterbi_score
def calculate():
    score = np.array([[1, 2, 3],
              [2, 1, 3],
              [1, 3, 2],
              [3, 2,1]])  # (batch_size, time_step, num_tabs)
    transition = np.array([ [2, 1, 3], [1, 3, 2], [3, 2, 1] ] )# (num_tabs, num_tabs)
    lengths = [len(score[0])] # (batch_size, time_step) # numpy print("[numpy]")
    # np_op = viterbi_decode( score=np.array(score[0]), transition_params=np.array(transition))
    # print(np_op[0])
    # print(np_op[1])
    print("=============") # tensorflow
    # score_t = tf.constant(score, dtype=tf.int64)
    # transition_t = transition, dtype=tf.int64
    tf_op = viterbi_decode( score, transition)
    print("--------------------")
    print(tf_op)

if __name__=="__main__":
    calculate()
// java 版本
import java.lang.reflect.Array;
import java.util.ArrayList;
import java.util.List;

public class viterbi {

    public static int[]  viterbi_decode(double[][]score,double[][]trans ) {
        //score(16,31) trans(31,31)

        int path[] = new int[score.length];
        double trellis[][] = new double[score.length][score[0].length];
        int backpointers[][] = new int [score.length][score[0].length];
        trellis[0] = score[0];

        for(int t = 1; t max_column) {
                        max_column = v[i][j];
                        line_point = i;
                    }
                }
                max_v[j] = max_column;
                max_v_linepoint[j] = line_point;
            }

            for(int i = 0 ;i < score[0].length; i++ ) {
                trellis[t][i] = score[t][i] + max_v[i];
                backpointers[t][i] = max_v_linepoint[i];
            }

        }

        int viterbi[] = new int[score.length];
//            List viterbi = new ArrayList<>();
        double max_trellis = trellis[score.length-1][0];
        for(int j = 0; j< trellis[score.length-1].length ;j++) {
            if(trellis[score.length-1][j] > max_trellis) {
                max_trellis = trellis[score.length-1][j];
//                    viterbi.add(j);
                viterbi[0] = j;
            }
        }

        for(int i=1;i< 1+(backpointers.length)/2;i++){
            int temp[] = backpointers[i];
            backpointers[i] = backpointers[backpointers.length-i];
            backpointers[backpointers.length-i]=temp;
        }

        for(int i = 1; i < backpointers.length; i++ ) {
//                viterbi.add( backpointers[i][viterbi.get(viterbi.size() - 1)]);
            viterbi[i] = backpointers[i][viterbi[i-1]];
        }


        for(int i = 0;i < (viterbi.length)/2; i++){    //把數(shù)組的值賦給一個(gè)臨時(shí)變量
            int temp = viterbi[i];
            viterbi[i] = viterbi[viterbi.length-i-1];
            viterbi[viterbi.length-i-1] = temp;
        }


        return viterbi;
    }

    public static void main(String[] args){
        List> score=new ArrayList<>();
        ArrayList row1=new ArrayList<>();
        row1.add(1);
        row1.add(2);
        row1.add(3);

        ArrayList row2=new ArrayList<>();
        row2.add(2);
        row2.add(1);
        row2.add(3);

        ArrayList row3=new ArrayList<>();
        row3.add(1);
        row3.add(3);
        row3.add(2);

        ArrayList row4=new ArrayList<>();
        row4.add(3);
        row4.add(2);
        row4.add(1);

        score.add(row1);
        score.add(row2);
        score.add(row3);
        score.add(row4);

        List> trans=new ArrayList<>();
        ArrayList row11=new ArrayList<>();
        row11.add(2);
        row11.add(1);
        row11.add(3);

        ArrayList row12=new ArrayList<>();
        row12.add(1);
        row12.add(3);
        row12.add(2);

        ArrayList row13=new ArrayList<>();
        row13.add(3);
        row13.add(2);
        row13.add(1);

        trans.add(row11);
        trans.add(row12);
        trans.add(row13);



//        double[][] score_double=(double[][]) score.toArray();
//        double[][] trans_double=(double[][]) trans.toArray();
        System.out.println(score);
        System.out.println(trans);

        double[][] score_double=new double[score.size()][score.get(0).size()];
        for(int i=0;i           
               
                                           
                       
                 

文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。

轉(zhuǎn)載請(qǐng)注明本文地址:http://specialneedsforspecialkids.com/yun/43429.html

相關(guān)文章

  • vertibi python 實(shí)現(xiàn)

    摘要:題目闡釋算法實(shí)現(xiàn)。用實(shí)現(xiàn)的和表現(xiàn)層的轉(zhuǎn)移動(dòng)態(tài)規(guī)劃問(wèn)題,歸結(jié)到相鄰兩個(gè)之間存在轉(zhuǎn)移概率,轉(zhuǎn)移概率。難點(diǎn)三層循環(huán),為了保留,計(jì)算每個(gè)的的概率,所以要嵌套在之外。 題目闡釋: viterbi算法實(shí)現(xiàn)。 用python實(shí)現(xiàn)viterbi的hidden state 和 表現(xiàn)層的轉(zhuǎn)移 動(dòng)態(tài)規(guī)劃問(wèn)題,歸結(jié)到 相鄰兩個(gè)step之間存在 state轉(zhuǎn)移概率,state2emibission轉(zhuǎn)移概...

    zhangyucha0 評(píng)論0 收藏0
  • MCMC和Gibbs Sampling算法

    摘要:算法中的馬氏鏈轉(zhuǎn)移以上采樣過(guò)程中,如圖所示,馬氏鏈的轉(zhuǎn)移只是輪換的沿著坐標(biāo)軸軸和軸做轉(zhuǎn)移,于是得到樣本馬氏鏈?zhǔn)諗亢螅罱K得到的樣本就是的樣本,而收斂之前的階段稱為。 作者:chen_h微信號(hào) & QQ:862251340微信公眾號(hào):coderpai簡(jiǎn)書(shū)地址:https://www.jianshu.com/p/278... 本文是整理網(wǎng)上的幾篇博客和論文所得出來(lái)的,所有的原文連接都在文...

    Bamboy 評(píng)論0 收藏0

發(fā)表評(píng)論

0條評(píng)論

最新活動(dòng)
閱讀需要支付1元查看
<