NLP EM演算法教材拋硬幣

2021-10-10 14:51:36 字數 1647 閱讀 2534

import numpy

import math

def em_single(theta,o):#對於當前的模型求對應的期望值(估算步驟)

# 三個值分別為選擇硬幣c1的概率、拋c1硬幣為正面的概率、拋c2硬幣為正面的概率。

pi=theta[0]

h1=theta[1]

h2=theta[2]

new_pi=0

new_h1=0

new_h2=0

pb=head=

for o in o:

t=len(o)

cnt = o.sum()#正面的數量

for o in o:

t=len(o)

heads = o.sum()#正面的數量

tails=t-heads#反面的數量

u=(pi*math.pow(h1,heads)*math.pow(1-h1,tails))/(pi*math.pow(h1,heads)*math.pow(1-h1,tails)+(1-pi)*math.pow(h2,heads)*math.pow(1-h2,tails))

l=len(pb)

new_pi=sum(pb)/l

for i in range(l):

new_h1+=pb[i]*head[i]/t

new_h2+=(1-pb[i])*head[i]/t

new_h1=new_h1/sum(pb)

new_h2=new_h2/(l-sum(pb))#因為有c1 c2兩種可能,總觀測數減去c1的即為c2的

return [new_pi,new_h1,new_h2]

def em(theta,y,tol):#最大化步驟

j=0while j<1000:

new_theta=em_single(theta,y)

change=numpy.abs(new_theta[0] - theta[0])

if change,,,}

[0,0,0],

[1,1,1],

[0,0,0]])

theta=[0.3,0.3,0.6]

t=len(theta)

print("初始引數為:")

print(theta)

theta=em(theta,o,1e-15)

輸出:

初始引數為:

[0.3, 0.3, 0.6]

迭代後的引數為:

[0.3737649610410474, 0.0680206318504191, 0.7578245253976398]

迭代後的引數為:

[0.4859367224237726, 0.0004438948678989641, 0.9722232981496766]

迭代後的引數為:

[0.49998864947922056, 8.997364138533166e-11, 0.9999772993837971]

迭代後的引數為:

[0.49999999999999417, 7.2837620757937955e-31, 0.9999999999999885]

迭代後的引數為:

[0.5, 3.864268131526994e-91, 1.0]

python numpy 隨機拋硬幣

使用二項分布進行計算.同時拋棄 5枚硬幣,如果正面朝上少於 3枚,則輸掉 8元,否則就贏 8元。如果手中有 1000 元作為賭資,請問賭博 10000 次後可能會是什麼情況呢?實現 import numpy as np 匯入畫圖模組 from matplotlib.pyplot import plo...

拋硬幣 函式遞迴

學習記錄 連續拋硬幣n次,那麼不連續出現正面的可能情況有多少種 即任何相鄰兩次都不全是正面 輸入只有一行乙個整數n,表示拋n次硬幣。1 n 14 寫乙個程式,輸出所有的可能情況 用0表示反面,1表示正面 輸出有m 1行。前m行輸出每一種可能情況,不同情況按照字典序從小到大排列。最後一行輸出乙個數字m...

關於 拋硬幣 的思考

首先,我們都知道乙個硬幣隨機丟擲,字朝上 與 花朝上 的概率都是50 這條規則對於丟擲的次數越多越適用。例如,丟擲次數為1萬次,那麼字朝上的次數大約為5千次。但是,如果丟擲次數為3次或者較少的次數,那麼可能出現 字朝上 的次數不佔總數的一半。從而我們可以下乙個結論,50 屬於總體事件的概率。由於總體...