Skip to content

Instantly share code, notes, and snippets.

@HarryMcCarney
Created March 3, 2023 16:29
Show Gist options
  • Save HarryMcCarney/c457a1019ecaf3a8bc25352c0c384e8c to your computer and use it in GitHub Desktop.
Save HarryMcCarney/c457a1019ecaf3a8bc25352c0c384e8c to your computer and use it in GitHub Desktop.
#r "nuget: FSharp.Stats, 0.4.12-preview.1"
#r "nuget: fsharp.data"
#r "nuget: Plotly.NET"
open FSharp.Data
open FSharp.Stats
open FSharp.Stats.Distributions
open Plotly.NET
let normalise (dist: seq<'a * float>) =
let totalProbability = dist |> Seq.sumBy snd
dist |> Seq.map (fun (k, v) -> k, v / totalProbability) |> Map.ofSeq
let updatePosteriorDist (priorDist: Map<'a, float>) (likelihoods: Map<'a, float>) =
priorDist
|> Map.toSeq
|> Seq.map (fun (k, v) ->
match (likelihoods.TryFind k) with
| Some l -> printfn "k: %f , V: %f, L: %f" k v l ; (k, v * l)
| None -> printfn "None"; (k, v))
|> normalise
|> Map.toSeq
let linspace start stop count =
[|start .. ((stop-start) / (count-1.)) .. stop|]
let uniformPrior = (linspace 0.1 0.4 101) |> Array.map (fun i -> i, 1.) |> normalise
let genLike prior n k =
prior
|> Map.toSeq
|> Seq.map (fun (p, v) -> p, (DiscreteDistribution.binomial p n).PMF k)
|> Map.ofSeq
let priorAfter25 = updatePosteriorDist uniformPrior (genLike uniformPrior 100 25 )
let priorAfter28 = updatePosteriorDist uniformPrior (genLike uniformPrior 103 28 )
let priorAfter25and33 = updatePosteriorDist (priorAfter25 |> Map.ofSeq) (genLike uniformPrior 3 3 )
[
Chart.Line(priorAfter25, Name = "Probability of hit after 25/100");
Chart.Line(priorAfter28, Name = "Probability of hit after 28/103");
Chart.Line(priorAfter25and33, Name = "Probability of hit after 25/100 and then 3/3");
Chart.Line((uniformPrior |> Map.toSeq), Name = "Uniform Probability");
]
|> Chart.combine
|> Chart.withXAxisStyle ("Proportion of Hits")
|> Chart.withYAxisStyle ("Probability")
|> Chart.show
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment