基于条件分布的马尔可夫链霍夫曼编码
Huffman Coding for Markov Chain based on conditional distribution
在我开始描述我的问题之前,我想指出这个问题是针对我在大学的一门课程的项目,所以我不寻求解决方案,而不是提示或解释。
所以,假设有 3 个状态 {1,2,3},我也有转移概率矩阵 (3x3)。我编写了一个基于转换矩阵的 matlab 脚本,它为马尔可夫链创建了一个包含 N 个样本的向量。假设第一个状态是状态 1。现在,我需要根据条件分布 pXn |Xn 对这条链进行霍夫曼编码−1 .
如果我没记错的话,我认为我必须创建 3 个霍夫曼字典并根据先前的状态(?)对上面链中的每个符号进行编码,这意味着每个符号都将使用我创建的三本词典中的一本,但并非所有词典都使用相同的词典。
如果编码过程是正确的,如何对编码后的向量进行解码?
我不确定是否应该这样做。
如有任何想法,我们将不胜感激。
提前致谢!
没错。三个符号 p11、p12 和 p13 将有一个霍夫曼代码,另一个用于 p21、p22、p23 等。
解码根据当前状态选择使用哪个代码。要么需要假设起始状态,要么需要传输起始状态。
不过这种情况有点奇怪,因为三个符号只有一个霍夫曼码,由1位、2位和2位组成。例如。 0、10、11。因此,您获得的唯一收益是为一位符号选择最高概率。
嗯,解决了上面的问题后,我决定 post 用八度脚本来回答,以防将来有人需要它。
因此,假设有 5 个状态 {1,2,3,4,5},并且我还有转移概率矩阵 (5x5)。我对 1000 Monte Carlo 次实验的马尔可夫链进行了霍夫曼编码和解码。
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
"variable" 计数是为了确保在所有 MC 实验中,生成的马尔可夫链都得到了正确的编码和解码。 (显然,如果 count 等于 1000,那么所有实验的结果都是正确的)
在我开始描述我的问题之前,我想指出这个问题是针对我在大学的一门课程的项目,所以我不寻求解决方案,而不是提示或解释。
所以,假设有 3 个状态 {1,2,3},我也有转移概率矩阵 (3x3)。我编写了一个基于转换矩阵的 matlab 脚本,它为马尔可夫链创建了一个包含 N 个样本的向量。假设第一个状态是状态 1。现在,我需要根据条件分布 pXn |Xn 对这条链进行霍夫曼编码−1 .
如果我没记错的话,我认为我必须创建 3 个霍夫曼字典并根据先前的状态(?)对上面链中的每个符号进行编码,这意味着每个符号都将使用我创建的三本词典中的一本,但并非所有词典都使用相同的词典。
如果编码过程是正确的,如何对编码后的向量进行解码?
我不确定是否应该这样做。
如有任何想法,我们将不胜感激。 提前致谢!
没错。三个符号 p11、p12 和 p13 将有一个霍夫曼代码,另一个用于 p21、p22、p23 等。
解码根据当前状态选择使用哪个代码。要么需要假设起始状态,要么需要传输起始状态。
不过这种情况有点奇怪,因为三个符号只有一个霍夫曼码,由1位、2位和2位组成。例如。 0、10、11。因此,您获得的唯一收益是为一位符号选择最高概率。
嗯,解决了上面的问题后,我决定 post 用八度脚本来回答,以防将来有人需要它。
因此,假设有 5 个状态 {1,2,3,4,5},并且我还有转移概率矩阵 (5x5)。我对 1000 Monte Carlo 次实验的马尔可夫链进行了霍夫曼编码和解码。
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
"variable" 计数是为了确保在所有 MC 实验中,生成的马尔可夫链都得到了正确的编码和解码。 (显然,如果 count 等于 1000,那么所有实验的结果都是正确的)