Yoichi Hirai's Log

Picking an Activity

I have several options to spend 5 minutes. I've tried those options and I've recorded whether each trial was good or bad.

>>> activities = [
  { "name": "duolingo", "good": 7, "bad": 5 },
  { "name": "topics in algebra", "good": 10, "bad": 2 },
  { "name": "byzantine history", "good": 10, "bad": 3 },
  { "name": "journaling", "good": 16, "bad": 2 },
  { "name": "kahn academy", "good": 8, "bad": 5 }
]

Here I'm assuming that each activity is a Bernoulli, and their parameters follow Beta distribution of a particular form \(\Beta(g + 1, b + 1)\), where \(g\) and \(b\) denotes the numbers of good and bad experiences.

For each activity, I can pick a parameter randomly from the Beta distribution.

>>> def pick_param(activity):
  return beta.rvs(activity["good"] + 1, activity["bad"] + 1)

Given a list of activities, I can draw such parameters and pick the best one.

>>> def pick_activity(activities):
  params = map(pick_param, activities)
  pairs = zip(params, activities)
  pairs.sort(key=lambda pair: pair[0])
  return pairs[-1][1]["name"]

With this, I can pick an activity

>>> from scipy.stats import beta
>>> pick_activity(activities)
"kahn academy"