使用numpy實現期望極大 EM 演算法

2021-10-14 01:45:51 字數 1925 閱讀 6194

實現用例為李航統計學習方法第155頁例9.1

import numpy as np

"""通過期望極大演算法計算三硬幣模型

"""obs_arr = np.array([1

,1,0

,1,0

,0,1

,0,1

,1])

num =

len(obs_arr)

para_init =

'''e步,計算在模型引數π、p、q下觀測資料y來自擲硬幣b的概率'''

defe_func()

: u_j_i_b_arr = np.array(

)for y_index in obs_arr:

u_j_i_b = para_init[

"π"]

*pow

(para_init[

"p"]

, y_index)

*pow((

1- para_init[

"p"]),

(1- y_index)

) u_j_i_c =(1

- para_init[

"π"])*

pow(para_init[

"q"]

, y_index)

*pow((

1- para_init[

"q"]),

(1- y_index)

) u_j_i_b = u_j_i_b /

(u_j_i_b + u_j_i_c)

return u_j_i_b_arr

'''m步,計算模型引數的新估計值'''

defm_func()

: iter_num =

0while

true

: π = np.cumsum(e_func())

[-1]

/ num

# print(π)

p = np.cumsum(e_func(

)* obs_arr)[-

1]/ np.cumsum(e_func())

[-1]

# print(p)

q = np.cumsum((1

- e_func())

* obs_arr)[-

1]/ np.cumsum(

1- e_func())

[-1]

# print(q)

if para_init[

"π"]

== π and para_init[

"p"]

== p and para_init[

"q"]

== q:

break

else

: para_init[

"π"]

= π para_init[

"p"]

= p para_init[

"q"]

= q iter_num +=

1print

("硬幣a、b、c正面出現的概率(引數估計值)分別為:"

)print

(format

(para_init[

"π"]

,'.4f'),

format

(para_init[

"p"]

,'.4f'),

format

(para_init[

"q"]

,'.4f'))

print

("迭代的次數:"

, iter_num)

if __name__ ==

"__main__"

: m_func(

)

機器學習筆記 4 EM演算法 期望極大演算法

介紹 已知某個隨機樣本滿足某種概率分布,但是其中具體的引數不清楚,引數估計就是通過若干次試驗,觀察其結果,利用結果推出引數的大概值。最大似然估計是建立在這樣的思想上 已知某個引數能使這個樣本出現的概率最大,我們當然不會再去選擇其他小概率的樣本,所以乾脆就把這個引數作為估計的真實值。求最大似然函式估計...

使用python的numpy庫實現PCA演算法

usr bin env python coding utf 8 from numpy import 引數1 特徵值向量,引數2 比率 返回值 k 符合指定比率的topk k值 def setk eigvals,rate 0.9 eigvalind argsort eigvals 對特徵值進行排序 f...

python使用numpy實現多維陣列的排序

1.問題描述 為實現對多維陣列按多列排序,如有三維陣列座標點 x,y,z 現需使其按照x進行公升序排序,其後使y進行公升序排序,最後為z。有4行3列陣列如下 arr 6 3 3 3 1 1 6 2 8 4 0 3 欲使其按如下排序 arrsort 3 1 1 4 0 3 6 2 8 6 3 3 2....