问题描述
我目前正在尝试使用张量流概率编写一个简单的多元高斯混合模型。具体来说,我有一些二维输入和二维输出数据,我希望通过使用神经网络来生成最适合这些数据的概率模型。我正在利用 tfp.layers.MixtureSameFamily 生成这个模型,它按预期工作得很好。这是我这样做的代码:
注意:我使用的是 tensorflow 2.4.1 和 tensorflow-probability 0.12.1
x = some 2-d input data
y = some 2-d output data
event_shape = y.shape[-1]
num_components = 5
params_size = tfp.layers.MixtureSameFamily.params_size(
num_components,component_params_size=tfp.layers.MultivariatenormalTriL.params_size(event_shape))
model = tf.keras.Sequential([
tf.keras.layers.Dense(params_size),tfp.layers.MixtureSameFamily(num_components,tfp.layers.MultivariatenormalTriL(event_shape)),])
model.compile(optimizer=tf.optimizers.Adam(learning_rate=0.01),loss=lambda y,model1: -model1.log_prob(y),metrics=[])
batch_size = 250
model.fit(x,y,batch_size=batch_size,epochs=500,steps_per_epoch=n // batch_size,verbose=False,shuffle=True)
yhat_mix=model(x_tst)
然而,一旦网络经过训练并生成模型,我不知道如何提取我实际想要的特定信息,即构成混合模型的二维高斯分量的均值和协方差.有没有一种简单的方法来提取这些信息?我一直在寻找类似于“.mean()”和“.covariance()”的东西,但它们给出了单个组件的均值和协方差,而不是整个分布。我认为使用“.mode()”可能会有所帮助,因为我正在部分寻找整个分布的模式,但这只会返回以下错误:
NotImplementedError Traceback (most recent call last)
in
----> 1 yhat_mix.mode()
~\anaconda3\envs\py36\lib\site-packages\tensorflow_probability\python\distributions\distribution.py in mode(self,name,**kwargs)
1394 """Mode."""
1395 with self._name_and_control_scope(name):
-> 1396 return self._mode(**kwargs)
1397
1398 def _cross_entropy(self,other):
~\anaconda3\envs\py36\lib\site-packages\tensorflow_probability\python\distributions\distribution.py in _mode(self,**kwargs)
1389 def _mode(self,**kwargs):
1390 raise NotImplementedError('mode is not implemented: {}'.format(
-> 1391 type(self).name))
1392
1393 def mode(self,name='mode',**kwargs):
NotImplementedError: mode is not implemented: MixtureSameFamily
理想情况下,我可以获得定义所有分量多元分布的参数(它们的均值和协方差),而不仅仅是混合模型的模式位置。有谁知道如何获取这些信息?
解决方法
暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!
如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。
小编邮箱:dio#foxmail.com (将#修改为@)