逆加权分布

时间:2013-04-26 02:58:16

标签: python probability

我正在寻找一种做反向加权分布的方法。这是我的简单线性加权分布的代码:

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

如何对此进行反转,以使具有最小权重的列表中的项目被选中的概率最高?有没有办法规范化并切换它们?

1 个答案:

答案 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()

enter image description here