【機器學習演算法-python實現】最大似然估計(Maximum Likelihood)

李博Garvin發表於2014-08-25

1.背景

           最大似然估計是概率論中常常涉及到的一種統計方法。大體的思想是,在知道概率密度f的前提下,我們進行一次取樣,就可以根據f來計算這個取樣實現的可能性。當然最大似然可以有很多變化,這裡實現一種簡單的,實際專案需要的時候可以再更改。
       博主是參照wiki來學習的,地址請點選我
           這裡實現的是特別簡單的例子如下(摘自wiki的最大似然)

離散分佈,離散有限引數空間[編輯]

考慮一個拋硬幣的例子。假設這個硬幣正面跟反面輕重不同。我們把這個硬幣拋80次(即,我們獲取一個取樣x_1=\mbox{H}, x_2=\mbox{T}, \ldots, x_{80}=\mbox{T}並把正面的次數記下來,正面記為H,反面記為T)。並把丟擲一個正面的概率記為p,丟擲一個反面的概率記為1-p(因此,這裡的p即相當於上邊的\theta)。假設我們丟擲了49個正面,31個反面,即49次H,31次T。假設這個硬幣是我們從一個裝了三個硬幣的盒子裡頭取出的。這三個硬幣丟擲正面的概率分別為p=1/3p=1/2p=2/3.這些硬幣沒有標記,所以我們無法知道哪個是哪個。使用最大似然估計,通過這些試驗資料(即取樣資料),我們可以計算出哪個硬幣的可能性最大。這個似然函式取以下三個值中的一個:

\begin{matrix}\mathbb{P}(\mbox{H=49, T=31 }\mid p=1/3) & = & \binom{80}{49}(1/3)^{49}(1-1/3)^{31} \approx 0.000 \\&&\\\mathbb{P}(\mbox{H=49, T=31 }\mid p=1/2) & = & \binom{80}{49}(1/2)^{49}(1-1/2)^{31} \approx 0.012 \\&&\\\mathbb{P}(\mbox{H=49, T=31 }\mid p=2/3) & = & \binom{80}{49}(2/3)^{49}(1-2/3)^{31} \approx 0.054 \\\end{matrix}

我們可以看到當\widehat{p}=2/3時,似然函式取得最大值。這就是p的最大似然估計。


2.實現部分


          有一點要提的是,因為用到了階乘,關於階乘問題本來想到的方法是用遞迴來實現。但是google了一下發現其實python的reduce方法用起來更加方便,一句話就解決的。
 
def Factorial(x):
    return reduce(lambda x,y:x*y,range(1,x+1))  

      
完整工程:
'''
Created on 2014-8-22
@author: Garvin
Maximum Likelihood theory practic

This code is base on the http://zh.wikipedia.org/wiki/%E6%9C%80%E5%A4%A7%E4%BC%BC%E7%84%B6%E4%BC%B0%E8%AE%A1
'''
w=2.0/3
h=49
t=31

def DefineParam():
    H=h
    T=t
    return H,T

def MaximumLikelihood(p=w):
    H,T=DefineParam()
    f1=Factorial(H+T)/(Factorial(H)*Factorial(T))
    
    f2=(p**H)*((1.0-p)**T)
    
    
    return f1*f2
    
    
def Factorial(x):
    return reduce(lambda x,y:x*y,range(1,x+1))    
    
    


實現效果,對應上面的例子,當H=49,T=31,是P=2/3概率的可能性



程式碼地址:請點選我


/********************************

* 本文來自部落格  “李博Garvin“

* 轉載請標明出處:http://blog.csdn.net/buptgshengod

******************************************/



相關文章