矢量量化(Vector Quantization)

矢量量化(Vector Quantization)

矢量量化(Vector Quantization):是一种极其重要的信号压缩方法==[连续信息到数字信号的转化]。也是一种基于块编码规则的有损压缩方法。

基本思想:将若干个标量数据组构成一个矢量,然后在矢量空间给以整体量化,从而压缩了数据而不损失多少信息。

名词解释内容
标量只具有数值大小,没有方向,部分有正负之分
矢量又称为向量
量化指将信号的连续取值(或者大量可能的离散取值)近似为有限多个(或较少的)离散值的过程

VQ实际上就是一种逼近:使用一个数字近似地表示它周围的数字;例如数学中取整 ⌊ x ⌋ \lfloor x \rfloor x

二维例子
在这里插入图片描述

上图,蓝色实线将这张图划分为16个区域;任意的坐标都会落到上面这张图中的某一特定区域。然后它就会被该区域的红星的点近似表示。

这些红星点就是量化矢量,表示图中的任意一个点都可以量化为这16个矢量中的其中一个。也就是这16个红星点可以描述这一整张图。

名词解释内容
码矢(codevectors)红星点
编码区域(encoding regions)蓝色的划分区域
码书(codebook)红星点的集合
空间的划分(partition of thespace)蓝色的划分区域的集合

数学描述

假定我们有一个有M个矢量源(训练样本)的训练序列(训练集):T={ x 1 , x 2 , … , x M x_1, x_2,…, x_M x1,x2,,xM};
假设源矢量是k维的: x m x_m xm=( x m 1 , x m 2 , … , x m k x_{m1},x_{m2}, …, x_{mk} xm1,xm2,,xmk), m=1,2,…,M
假设码矢的数目是N,码书表示为:C={ c 1 , c 2 , … , c N c_1, c_2,…, c_N c1,c2,,cN};
每一个码矢是个k维向量: c n c_n cn=( c n 1 , c n 2 , … , c n k c_{n1}, c_{n2}, …, c_{nk} cn1,cn2,,cnk),n=1,2,…,N;
与码矢 c n c_n cn对应的编码区域表示为 S n S_n Sn,然后将空间的划分表示为:P={ S 1 , S 2 , … , S N S_1, S_2,…,S_N S1,S2,,SN};
如果源矢量 x m x_m xm S n S_n Sn内,那么它的近似(用Q( x m x_m xm)表示)就是 c n c_n cn:
Q( x m x_m xm)= c n c_n cn, 如果 x m x_m xm属于 S n S_n Sn

假设我们采用均分误差失真度量,那么平均失真度表示如下:
D a v e D_{ave} Dave= 1 M k ∑ m = 1 M ∣ ∣ x m − Q ( x m ) ∣ ∣ 2 \frac {1}{Mk}\sum_{m=1}^M||x_m-Q(x_m)||^2 Mk1m=1MxmQ(xm)2

||e||2为欧式距离

蓝色边界上的样本划分问题

1)Centroid Condition质心条件:
c n c_n cn= ∑ x m ∈ S n x m ∑ x m ∈ S n 1 \frac {\sum_{x_m \in S_n}x_m}{\sum_{x_m \in S_n}1} xmSn1xmSnxm n = 1 , 2 , . . . , N n=1,2,...,N n=1,2,...,N
这个条件要求码矢cn是编码区域Sn内所有的训练样本向量的平均向量。在实现中,需要保证每个编码区域至少要有一个训练样本向量,这样上面这条式的分母才不为0。

LBG算法

在以前,VQ运用的一个难点在于它要要解决一个多维积分(multi-dimensional integration)的问题。来,在1980年,Linde, Buzo和Gray(LBG,这个缩写也是LBG算法的命名)提出一种基于训练序列的VQ设计算法,对训练序列的运用绕开了多维积分的求解,使得世上又诞生了一种经典的被世人称为LBG-VQ的算法。

LBG-VQ算法是一个迭代算法,它交替地调整P和C;使失真度不断地趋向于它的局部最小值。这个算法需要一个初始的码书 C ( 0 ) C^{(0)} C(0),这个初始码书可以通过分裂(splitting)方法得到。这个方法主要是把一个初始码矢设置为所有训练样本的平均值。然后把这个码矢分裂成两个(分裂的方式见下面的LBG算法的第3步的公式,只要是乘以一个扰乱系数),把这两个码矢作为初始的码书,然后迭代算法就在这个初始的码书上面跑。它每一次都将每个码矢分裂为2个,重复这个过程,直到获得要求的码矢个数。1个分裂为2个,2个分裂为4个,4个分裂为8个……

LBG算法过程:

1、给定训练集T。固定ɛ(失真阈值)为一个很小的正数。
2、让N=1(码矢数量),将这一个码矢设置为所有训练样本的平均值:
C 1 ∗ C_1^* C1= 1 M ∑ m = 1 M x m \frac {1}{M}\sum_{m=1}^Mx_m M1m=1Mxm

计算总失真度(这时候的总失真很明显是最大的):
D a v e D_{ave} Dave= 1 M k ∑ m = 1 M ∣ ∣ x m − c 1 ∗ ∣ ∣ 2 \frac {1}{Mk}\sum_{m=1}^M||x_m-c_1^*||^2 Mk1m=1Mxmc12

3、分裂:对i=1,2,…,N,他们的码矢分别为:
C i ( 0 ) C_i^{(0)} Ci(0)=(1+ɛ) C i ∗ C_i^* Ci
C N + i ( 0 ) C_{N+i}^{(0)} CN+i(0)=(1-ɛ) C i ∗ C_i^* Ci
N=2N,就是每个码矢分裂(乘以扰乱系数1+ɛ和1-ɛ)为两个,这种每一次分裂后的码矢数量就是前一次的两倍。

4、迭代:让初始失真度为: D a v e ( 0 ) = D a v e ∗ D_{ave}^{(0)}=D_{ave}^* Dave(0)=Dave;将迭代索引或者迭代计数器置零i=0。

1)对于训练集T中的每一个训练样本m=1,2,…,M。在所有码矢中寻找的 ∣ ∣ x m − c n ( i ) ∣ ∣ 2 ||x_m-c_n^{(i)}||^2 xmcn(i)2最小值,也就是看这个训练样本和哪个码矢距离最近。我们用n*记录这个最小值的索引。然后用这个码矢来近似这个训练样本:

2)对于n=1,2,…,N,通过以下方式更新所有码矢:在这里插入图片描述

也就是将所有属于cn所在的编码区域Sn的训练样本取平均作为这个编码区域的新的码矢。

3)迭代计数器加1:i=i+1.
4)计算在现阶段的C和P基础上的总失真度:
在这里插入图片描述

5)如果失真度相比上一次的失真度(相对失真改进量)还大于可以接受的失真阈值ɛ(如果是小于就表明再进行迭代运算失真得减小是有限的以停止迭代运算了),那么继续迭代,返回步骤1)。
在这里插入图片描述
否则最终失真度为
在这里插入图片描述
对n=1,2,…,N,最终码矢为:
在这里插入图片描述

5、重复步骤3和4至到码矢的数目达到要求的个数。
在这里插入图片描述
七、参考资料
矢量量化(Vector Quantization)

  • 16
    点赞
  • 49
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值