如何在 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 分布的参数?的主要内容,如果未能解决你的问题,请参考以下文章