你可能已經知道了,但我想我可能會發佈一個可能的解決方案。
以下代碼創建與尺寸(2100)的隨機數據,並嘗試使用EM_uniform算法訓練128混合物GMM:
import sidekit
import numpy as np
import random as rn
gmm = sidekit.Mixture()
data = np.array([[rn.random() for i in range(100)],[rn.random() for i in range(100)]])
gmm.EM_uniform(data,
distrib_nb=128,
iteration_min=3,
iteration_max=10,
llk_gain=0.01,
do_init=True)
然而,這導致在相同的錯誤已報道: ValueError:操作數不能與形狀一起廣播(128,100)(128,0)
我懷疑在如何計算gmm.invcov在Sidekit.Mixture._init_uniform()中存在一些錯誤,所以我想出了一個使用Sidekit.Mixture._init()中的代碼手動初始化混合(EM_的初始化函數分裂() - 算法)。
下面的代碼運行沒有我的電腦上的錯誤:
import sidekit
import numpy as np
import random as rn
import copy
gmm = sidekit.Mixture()
data = np.array([[rn.random() for i in range(100)],[rn.random() for i in range(100)]])
# Initialize the Mixture with code from Sidekit.Mixture._init()
mu = data.mean(0)
cov = (data**2).mean(0)
gmm.mu = mu[None]
gmm.invcov = 1./cov[None]
gmm.w = np.asarray([1.0])
gmm.cst = np.zeros(gmm.w.shape)
gmm.det = np.zeros(gmm.w.shape)
gmm.cov_var_ctl = 1.0/copy.deepcopy(gmm.invcov)
gmm._compute_all()
# Now run EM without initialization
gmm.EM_uniform(data,
distrib_nb=128,
iteration_min=3,
iteration_max=10,
llk_gain=0.01,
do_init=False)
這得到以下輸出: [-31.419146414931213,54.759037708692404,54.759037708692404,54.759037708692404], 這是在每次迭代後對數似然值(經過4次迭代後收斂,請注意,這個示例數據是小到可以訓練一個gmm的方法。)
我不能保證這會導致以後發生任何錯誤,如果是這種情況,請留下評論!
至於HDF5文件,請查看h5py documentation的教程。另外,hdfview允許你查看h5文件的內容,這對於稍後進行調試時非常方便。
非常感謝您的正確答案JørgenA.是的,我發現在invcov矩陣的初始化中存在一個錯誤。您是否在sidekit中有GMM-UBM示例的github帳戶? – stefos
你也知道一種方式來運行UBM-GMM系統與你自己的數據在numpy數組?我的意思是沒有Feature Server和hdf5文件。因爲我已經提取了我自己的自定義功能。 – stefos