各種規模公司的機車問題
我正在研究 Think Bayes(在此處免費:http: //www.greenteapress.com/thinkbayes/)並且正在進行練習 3.1。這是問題的摘要:
“一條鐵路的機車編號順序為 1..N。有一天你會看到一輛編號為 60 的機車。估計鐵路有多少機車。”
這個解決方案是通過似然函數和指數先驗找到的,如下所示:
class Train(Suite): def __init__(self, hypos, alpha=1.0): # Create an exponential prior Pmf.__init__(self) for hypo in hypos: self.Set(hypo, hypo**(-alpha)) self.Normalize() def Likelihood(self, data, hypo): if hypo < data: return 0 else: return (1.0/hypo)
從概念上講,如果我們看到一個大於我們的假設之一(1…1000)的序列號,那麼每個較小的假設正確的可能性為零。其餘的假設有 1/number_of_trains 的機會向我們展示具有此編號的火車。
在我正在研究作者的練習中,然後添加了一些額外內容。這假設只有一家公司。然而,在現實生活中,您會同時擁有大小公司和大公司(兩者可能性相同)。但是,這意味著您更有可能看到大公司的火車,因為他們有更多的火車。
現在的問題是如何在似然函數中反映這一點?
這不是 Stack Overflow,所以我並不是真的在尋求編碼幫助,而是可能只是幫助我如何從似然函數的角度思考這個問題。
我首先詳細概述了兩家公司的方法,然後擴展到更多公司應該是直觀的(至少就可能性而言,先驗可能更棘手)。
假設有兩家公司A和B,其中A有機車和B有機車。我們猜測(您可以隨時切換A和B以保持此狀態)。該機車假設的總數是.
想像一下,你看到一輛帶有數字的機車. 可能性有以下三種情況:
- : 這不可能發生,所以可能性為零。
- :這台機車一定是A公司的,所以只有一個機車有這個號碼。因此可能性是
- : 這個機車可以來自A也可以來自B,所以這個編號的機車有兩個。看到其中一個的可能性是.
作為一個快速的健全性檢查:看到任何數字的可能性是
.
一般會有(公司數+1)個案例,每個區間一個. 幸運的是,我們可以從不同的角度看待這個問題,發現我們需要的可能性實際上只是兩個數字:, 機車總數;和, 有編號的機車數量. 我們看到其中一個的可能性有多大機車,出機車?這將發生在在所有情況下,所以這個分數是可能性。在 Python 中,您可以使用兩個求和生成器來計算(甚至不必按公司規模排序)。如果
Ns
根據您的假設包含公司規模的列表(或元組),那麼這將給出看到帶有 number 的機車的可能性n
:total_number_of_locomotives = sum(N for N in Ns) number_of_locomotives_with_that_number = sum(1 for N in Ns if n<=N) likelihood = (number_of_locomotives_with_that_number / total_number_of_locomotives)
請注意,該代碼也處理了一家公司的瑣碎案例(第一個總和將是,第二個總和將是 0 或 1,取決於是否).
對於先驗知識,齊夫定律可能是公司規模實際分佈的一個很好的起點。