實現用例為李航統計學習方法第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....