如何在 Python 中使用 Kullback-Leibler 方法最小化 Weibull 分布的参数?

Posted

技术标签:

【中文标题】如何在 Python 中使用 Kullback-Leibler 方法最小化 Weibull 分布的参数?【英文标题】:How can I minimize parameters of a Weibull Distribution using Kullback-Leibler method in Python? 【发布时间】:2021-07-06 10:18:24 【问题描述】:

我想通过使用 Kullbak-Leibler 方法最小化参数来找到 Weibull 分布的参数。我找到了一个代码here,它做了同样的事情。我用 Weibull 分布替换了原始代码中的正态分布。我不知道为什么我会得到“Nan”参数和“Nan”Kullback-Leibler 散度值。有人可以帮忙吗?

import numpy as np
import pandas as pd
import numpy as np
from matplotlib import pyplot as plt
import tensorflow.compat.v1 as tf
tf.disable_v2_behavior()
import seaborn as sns
sns.set()
from scipy.stats import weibull_min

learning_rate = 0.001
epochs = 100

x = np.arange(0, 2000,0.001)
p_pdf=weibull_min.pdf(x, 1.055,0, 468).reshape(1, -1)
p = tf.placeholder(tf.float64, shape=p_pdf.shape)

alpha = tf.Variable(np.zeros(1))
beta = tf.Variable(np.eye(1))

weibull=(beta / alpha) * ((x / alpha)**(beta - 1)) * tf.exp(-((x / alpha)**beta))
q = weibull
kl_divergence = tf.reduce_sum(tf.where(p == 0, tf.zeros(p_pdf.shape, tf.float64), p * tf.log(p / q)))
optimizer = tf.train.GradientDescentOptimizer(learning_rate).minimize(kl_divergence)
init = tf.global_variables_initializer()

with tf.Session() as sess:
    sess.run(init)
    history = []    
    alphas = []
    betas = []
    
    
    for i in range(epochs):
        sess.run(optimizer,  p: p_pdf )
        
        if i % 10 == 0:
            history.append(sess.run(kl_divergence,  p: p_pdf ))
            alphas.append(sess.run(alpha)[0])
            betas.append(sess.run(beta)[0][0])
            
    for a, b in zip(alphas, betas):

        q_pdf =weibull_min.pdf(x, b,0,a)
        plt.plot(x, q_pdf.reshape(-1, 1), c='red')

plt.title('KL(P||Q) = %1.3f' % history[-1])
plt.plot(x, p_pdf.reshape(-1, 1), linewidth=3)
plt.show()  
plt.plot(history)
plt.show()   
sess.close()

【问题讨论】:

如何使用 scipy 在 python 中生成具有最小 KL 散度的概率分布生成器? 【参考方案1】:

尝试将您的 alpha 值初始化为不为 0。也许初始化为 np.ones(1)

如果你使用零的 alpha,你会得到一个带有 scipy 的 nan。

from scipy.stats import weibull_min

weibull_min.pdf(100, 0, 0, 2.), weibull_min.pdf(100, 1, 0, 2.)
(nan, 9.643749239819589e-23)

【讨论】:

以上是关于如何在 Python 中使用 Kullback-Leibler 方法最小化 Weibull 分布的参数?的主要内容,如果未能解决你的问题,请参考以下文章

我如何在 Python 中使用 GCP 枚举?

如何在python中使用nice命令?

如何在 Python 中使用 Selenium?

如何在Python中使用textcat?

当python使用“Python.h”调用该c++进程时,如何在python中停止一个c++进程

如何使用 Boost.Python 在 Python 中调用内置函数