在我开始描述我的问题之前,我想注意这个问题是针对我在大学的一门课程的项目,所以我不寻求来解决问题,而是提示或解释。
因此,我们假设有3个状态{1,2,3},我也有转换概率矩阵(3x3)。我写了一个基于转移矩阵的matlab脚本,它为马尔可夫链创建了一个带有N个样本的向量。假设第一个状态是状态1.现在,我需要基于条件分布p X n | X n-1 <的霍夫曼代码/ sub>。
如果我没有弄错的话,我认为我必须创建3个霍夫曼字典并根据之前的状态(?)对上面的链中的每个符号进行编码,这意味着每个符号将被编码为一个在我创建的三本词典中,但并非所有词典都使用相同的词典。
如果编码过程正确,我该如何解码编码矢量?
我不确定这是不是应该怎么做。
任何想法都将不胜感激。 提前致谢!
答案 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,那么所有实验都有正确的结果)