基于条件分布的马尔可夫链霍夫曼编码

时间:2018-04-21 12:05:34

标签: matlab huffman-code markov-chains information-theory

在我开始描述我的问题之前,我想注意这个问题是针对我在大学的一门课程的项目,所以我不寻求来解决问题,而是提示或解释。

因此,我们假设有3个状态{1,2,3},我也有转换概率矩阵(3x3)。我写了一个基于转移矩阵的matlab脚本,它为马尔可夫链创建了一个带有N个样本的向量。假设第一个状态是状态1.现在,我需要基于条件分布p X n | X n-1 <的霍夫曼代码/ sub>。

如果我没有弄错的话,我认为我必须创建3个霍夫曼字典并根据之前的状态(?)对上面的链中的每个符号进行编码,这意味着每个符号将被编码为一个在我创建的三本词典中,但并非所有词典都使用相同的词典。

如果编码过程正确,我该如何解码编码矢量?

我不确定这是不是应该怎么做。

任何想法都将不胜感激。 提前致谢!

2 个答案:

答案 0 :(得分:1)

没错。三个符号p11,p12和p13会有一个霍夫曼代码,另一个代表p21,p22,p23等。

解码根据当前状态选择要使用的代码。需要假设起始状态,或者需要传输起始状态。

然而,这种情况有点奇怪,因为三个符号只有一个霍夫曼码,由1位,2位和2位组成。例如。 0,10,11。因此,您获得的唯一收益是选择一位符号的最高概率。

答案 1 :(得分:0)

嗯,解决了上面的问题后,我决定用八度脚本发布答案,以防将来有人需要。

所以,我们假设有5个状态{1,2,3,4,5},我也有转换概率矩阵(5x5)。我霍夫曼编码并解码马尔可夫链进行1000次蒙特卡罗实验。

Octave脚本是:

%starting State of the chain
starting_value = 1;
%Chain Length
chain_length = 100;

%# of Monte Carlo experiments
MC=1000;

%Variable to count all correct coding/encoding experiments
count=0;

%Create unique symbols, and assign probabilities of occurrence to them.
symbols = 1:5; 
p1 = [.5 .125 .125 .125 0.125];
p2 = [.25 .125 .0625 .0625 0.5];
p3 = [.25 .125 .125 .25 0.25];
p4 = [.125 0 .5 .25 0.125];
p5 = [0 .5 .25 .25 0];

%Create a Huffman dictionary based on the symbols and their probabilities.
dict1 = huffmandict(symbols,p1);
dict2 = huffmandict(symbols,p2);
dict3 = huffmandict(symbols,p3);
dict4 = huffmandict(symbols,p4);
dict5 = huffmandict(symbols,p5);

% Create the transition matrix for each state
T= [0.5 0.125 0.125 0.125 0.125;
    0.25 0.125 0.0625 0.0625 0.5;
    0.25 0.125 0.125 0.25 0.25;
    0.125 0 0.5 0.25 0.125 ;
    0 0.5 0.25 0.25 0];

%Initialize Marcov Chain
chain = zeros(1,chain_length);
chain(1)=starting_value;

for i=1 :MC
    comp=[];
    dsig=[];
    %Create Markov Chain
    for i=2:chain_length
        this_step_distribution = T(chain(i-1),:);
        cumulative_distribution = cumsum(this_step_distribution);

        r = rand();

        chain(i) = find(cumulative_distribution>r,1);
    end

    comp=huffmanenco(chain(1),dict1);
    %Encode the random symbols.
    for i=2:chain_length
        if chain(i-1)==1
            comp = horzcat(comp,huffmanenco(chain(i),dict1));
        elseif chain(i-1)==2
            comp = horzcat(comp,huffmanenco(chain(i),dict2));
        elseif chain(i-1)==3
            comp = horzcat(comp,huffmanenco(chain(i),dict3));
        elseif chain(i-1)==4
            comp = horzcat(comp,huffmanenco(chain(i),dict4));
        elseif chain(i-1)==5
            comp = horzcat(comp,huffmanenco(chain(i),dict5));
        end
    end

    %Decode the data. Verify that the decoded data matches the original data.
    dsig(1)=starting_value;
    comp=comp(length(dict1{1,1})+1:end);
    for i=2:chain_length
        if dsig(end)==1
            temp=huffmandeco(comp,dict1);
            comp=comp(length(dict1(temp(1)){1,1})+1:end);
        elseif dsig(end)==2
            temp=huffmandeco(comp,dict2);
            comp=comp(length(dict2(temp(1)){1,1})+1:end);
        elseif dsig(end)==3
            temp=huffmandeco(comp,dict3);
            comp=comp(length(dict3(temp(1)){1,1})+1:end);
        elseif dsig(end)==4
            temp=huffmandeco(comp,dict4);
            comp=comp(length(dict4(temp(1)){1,1})+1:end);
        elseif dsig(end)==5
            temp=huffmandeco(comp,dict5);
            comp=comp(length(dict5(temp(1)){1,1})+1:end);
       end
       dsig=horzcat(dsig,temp(1));
    end
    count=count+isequal(chain,dsig);
end

count

&#34;变量&#34; count是为了确保在所有MC实验中,生成的马尔可夫链被正确编码和解码。 (显然,如果计数等于1000,那么所有实验都有正确的结果)