資訊熵 和 演算法時間複雜度

2022-02-17 17:32:06 字數 2083 閱讀 2829

本文僅僅是我個人的理解,發現錯誤請告訴我一下。

前幾天雖然看完了吳軍先生的《數學之美》,但一直搞不懂資訊熵所以連帶著也沒搞懂 最大熵的原理,直到今天白天看了toplanguage的乙個討論資訊理論的帖子

再經過晚上散步時思考才頓悟資訊熵的意義。

一條資訊的資訊量大小和它的不確定性有直接的關係。比如說,我們要搞清楚一件非常非常不確定的事,或是我們一無所知的事情,就需要了解大量的資訊。相反,如果我們對某件事已經有了較多的了解,我們不需要太多的資訊就能把它搞清楚。所以,從這個角度,我們可以認為,資訊量的度量就等於不確定性的多少。(摘自數學之美)

香濃指出的資訊熵的計算公式如下(本文的對數一律以2為準)

h(x) = -∑p(xi)log(p(xi)) (i=1,2,..n)    (其中p(x)是x事件出現的概率)單位為bit

在數學之美裡是用賽後怎麼知道32個球隊裡誰是冠軍來講解了這個資訊熵的概念。

當概率相等時,每次詢問用折半查詢的原理(如「冠軍隊伍在1-16嗎?」)可以減少一半的隊伍,這樣就需要5次就能知道結果了。這裡就是log32 = 5

而使用資訊熵計算資訊量,的確也是5。但是為什麼資訊熵這個公式會代表資訊量呢

按我的理解,在等概率事件裡,1/p(x) 代表那一次所有可能出現的量、在球隊問題裡,就是32種可能性。

而等概率事件裡,因∑p(xi) = 1,所以資訊熵可以看成

資訊熵h(x)= -∑p(xi)log(p(xi)) (i=1,2,..n) = -log(p(i)) = -(- log(1/p(x)))= log(1/p(x))

也就是說等概率事件裡的資訊量可以看成

h(x)= log(所有可能性)

為了加深對資訊量的定義的理解,再回到上述32個球隊的問題,我們已經知道他的資訊量是5bit

問過一次之後,我們可以知道冠軍在哪16個隊伍中,也就是說我們獲得了1bit的資訊後不確定性減少,等於資訊熵變成了log16 = 4bit =5bit -1bit

而最大熵模型呢?它的原理就是保留全部的不確定性,將風險降到最少。

最大熵原理指出,當我們需要對乙個隨機事件的概率分布進行**時,我們的**應當滿足全部已知的條件,而對未知的情況不要做任何主觀假設。(不做主觀假設這點很重要。)在這種情況下,概率分布最均勻,**的風險最小。因為這時概率分布的資訊熵最大,所以人們稱這種模型叫「最大熵模型」。我們常說,「不要把所有的雞蛋放在乙個籃子裡」,其實就是最大熵原理的乙個樸素的說法,因為當我們遇到不確定性時,就要保留各種可能性。

也就是說發現不確定資訊的時候,不要對不確定的產物任何主觀假設使他們的概率分布均勻,則能獲得最客觀的結果。而這時風險會最小,我們就可以用這個結果來進行最客觀的決策。數學上來說貌似就是最優下界吧。這種策略的本質可以概括成「讓未知世界無機可乘」。它是沒有「弱點的」,答案的任何乙個分支都是等概率的。反之,一旦某個分支蘊含的可能性更多,當情況落到那個分支上的時候你就鬱悶了。二分搜尋為什麼好,就是因為它每次都將可能性排除一半並且無論如何都能排除一半(它是最糟情況下表現最好的)。(摘自mindhacks快排為什麼那麼快)

我再用演算法的時間複雜度說明一下最大熵原理吧,用幾個主流的演算法對n個資料進行排序時間複雜度基本上都是從o(nlogn)到o(n2)。而一般情況下為什麼o(nlogn)最優呢,因為n個資料的先後順序是隨機的,我們可以看做不確定性相等,則可以用最大熵原理獲得最優(最穩定)結果。則資訊熵則為

h(x)= log(所有可能性)= log(n!) 而n—>00 則log(n!)近似於lognn= nlogn

假設我們每次能獲得1bit資料,就至少需要獲得(nlogn)bit資料才能取消資訊的不確定性,也就是要比較nlogn次。但因為各種排序演算法策略不同,我們不可能每次都能獲得1bit資料,所以按照資訊熵的定義這是理論上最優的結果。而最佳的排序演算法就是要每次獲得1bit資料,越接近於1則越有效。

而toplanguage那個帖子裡也說了,雖然快排和堆排序兩個是都是時間複雜度o(nlogn)的演算法,但是快速排序一般都會比堆排序快,就是因為堆排序每次獲取的平均資訊量比快排來的低。

而上面,我們根本沒提到具體演算法,就算到了最優的時間複雜度。在實際生活中很多時候我們雖然不會想到具體的策略,但我們至少可以知道極限在**,可以知道還有沒有提高餘地。任何排序和猜數字的演算法可以理解為通過獲得資訊量去消減原來的熵。(這句摘自eric的話)

再附上乙個今天才看到的

演算法複雜度 時間複雜度和空間複雜度

1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時間多,哪個演算法花費的時間少就可以了。並且乙個演算法花費的時間與演算法中語句的執行次數成正比例,哪個演算法中語句執行次數...

演算法複雜度 時間複雜度和空間複雜度

演算法複雜度 時間複雜度和空間複雜度 關鍵字 演算法複雜度 時間複雜度 空間複雜度 1 時間複雜度 1 時間頻度 乙個演算法執行所耗費的時間,從理論上是不能算出來的,必須上機執行測試才能知道。但我們不可能也沒有必要對每個演算法都上機測試,只需知道哪個演算法花費的時 間多,哪個演算法花費的時間少就可以...

演算法複雜度 時間複雜度和空間複雜度

演算法的時間複雜度是指執行演算法所需要的計算工作量。n稱為問題的規模,當n不斷變化時,時間頻度t n 也會不斷變化。但有時我們想知道它變化時呈現什麼規律。為此,我們引入時間複雜度概念。一般情況下,演算法中基本操作重複執行的次數是問題規模n的某個函式,用t n 表示,若有某個輔助函式f n 存在乙個正...