我正在寻找一种做反向加权分布的方法。这是我的简单线性加权分布的代码:
total = 0
cumulative_distribution = []
for value in distribution:
total += value
cumulative_distribution.append(total)
selected = total * random.random()
index = 0
while cumulative_distribution[index] < selected:
index += 1
return index
如何对此进行反转,以使具有最小权重的列表中的项目被选中的概率最高?有没有办法规范化并切换它们?
答案 0 :(得分:2)
正如评论中所提到的,这实际上取决于你想如何加权它们。使用你的陈述:
最小权重的选择概率最高
@Blckknght和我都有相同的想法,只需对PDF中的每个点加权即可。我建议用
之类的参数加权inverse_PDF = 1/(PDF + delta)
delta
是一个参数,您可以根据自己的喜好进行控制。如果delta=0
那么原始权重为零的PDF中的任何点将抛出ZeroDivisionError
,这通常是不合需要的。下面是使用实现上述内容的numpy的一些示例代码:
import numpy as np
# Generate a random points
pts = np.random.normal(size=(10**6,))
# Compute a PDF
PDF,bins = np.histogram(pts, bins=50)
# Normalize (could have used normed=True in hist)
PDF = PDF / np.trapz(PDF, bins[1:])
# Create the inverse distribution
delta = .1
inverse_PDF = 1/(PDF + delta)
# Normalize
inverse_PDF = inverse_PDF / np.trapz(inverse_PDF, bins[1:])
# Plot the results
import pylab as plt
plt.subplot(211)
plt.plot(bins[1:],PDF,lw=4,alpha=.7)
plt.title("Original Distribution")
plt.subplot(212)
plt.plot(bins[1:],inverse_PDF,lw=4,alpha=.7)
plt.title(r"'Inverse' Distribution with $\delta=%.3f$" % delta)
plt.tight_layout()
plt.show()