LBG算法
1、矢量量化是一种数据压缩技术,是一种高效的有损数据压缩技术,它具有压缩比大、解码简单和失真较小等优点。其基本思想:将若干个标量数据组构成一个矢量,然后在矢量空间以整体量化,从而压缩了数据而不损失多少信息。矢量量化是信息论在信源编码理论方面的发展。
2、LBG算法中最佳量化器的设计关键是最佳划分和最佳码书的设计
一是给定码书条件下,寻找信源空间的最佳划分,使平均失真最小;
二是给定划分条件下,寻找最佳码书,使平均失真最小
3、矢量量化器的设计算法
经典的码书设计算法是LBG算法,它是由Y.Linde,A.Buzo与R.M.Gray在1980年推出的,其思想是对于一个训练序列,先找出其中心,再用分裂法产生一个初始码书,最后把训练序列按码书中的元素分组,找出每组的中心,得到新的码书,转而把新码书作为初始码书再进行上述过程,知道满意为止。设计矢量量化器的主要任务是设计码书,在给定码书大小的情况下,由最佳划分和最佳码书两个必要条件得到矢量量化器的设计算法,LBG算法既可用于已知信源分布特性情况,又可用于未知信源分布特性情况。
LBG算法:基于最佳矢量量化器设计的最佳划分和最佳码书这两个必要条件,是劳埃德算法在矢量空间的推广,其特点为物理概念清晰、算法理论严密及算法实现容易。但是,它有3个主要缺点:
(1)在每次迭代的最佳划分阶段,从码书中搜索训练矢量的最近码字需要大量的存储空间和繁琐的计算。
(2)初始码书的选择影响码书训练的收敛速度和最终码书的性能。
(3)码书的自适应能力不强。
步骤:
1、给定训练集T。固定ɛ(失真阈值)为一个很小的正数。
2、让N=1(码矢数量),将这一个码矢设置为所有训练样本的平均值:
计算总失真度(这时候的总失真很明显是最大的):
3、分裂:对i=1,2,…,N,他们的码矢分别为:
让N=2N,就是每个码矢分裂(乘以扰乱系数1+ɛ和1-ɛ)为两个,这种每一次分裂后的码矢数量就是前一次的两倍。
4、迭代:让初始失真度为: 。将迭代索引或者迭代计数器置零i=0.
1)对于训练集T中的每一个训练样本m=1,2,…,M。在所有码矢中寻找的最小值,也就是看这个训练样本和哪个码矢距离最近。我们用n*记录这个最小值的索引。然后用这个码矢来近似这个训练样本:
。
2)对于n=1,2,…,N,通过以下方式更新所有码矢:
也就是将所有属于cn所在的编码区域Sn的训练样本取平均作为这个编码区域的新的码矢。
3)迭代计数器加1:i=i+1.
4)计算在现阶段的C和P基础上的总失真度:
5)如果失真度相比上一次的失真度(相对失真改进量)还大于可以接受的失真阈值ɛ(如果是小于就表明再进行迭代运算失真得减小是有限的以停止迭代运算了),那么继续迭代,返回步骤1)。
5、重复步骤3和4至到码矢的数目达到要求的个数。
三:该算法处理信号相关程序
function r = vqlbg(d,k)
% VQLBG Vector quantization using the Linde-Buzo-Gray algorithme
%用lbg算法形成码本
% Inputs: d contains training data vectors (one per column每一类一个)
% k is number of centroids required(所需质心的数目)
%
% Output: r contains the result VQ codebook (k columns, one for each centroids)
%输出的是码本,k类,k是质心数
e = .01;%误差门限
r = mean(d, 2);
dpr = 10000;
for i = 1:log2(k)
r = [r*(1+e), r*(1-e)];
while (1 == 1)
z = disteu(d, r);%欧式距离
[m,ind] = min(z, [], 2);
t = 0;
for j = 1:2^i
if((find(ind==j))~=0)
r(:, j) = mean(d(:, find(ind == j)), 2);
x = disteu(d(:, find(ind == j)), r(:, j));
else
x=0;
end
for q = 1:length(x)
t = t + x(q);
end
end
if (((dpr - t)/t) < e)
break;
else
dpr = t;
end
end
end