小數學解決大問題 資訊熵(由對數函式想到)

2021-06-20 08:04:00 字數 3624 閱讀 5633

在這個物欲橫流的社會中,任何物品都是明碼實價的,甚至許多虛擬的物品(愛情、親情)都可能用金錢來衡量。對於計算器科學而言,我們也希望能對資訊做乙個量化的衡量。比如,這篇部落格包含多少資訊量。可能有的人會說這個問題很簡單啊,我們可以通過字數來衡量,但是仔細想想,這是佔不住腳的。例如,提到「蘋果」,很多人都能夠聯想到這個物品的形狀、顏色、味道等,資訊量非常大。而提到「黿鼉」,或許我們完全不知道這是什麼,但是至少我們學習到了這樣乙個新的詞彙。因此,我們要搞清楚一件非常非常 不確定的事,或是我們一無所知的事情,就需要了解大量的資訊。相反,如果我們對某件事已經有了較多的了解,我們不需要太多的資訊就能把它搞清楚。可以見得,一條資訊的資訊量大小和它的不確定性有直接的關係。

找到資訊的度量與不確定性相關後,我們便可以來想想如何度量資訊。我引用google黑板報《數學之美》中的例子,馬上要舉行世界盃賽了,大家都很 關心誰會是冠軍。假如我錯過了看世界盃,賽後我問乙個知道比賽結果的觀眾「哪支球隊是冠軍」? 他不願意直接告訴我, 而要讓我猜,並且我每猜一次,他要收一元錢才肯告訴我 是否猜對了,那麼我需要付給他多少錢才能知道誰是冠軍呢? 我可以把球隊編上號,從1到32, 然後提問: 「冠軍的球隊在 1-16 號中嗎?」 假如他告訴我猜對了, 我會接著問: 「冠軍在 1-8 號中嗎?」 假如他告訴我猜錯了, 我自然知道冠軍隊在 9-16 中。 這樣只需要五次, 我就能知道哪支球隊是冠軍。所以,誰是世界盃冠軍這條訊息的資訊量只值五塊錢。 

上述故事中,將球隊編號成1到32的過程其實就是將人類的語言轉化成了計算機能理解的數學語言。而獲取資訊的過程也就表現出了獲得資訊的複雜度,也是資訊的不確定度。(確定的資訊複雜度應當更小)那麼,現在就讓我們來看看資訊是如何來衡量的吧?

1948 年,夏農提出了「資訊熵」 (shāng) 的概念,解決了對資訊的量化度量問題。當然,夏農不是用錢,而是用 「位元」(bit)這個概念來度量資訊量。 乙個位元是一位二 進製數,計算機中的乙個位元組是八個位元。在上面的例子中,這條訊息的資訊量是五位元。所以資訊量的度量與對數函式有關,為log2n。

可能有人會發現現我們實際上可能不需要猜五次就能猜出誰是冠軍,因為象巴西、德國、義大利這樣的球隊得冠軍的可能性比日本、美國、南韓等隊大的多。因此,我們可以把少數幾個最可能的球隊分成一組,把其它隊分成另一組。依次類推便能很快猜出世界盃的冠軍。所以對於分布不平衡的組合,資訊熵的定義如下,pk代表第k類在所有類中出現的概率。

看完了問題的背景,或許很多人還是不知道熵到底有什麼實際的意義。就讓我們用例項來了解一下熵的作用吧。

應用1 壓縮檔案

我們拿英文文字舉例,單個字母確實能夠傳遞表達單個字母的資訊,而字母的組合常常會有冗餘。舉例來講,看」lov「通常我們也能猜到這個單詞是」love「,因為似乎沒有」lov「這個詞。中文段落也存在冗餘性,大家可以嘗試讀一讀後面這段文字。「研表究明,漢字序順並不定一影閱響讀。比如當你看完這句話後,才發這現裡的字全是都亂的。」顯然這段文字是有冗餘的,因此即使順序不變了我們也能理解文字的含義。

計算機中的字母都是用位元(bit)來儲存的,乙個位元代表0或者1。如果未經壓縮,一段英文文字的每個字母需要8個位元來編碼,但是實際上英文文字的熵大概只有4.7位元。因此這樣的訊息是可以被壓縮的,但是夏農的資訊理論揭示了,任何無失真壓縮技術不可能讓一位元的訊息攜帶超過一位元的資訊。訊息的熵乘以訊息的長度決定了訊息可以攜帶多少資訊。

應用2 資料探勘

我們來談談時髦的大資料吧!資料探勘中有一類很重要的應用是分類器,我們拿最簡單的決策樹分類器來舉例。假設我們是一家智慧型的租車公司,因此我們需要分析使用者在什麼樣的情況下會用車,然後在使用者可能需要用車的時候通過手機應用或者簡訊推送**資訊。那麼我們要怎麼分析使用者的行為呢?可以交給計算機來做資料探勘。

首先,我們可以從傳統的租車公司拿到歷史使用者租車的記錄,假設主要資料如下(區域性引用)

顧客資訊

天氣衣著

購物週末

溫度》90

顧客1下雨

正式的是是否

步行顧客2

下雪休閒的否否

是開車顧客3沒有

休閒的否否否

步行顧客4

下雨正式的是是

否步行顧客5沒有

休閒的是否是

步行顧客6

沒有正式的否否

否開車顧客7下雪

正式的否是是

開車顧客8

下雨正式的是否

是步行顧客9下雪

休閒的是是是

開車顧客10

沒有正式的否否

是開車

然後,我們可以用構造一棵決策樹(如下圖)。對於乙個新的潛在使用者,我們可以依次按照決策樹中的條件(綠色橢圓標識)來判斷使用者是否會選擇開車。嘻嘻,對於那些要開車的人,顯然就是我們的潛在客戶。

對於某乙個特點條件的處理非常簡單,可以用概率的方法來處理。例如天氣的記錄是」沒有「,衣著的記錄是」正式的「的歷史顧客中97%的顧客都選擇開車,那麼我們就可以認為符合該條件的顧客很可能會開車。

那麼,另外有乙個問題需要我們注意,即條件的順序性。通俗點講,我們應當把衣著條件還是天氣條件放在決策樹根結點呢?這個重要的問題我們就能夠通過資訊熵來解決!我們可以知道一開始拿到整個歷史資料時,我們並不知道資料到底有什麼含義(即表示什麼樣的使用者會開車),也可以說資訊的不確定度很大。通過分類器的學習,我們希望講資訊的不確定度變小,以便讓我們擁有新的顧客的時候能夠**顧客的行為。

我們用以上的部分資料來解釋這個選擇根結點的過程:

1)在未對資料做任何處理的情況下,需要**結果當中有兩種選擇:開車與步行。開車出現了5次,步行出現了5次,用資訊熵來評價這個分布的資訊量則是entropy = -0.5log2(0.5)-0.5log2(0.5) = 1

2)如果我們按照天氣來劃分,「下雪」條件中的分布是(開車:3;步行:0),「下雨」條件中的分布是(開車:0;步行:3),「沒有」條件中的分布是(開車:2;步行:2)。三個條件的熵分別是entropy[下雪] = -1log2(1)-0log2(0) = 0,entropy[下雨] = -0log2(0)-1log2(1) = 0,entropy[沒有] = -0.5log2(0.5) - 0.5log2(0.5) = 1。由於10條資料被分為了三組資料,所以分割後的資訊熵平均值為0.3*0 + 0.3*0 + 0.4*1 = 0.4。

3)如果我們按照衣著來劃分,「正式的」條件的分布是(開車:3;步行:3),「休閒的」條件中的分布是(開車:2;步行:2)。兩個條件的熵分別是entropy[正式的] = -0.5log2(0.5) - 0.5log2(0.5) = 1,entropy[休閒的] = -0.5log2(0.5) - 0.5log2(0.5) = 1。由於10條資料被分為了兩組資料,所以分割後的資訊熵平均值為 0.6*1 + 0.4*1 = 1。

顯而易見,第二步相對第一步的資訊減少量為1-0.4=0.6,而第三步相對第一步的資訊減少量為1-1=0。也就是說第二種分布讓資訊不是那麼不確定了,而第三種分布讓資訊依然不確定。所以很明顯,第二種分布滿足我們降低不確定度的要求並且優於第三種分布,我們應當按照這樣的方法來劃分。依次類推我們就能構造出整個決策樹。

資訊熵在決策樹中的計算過程起了非常大的作用,它能夠幫助我們從眾多潛在的決策樹中找到最有效的那乙個。

資訊熵的提出本是通訊系統中的一場革命,然後隨著電腦科學的發展,資訊熵逐漸地影響了像資料探勘這樣的前沿計算機技術,對於計算機技術的發展有著重大的意義。

善用backtrace解決大問題

一 用途 主要用於程式異常退出時尋找錯誤原因 二 功能 回溯堆疊,簡單的說就是可以列出當前函式呼叫關係 三 原理 1 通過對當前堆疊的分析,找到其上層函式在棧中的幀位址,再分析上層函式的堆疊,再找再上層的幀位址 一直找到最頂層為止,幀位址指的是一塊 在棧上存放區域性變數,上層返回位址,及暫存器值的空...

小eval解決大問題 python

先說情況,今天學習做了一道把我堵了天的題,主要是每次輸出都是預設str,但我如果想輸入list,或者tuple呢?這個時候就需要eval。看案例 寫函式,判斷使用者傳入的物件 字串 列表 元組 長度是否大於5。def fun args inp input please input buzhuanh ...

解決mySQL占用記憶體超大問題

為了裝mysql環境測試,裝上後發現啟動後mysql占用了很大的虛擬記憶體,達8百多兆。網上搜尋了一下,得到高人指點my.ini。再也沒見再詳細的了.只好開啟my.ini逐行的啃,雖然英文差了點,不過多少m還是看得明的 更改後如下 innodb buffer pool size 576m 256m ...