/
stoq.py
66 lines (57 loc) · 1.76 KB
/
stoq.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
from thinkbayes import Pmf
from thinkbayes import Suite
import thinkbayes
import random
print '\n *** Stoq **** '
class Question(Pmf):
def __init__(self):
self.rate = random.random()
print "Rate", self.rate
def lookup(self, x):
p = self.rate
result = float((1.0-p) * x + (3.0 * p -1.0)/2.0)
return float(result)
def reverse(self, y):
p = self.rate
result = float((2.0*y - 3.0*p + 1.0)/(2.0 * (1.0-p)))
return float(result)
def a(self):
p = self.rate
return(1.0-p)
def b(self):
p = self.rate
return (3.0 * p -1.0)/2.0
class User(Suite):
def __init__(self):
Suite.__init__(self, xrange(0, 101))
# for x in xrange(1, 101):
# self.Set(x, 1)
# self.Normalize()
self.real_val = thinkbayes.Beta().Random()
def Likelihood(self, data, hypos):
question = data["question"]
result = data["result"]
if result:
like = question.lookup(hypos/100.0)
else:
like = 1.0 - question.lookup(hypos/100.0)
print "like,", like
return like
user = User()
print "Actual,", user.real_val
print "Mean,", user.Mean()
print 'Median,', user.MaximumLikelihood()
print 'CI,', user.CredibleInterval(95)
for i in range(1, 1001):
question = Question()
print question.rate
print "question, a=", question.a(), "b=",question.b(), "p=", question.rate
rand = thinkbayes.Beta().Random()
result = (rand < question.lookup(user.real_val))
print result
data = dict(result=result, question=question)
user.Update(data)
print "Actual,", user.real_val
print "Mean,", user.Mean()
print 'Median,', user.MaximumLikelihood()
print 'CI,', user.CredibleInterval(95)