2021-009 📖Julia決策算法,離散聯合機率分配

我有一個小小的心願,是希望可以多懂一點數學,多了解一些造物者用來描述宇宙的語言。除了大學微積分被當三次之外,我也差點把機率課本摔到講台前(真的是上課都第一個到,也坐在第一排,很認真聽,還是聽不懂老師嘴巴裡的中文)。 經過二十多年,為了能夠看懂 Julia 決策算法書籍裡面的程式碼 p.26, https://algorithmsbook.com/files/dm.pdf?fbclid=IwAR15cNm91xN_SAnoIRwX0Ggcxkt12DRiL1ybTcLrtFqk7rDXUmtSqGVJt1A 毅然決然的照樣把程式碼抄寫出來,先跑跑看再說

實在很無奈,就算如今老師已經不在我面前講天語,就算已經照抄書上的程式碼,還是依然跑不出個所以然,Bugs依舊讓人挫折連連。因為數學看不太懂的我,原本想要透過程式碼來學數學的願望,再次受到阻撓。

還好,現代人有 Youtube 油條伯 可以諮詢,只要把 Discrete Joint Distributions 這個關鍵字問問油條伯,立馬就會出現各國老師講解這是個什麼東東。最先出現的兩個影片是純數學在講解怎麼計算,但偏偏我就是需要「真實案例」先知道有什麼用,才能夠把數學變成消化吸收的東西。

好家在第三個影片就是用HBO看電視影集,男生女生誰愛看哪些來舉例,輕鬆的把 Joint、Marginal、Conditional Probability三種機率觀念,14分鐘示範清清楚楚,還附贈Independence。

雖然書上 Julia 程式碼還是有 bugs 跑不動,但,起碼未來在創業路上,碰到需要計算哪些空氣污染工廠亂噴煙,我們又多了一個機率工具可以運用,簡單到自己就能夠寫出來而不需要照抄書上的案例。

謝謝油條伯,也謝謝介紹這本書的網友。

p.s. 為了證明我們沒有冤枉 Julia 決策算法這本書的範例程式,在此附上有錯誤訊息的照抄程式碼,錯在最後的 ϕ = Factor([X, Y, Z], FactorTable 這一行:

struct Variable
    name::Symbol
    m::Int # number of possible values
end
const Assignment = Dict{Symbol,Int}
const FactorTable = Dict{Assignment,Float64}
struct Factor
    vars::Vector{Variable}
    table::FactorTable
end
variablenames(ϕ::Factor) = [var.name for var in ϕ.vars]
select(a::Assignment, varnames::Vector{Symbol}) =
    Assignment(n => a[n] for n in varnames)
function assignments(vars::AbstractVector{Variable})
    names = [var.name for var in vars]
    return vec([Assignment(n => v for (n, v) in zip(names, values))
    for values in product((1:v.m for v in vars)...)])
end
function normalize!(ϕ::Factor)
    z = sum(p for (a, p) in ϕ.table)
    for (a, p) in ϕ.table
        ϕ.table[a] = p / z
    end
    return ϕ
end
struct Variable
    name::Symbol
    m::Int # number of possible values
end
const Assignment = Dict{Symbol,Int}
const FactorTable = Dict{Assignment,Float64}
struct Factor
    vars::Vector{Variable}
    table::FactorTable
end
variablenames(ϕ::Factor) = [var.name for var in ϕ.vars]
select(a::Assignment, varnames::Vector{Symbol}) =
    Assignment(n => a[n] for n in varnames)
function assignments(vars::AbstractVector{Variable})
    names = [var.name for var in vars]
    return vec([Assignment(n => v for (n, v) in zip(names, values))
    for values in product((1:v.m for v in vars)...)])
end
function normalize!(ϕ::Factor)
    z = sum(p for (a, p) in ϕ.table)
    for (a, p) in ϕ.table
        ϕ.table[a] = p / z
    end
    return ϕ
end
X = Variable(:x, 2)
Y = Variable(:y, 2)
Z = Variable(:z, 2)
ϕ = Factor([X, Y, Z], FactorTable(
(x = 1, y = 1, z = 1) => 0.08, (x = 1, y = 1, z = 2) => 0.31,
(x = 1, y = 2, z = 1) => 0.09, (x = 1, y = 2, z = 2) => 0.37,
(x = 2, y = 1, z = 1) => 0.01, (x = 2, y = 1, z = 2) => 0.05,
(x = 2, y = 2, z = 1) => 0.02, (x = 2, y = 2, z = 2) => 0.07,
))
2.8s
Julia
Runtimes (1)