最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

EM算法的python實現(xiàn)的方法步驟

 更新時間:2018年01月02日 16:14:08   作者:LilyNothing  
本篇文章主要介紹了EM算法的python實現(xiàn)的方法步驟,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧

前言:前一篇文章大概說了EM算法的整個理解以及一些相關的公式神馬的,那些數(shù)學公式啥的看完真的是忘完了,那就來用代碼記憶記憶吧!接下來將會對python版本的EM算法進行一些分析。

EM的python實現(xiàn)和解析

引入問題(雙硬幣問題)

假設有兩枚硬幣A、B,以相同的概率隨機選擇一個硬幣,進行如下的拋硬幣實驗:共做5次實驗,每次實驗獨立的拋十次,結果如圖中a所示,例如某次實驗產(chǎn)生了H、T、T、T、H、H、T、H、T、H,H代表正面朝上。

假設試驗數(shù)據(jù)記錄員可能是實習生,業(yè)務不一定熟悉,造成a和b兩種情況

a表示實習生記錄了詳細的試驗數(shù)據(jù),我們可以觀測到試驗數(shù)據(jù)中每次選擇的是A還是B

b表示實習生忘了記錄每次試驗選擇的是A還是B,我們無法觀測實驗數(shù)據(jù)中選擇的硬幣是哪個

問在兩種情況下分別如何估計兩個硬幣正面出現(xiàn)的概率?

以上的針對于b實習生的問題其實和三硬幣問題類似,只是這里把三硬幣中第一個拋硬幣的選擇換成了實習生的選擇。

對于已知是A硬幣還是B硬幣拋出的結果的時候,可以直接采用概率的求法來進行求解。對于含有隱變量的情況,也就是不知道到底是A硬幣拋出的結果還是B硬幣拋出的結果的時候,就需要采用EM算法進行求解了。如下圖:

其中的EM算法的第一步就是初始化的過程,然后根據(jù)這個參數(shù)得出應該產(chǎn)生的結果。

構建觀測數(shù)據(jù)集

針對這個問題,首先采集數(shù)據(jù),用1表示H(正面),0表示T(反面):

#硬幣投擲結果
observations = numpy.array([[1,0,0,0,1,1,0,1,0,1],
            [1,1,1,1,0,1,1,1,0,1],
            [1,0,1,1,1,1,1,0,1,1],
            [1,0,1,0,0,0,1,1,0,0],
            [0,1,1,1,0,1,1,1,0,1]])

第一步:參數(shù)的初始化

參數(shù)賦初值

第一個迭代的E步

拋硬幣是一個二項分布,可以用scipy中的binom來計算。對于第一行數(shù)據(jù),正反面各有5次,所以:

#二項分布求解公式
contribution_A = scipy.stats.binom.pmf(num_heads,len_observation,theta_A)
contribution_B = scipy.stats.binom.pmf(num_heads,len_observation,theta_B)

將兩個概率正規(guī)化,得到數(shù)據(jù)來自硬幣A,B的概率:

weight_A = contribution_A / (contribution_A + contribution_B)
weight_B = contribution_B / (contribution_A + contribution_B)

這個值類似于三硬幣模型中的μ,只不過多了一個下標,代表是第幾行數(shù)據(jù)(數(shù)據(jù)集由5行構成)。同理,可以算出剩下的4行數(shù)據(jù)的μ。

有了μ,就可以估計數(shù)據(jù)中AB分別產(chǎn)生正反面的次數(shù)了。μ代表數(shù)據(jù)來自硬幣A的概率的估計,將它乘上正面的總數(shù),得到正面來自硬幣A的總數(shù),同理有反面,同理有B的正反面。

 #更新在當前參數(shù)下A,B硬幣產(chǎn)生的正反面次數(shù)
 counts['A']['H'] += weight_A * num_heads
 counts['A']['T'] += weight_A * num_tails
 counts['B']['H'] += weight_B * num_heads
 counts['B']['T'] += weight_B * num_tails

第一個迭代的M步

當前模型參數(shù)下,AB分別產(chǎn)生正反面的次數(shù)估計出來了,就可以計算新的模型參數(shù)了:

new_theta_A = counts['A']['H']/(counts['A']['H'] + counts['A']['T'])
new_theta_B = counts['B']['H']/(counts['B']['H'] + counts['B']['T'])

于是就可以整理一下,給出EM算法單個迭代的代碼:

def em_single(priors,observations):

  """
  EM算法的單次迭代
  Arguments
  ------------
  priors:[theta_A,theta_B]
  observation:[m X n matrix]

  Returns
  ---------------
  new_priors:[new_theta_A,new_theta_B]
  :param priors:
  :param observations:
  :return:
  """
  counts = {'A': {'H': 0, 'T': 0}, 'B': {'H': 0, 'T': 0}}
  theta_A = priors[0]
  theta_B = priors[1]
  #E step
  for observation in observations:
    len_observation = len(observation)
    num_heads = observation.sum()
    num_tails = len_observation-num_heads
    #二項分布求解公式
    contribution_A = scipy.stats.binom.pmf(num_heads,len_observation,theta_A)
    contribution_B = scipy.stats.binom.pmf(num_heads,len_observation,theta_B)

    weight_A = contribution_A / (contribution_A + contribution_B)
    weight_B = contribution_B / (contribution_A + contribution_B)
    #更新在當前參數(shù)下A,B硬幣產(chǎn)生的正反面次數(shù)
    counts['A']['H'] += weight_A * num_heads
    counts['A']['T'] += weight_A * num_tails
    counts['B']['H'] += weight_B * num_heads
    counts['B']['T'] += weight_B * num_tails

  # M step
  new_theta_A = counts['A']['H'] / (counts['A']['H'] + counts['A']['T'])
  new_theta_B = counts['B']['H'] / (counts['B']['H'] + counts['B']['T'])
  return [new_theta_A,new_theta_B]

EM算法主循環(huán)

給定循環(huán)的兩個終止條件:模型參數(shù)變化小于閾值;循環(huán)達到最大次數(shù),就可以寫出EM算法的主循環(huán)了

def em(observations,prior,tol = 1e-6,iterations=10000):
  """
  EM算法
  :param observations :觀測數(shù)據(jù)
  :param prior:模型初值
  :param tol:迭代結束閾值
  :param iterations:最大迭代次數(shù)
  :return:局部最優(yōu)的模型參數(shù)
  """
  iteration = 0;
  while iteration < iterations:
    new_prior = em_single(prior,observations)
    delta_change = numpy.abs(prior[0]-new_prior[0])
    if delta_change < tol:
      break
    else:
      prior = new_prior
      iteration +=1
  return [new_prior,iteration]

調(diào)用

給定數(shù)據(jù)集和初值,就可以調(diào)用EM算法了:

print em(observations,[0.6,0.5])

得到

[[0.72225028549925996, 0.55543808993848298], 36]

我們可以改變初值,試驗初值對EM算法的影響。

print em(observations,[0.5,0.6])

結果:

[[0.55543727869042425, 0.72225099139214621], 37]

看來EM算法還是很健壯的。如果把初值設為相等會怎樣?

print em(observations,[0.3,0.3])

輸出:[[0.64000000000000001, 0.64000000000000001], 1]

顯然,兩個值相加不為1的時候就會破壞這個EM函數(shù)。

換一下初值:

print em(observations,[0.99999,0.00001])

輸出:[[0.72225606292866507, 0.55543145006184214], 33]

EM算法對于參數(shù)的改變還是有一定的健壯性的。

以上是根據(jù)前人寫的博客進行學習的~可以自己動手實現(xiàn)以下,對于python練習還是有作用的。希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

相關文章

  • 使用Python開發(fā)在線編輯器

    使用Python開發(fā)在線編輯器

    這篇文章主要為大家詳細介紹了如何使用Python開發(fā)一個在線編輯器,文中的示例代碼講解詳細,具有一定的借鑒價值,有需要的小伙伴可以了解一下
    2025-02-02
  • Pandas中Concat與Append的實現(xiàn)與區(qū)別小結

    Pandas中Concat與Append的實現(xiàn)與區(qū)別小結

    本文主要介紹了Pandas中Concat與Append的實現(xiàn)與區(qū)別小結,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2023-11-11
  • 詳解Python如何循環(huán)遍歷Numpy中的Array

    詳解Python如何循環(huán)遍歷Numpy中的Array

    Numpy是Python中常見的數(shù)據(jù)處理庫,是數(shù)據(jù)科學中經(jīng)常使用的庫。在本文中,我們將學習如何迭代遍歷訪問矩陣中的元素,需要的可以參考一下
    2022-04-04
  • Python+OpenCV手勢檢測與識別Mediapipe基礎篇

    Python+OpenCV手勢檢測與識別Mediapipe基礎篇

    網(wǎng)上搜到了一些關于手勢處理的實驗,我在這兒簡單的實現(xiàn)一下,下面這篇文章主要給大家介紹了關于Python+OpenCV手勢檢測與識別Mediapipe基礎篇的相關資料,需要的朋友可以參考下
    2022-12-12
  • Django-xadmin后臺導入json數(shù)據(jù)及后臺顯示信息圖標和主題更改方式

    Django-xadmin后臺導入json數(shù)據(jù)及后臺顯示信息圖標和主題更改方式

    這篇文章主要介紹了Django-xadmin后臺導入json數(shù)據(jù)及后臺顯示信息圖標和主題更改方式,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧
    2020-03-03
  • 簡單了解pytest測試框架setup和tearDown

    簡單了解pytest測試框架setup和tearDown

    這篇文章主要介紹了簡單了解pytest測試框架setup和tearDown,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-04-04
  • wxPython繪圖模塊wxPyPlot實現(xiàn)數(shù)據(jù)可視化

    wxPython繪圖模塊wxPyPlot實現(xiàn)數(shù)據(jù)可視化

    這篇文章主要為大家詳細介紹了wxPython繪圖模塊wxPyPlot實現(xiàn)數(shù)據(jù)可視化,文中示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2019-11-11
  • python3爬取各類天氣信息

    python3爬取各類天氣信息

    這篇文章主要為大家詳細介紹了python3爬取各類天氣信息,具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2018-02-02
  • python忽略警告(warning)的3種方法小結

    python忽略警告(warning)的3種方法小結

    python開發(fā)中經(jīng)常遇到報錯的情況,但是warning通常并不影響程序的運行,而且有時特別討厭,下面我們來說下如何忽略warning錯誤,這篇文章主要給大家介紹了關于python忽略警告(warning)的3種方法,需要的朋友可以參考下
    2023-10-10
  • python3 cmp實現(xiàn)方式

    python3 cmp實現(xiàn)方式

    這篇文章主要介紹了python3 cmp實現(xiàn)方式,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-02-02

最新評論

衡阳市| 柯坪县| 河池市| 山阳县| 泸溪县| 开原市| 奇台县| 晋江市| 阿荣旗| 信宜市| 濮阳县| 府谷县| 江都市| 台山市| 理塘县| 牡丹江市| 唐海县| 日照市| 五大连池市| 南和县| 金寨县| 荣成市| 罗城| 金川县| 囊谦县| 阿拉善右旗| 乐平市| 长汀县| 靖西县| 江津市| 清远市| 玉门市| 赤峰市| 砀山县| 延吉市| 尚志市| 容城县| 建水县| 遂宁市| 曲松县| 廉江市|