最大似然估計是機率論中常常涉及到的一種統計方法。大體的思想是,在知道機率密度f的前提下,我們進行一次采樣,就可以根據f來計算這個采樣實作的可能性。當然最大似然可以有很多變化,這裡實作一種簡單的,實際項目需要的時候可以再更改。
這裡實作的是特别簡單的例子如下(摘自wiki的最大似然)
考慮一個抛硬币的例子。假設這個硬币正面跟反面輕重不同。我們把這個硬币抛80次(即,我們擷取一個采樣
并把正面的次數記下來,正面記為H,反面記為T)。并把抛出一個正面的機率記為
,抛出一個反面的機率記為
(是以,這裡的
即相當于上邊的
)。假設我們抛出了49個正面,31個反面,即49次H,31次T。假設這個硬币是我們從一個裝了三個硬币的盒子裡頭取出的。這三個硬币抛出正面的機率分别為
,
.這些硬币沒有标記,是以我們無法知道哪個是哪個。使用最大似然估計,通過這些試驗資料(即采樣資料),我們可以計算出哪個硬币的可能性最大。這個似然函數取以下三個值中的一個:
<dl><dd><dl><dd></dd></dl></dd></dl>
我們可以看到當
時,似然函數取得最大值。這就是
的最大似然估計。
有一點要提的是,因為用到了階乘,關于階乘問題本來想到的方法是用遞歸來實作。但是google了一下發現其實python的reduce方法用起來更加友善,一句話就解決的。
完整工程:
實作效果,對應上面的例子,當H=49,T=31,是P=2/3機率的可能性
/********************************
* 本文來自部落格 “李博Garvin“
******************************************/