熵編碼法
編碼
使用長(zhǎng)度不同的比特串對(duì)字母進(jìn)行編碼有一定的困難。尤其是,幾乎所有幾率的熵都是一個(gè)有理數(shù)。
使用整數(shù)比特(bit)
霍夫曼編碼建議了一種將比特進(jìn)位成整數(shù)的算法,但這個(gè)算法在特定情況下無(wú)法達(dá)到最佳結(jié)果。為此有人加以改進(jìn),提供最佳整數(shù)比特?cái)?shù)。這個(gè)算法使用二叉樹來(lái)設(shè)立一個(gè)編碼。這個(gè)二叉樹的終端節(jié)點(diǎn)代表被編碼的字母,根節(jié)點(diǎn)代表使用的比特。
除這個(gè)對(duì)每個(gè)要編碼的數(shù)據(jù)產(chǎn)生一個(gè)特別的表格的方法外還有使用固定的編碼表的方法。比如加入要編碼的數(shù)據(jù)中符號(hào)出現(xiàn)的概率匹配一定的規(guī)則的話就可以使用特別的變長(zhǎng)編碼表。這樣的編碼表具有一定的系數(shù)來(lái)使得它適應(yīng)實(shí)際的字母出現(xiàn)概率。
改進(jìn)
使用整數(shù)比特的方法往往無(wú)法獲得使用熵計(jì)算的比特?cái)?shù),因此其壓縮并非一定最佳。
比如字母列由兩個(gè)不同的字母組成,其中一個(gè)字母的可能性是 p ( A ) = 0 . 75 {\displaystyle \mathrm {p} (A)=0{.}75} ,另一個(gè)字母的可能性是 p ( B ) = 0 . 25 {\displaystyle \mathrm {p} (B)=0{.}25} 。以上算法的結(jié)果是每個(gè)字母應(yīng)該用一個(gè)比特來(lái)代表,因此其結(jié)果的比特?cái)?shù)與字母數(shù)相同。
但擴(kuò)展取樣位數(shù)可以稍微彌補(bǔ)該破綻:上例的 p ( A A ) = 0 . 5625 {\displaystyle \mathrm {p} (AA)=0{.}5625} 、 p ( A B ) = 0 . 1875 {\displaystyle \mathrm {p} (AB)=0{.}1875} 、 p ( B A ) = 0 . 1875 {\displaystyle \mathrm {p} (BA)=0{.}1875} 、 p ( B B ) = 0 . 0625 {\displaystyle \mathrm {p} (BB)=0{.}0625} ,以霍夫曼編碼算法得結(jié)果為:每?jī)蓚€(gè)字母平均用 ( 0.5625 ? ? --> 1 + 0.1875 ? ? --> 2 + 0.1875 ? ? --> 3 + 0.0625 ? ? --> 3 ) = 1.6875 {\displaystyle (0.5625*1+0.1875*2+0.1875*3+0.0625*3)=1.6875} 個(gè)比特,即平均每個(gè)字母用0.84375個(gè)比特來(lái)代表,向最佳熵值踏近了一步。
最佳熵編碼器應(yīng)該為第一個(gè)字母使用 ? ? --> log 2 ? ? --> ( 0 . 75 ) ≈ ≈ --> 0 . 41 {\displaystyle -\log _{2}(0{.}75)\approx 0{.}41} 個(gè)比特,為第二個(gè)字母使用 ? ? --> log 2 ? ? --> ( 0 . 25 ) = 2 {\displaystyle -\log _{2}(0{.}25)=2} 個(gè)比特,因此整個(gè)結(jié)果是每個(gè)字母平均使用 ? ? --> 0 . 75 ? ? --> log 2 ? ? --> ( 0 . 75 ) ? ? --> 0 . 25 ? ? --> log 2 ? ? --> ( 0 . 25 ) ≈ ≈ --> 0.81 {\displaystyle -0{.}75*\log _{2}(0{.}75)-0{.}25*\log _{2}(0{.}25)\approx 0.81} 個(gè)比特。
使用算術(shù)編碼可以改善這個(gè)結(jié)果,使得原信息按照熵最佳來(lái)編碼。
模型
要確定每個(gè)字母的比特?cái)?shù)算法需要盡可能精確地知道每個(gè)字母的出現(xiàn)概率。模型的任務(wù)是提供這個(gè)數(shù)據(jù)。模型的預(yù)言越好壓縮的結(jié)果就越好。此外模型必須在壓縮和恢復(fù)時(shí)提出同樣的數(shù)據(jù)。在歷史上有許多不同的模型。
靜態(tài)模型
靜態(tài)模型在壓縮前對(duì)整個(gè)文字進(jìn)行分析計(jì)算每個(gè)字母的概率。這個(gè)計(jì)算結(jié)果用于整個(gè)文字上。
優(yōu)點(diǎn)
缺點(diǎn)
動(dòng)態(tài)模型
在這個(gè)模型里概率隨編碼過(guò)程而不斷變化。多種算法可以達(dá)到這個(gè)目的:
前向動(dòng)態(tài):概率按照已經(jīng)被編碼的字母來(lái)計(jì)算,每次一個(gè)字母被編碼后它的概率就增高
反向動(dòng)態(tài):在編碼前計(jì)算每個(gè)字母在剩下的還未編碼的部分的概率。隨著編碼的進(jìn)行最后越來(lái)越多的字母不再出現(xiàn),它們的概率成為0,而剩下的字母的概率升高,為它們編碼的比特?cái)?shù)降低。壓縮率不斷增高,以至于最后一個(gè)字母只需要0比特來(lái)編碼
優(yōu)點(diǎn)
缺點(diǎn)
一般在動(dòng)態(tài)模型中不使用概率,而使用每個(gè)字母出現(xiàn)的次數(shù)。
除上述的前向和反向模型外還有其它的動(dòng)態(tài)模型計(jì)算方法。
比如在前向模型中可以不時(shí)減半出現(xiàn)過(guò)的字母的次數(shù)來(lái)降低一開始的字母的影響力。
對(duì)于尚未出現(xiàn)過(guò)的字母的處理方法也有許多不同的手段:比如假設(shè)每個(gè)字母正好出現(xiàn)一次,這樣所有的字母均可被編碼。
模型度
模型度說(shuō)明模型顧及歷史上多少個(gè)字母。比如模型度0說(shuō)明模型顧及整個(gè)原文。模型度1說(shuō)明模型顧及原文中的上一個(gè)字母并不斷改變其概率。模型度可以無(wú)限高,但是對(duì)于大的原文來(lái)說(shuō)模型度越高其需要的計(jì)算內(nèi)存也越多。
熵作為相似性的量度
除了使用熵編碼作為壓縮數(shù)字?jǐn)?shù)據(jù)一種方法外,熵編碼器也可以用來(lái)測(cè)量數(shù)據(jù)流和已經(jīng)存在的類的數(shù)據(jù)之間的相似程度。這是通過(guò)對(duì)每類數(shù)據(jù)產(chǎn)生一個(gè)熵編碼器/壓縮器;通過(guò)將未壓縮的數(shù)據(jù)提供給每個(gè)壓縮機(jī),據(jù)該壓縮機(jī)產(chǎn)生的最佳壓縮分類。具有最佳壓縮率的編碼器可能是用與未知數(shù)據(jù)最相似的數(shù)據(jù)訓(xùn)練的編碼器。
免責(zé)聲明:以上內(nèi)容版權(quán)歸原作者所有,如有侵犯您的原創(chuàng)版權(quán)請(qǐng)告知,我們將盡快刪除相關(guān)內(nèi)容。感謝每一位辛勤著寫的作者,感謝每一位的分享。
- 有價(jià)值
- 一般般
- 沒(méi)價(jià)值
{{item.userName}} 舉報(bào)
{{item.time}} {{item.replyListShow ? '收起' : '展開'}}評(píng)論 {{curReplyId == item.id ? '取消回復(fù)' : '回復(fù)'}}
{{_reply.userName}} 舉報(bào)
{{_reply.time}}