2013-04-26 28 views
1

我正在尋找一種方法來做一個逆加權分佈。這裏是我的一個簡單的線性碼稱重分佈:逆加權分佈

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

這取決於你想如何衡量他們。最簡單的方法是用'max_weight - weight + 1'或者別的東西來替換權重,以便以前最高的權重變成1,而以前的權重爲零的權重將是'max_weight'。你可以做各種其他類型的轉換,具體取決於你希望它具有的屬性... – Dougal 2013-04-26 03:01:37

+0

我並不是真正關心權重,而是從分佈中選擇實際的索引。只要他們獲得了比25更好的選擇機會,這很好。 – Clev3r 2013-04-26 03:02:48

+0

您可以在不進行兩次循環迭代的情況下執行此操作:一個用於構建分佈,一個用於重新排列? – Clev3r 2013-04-26 03:09:52

回答

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

+1

幹得好,感謝全力以赴。 – Clev3r 2013-04-26 15:17:28