%matplotlib inline
import matplotlib.pyplot as plt
import numpy as np
def discrete_prob(d):
r = np.random.random()
sum = 0
for k in d:
sum += d[k]
if r < sum:
return k
weather = {"Sunny":0.62, "Rainy":0.38}
for i in range(10):
print discrete_prob(weather)
Sunny Sunny Sunny Rainy Sunny Sunny Rainy Sunny Rainy Rainy
weather2 = {"Sunny":{"Sunny":0.8, "Rainy":0.2},
"Rainy":{"Sunny":0.4, "Rainy":0.6}}
seq = ["Sunny"]
for i in range(10):
seq.append(discrete_prob(weather2[seq[-1]]))
seq
['Sunny', 'Sunny', 'Sunny', 'Sunny', 'Sunny', 'Rainy', 'Rainy', 'Rainy', 'Rainy', 'Rainy', 'Rainy']
fin = open("conway_weather.txt")
cw = []
for line in fin:
cw.append(line.strip())
mc = {}
for i in range(1, len(cw)):
p = cw[i - 1]
if p not in mc:
mc[p] = {}
mc[p][cw[i]] = mc[p].get(cw[i], 0) + 1
for k in mc:
sum = 0
for k2 in mc[k]:
sum += mc[k][k2]
for k2 in mc[k]:
mc[k][k2] /= float(sum)
mc
{'clear': {'clear': 0.8638344226579521, 'cloudy': 0.002178649237472767, 'fog': 0.0010893246187363835, 'hazy': 0.0054466230936819175, 'mostlycloudy': 0.029411764705882353, 'partlycloudy': 0.09477124183006536, 'rain': 0.002178649237472767, 'tstorms': 0.0010893246187363835}, 'cloudy': {'clear': 0.012254901960784314, 'cloudy': 0.7916666666666666, 'fog': 0.00980392156862745, 'hazy': 0.004901960784313725, 'mostlycloudy': 0.09558823529411764, 'partlycloudy': 0.01715686274509804, 'rain': 0.061274509803921566, 'tstorms': 0.0024509803921568627, 'unknown': 0.004901960784313725}, 'fog': {'clear': 0.025, 'cloudy': 0.025, 'fog': 0.825, 'hazy': 0.075, 'rain': 0.05}, 'hazy': {'clear': 0.25, 'cloudy': 0.125, 'hazy': 0.5, 'mostlycloudy': 0.041666666666666664, 'partlycloudy': 0.08333333333333333}, 'mostlycloudy': {'clear': 0.06844106463878327, 'cloudy': 0.17110266159695817, 'fog': 0.0038022813688212928, 'hazy': 0.0038022813688212928, 'mostlycloudy': 0.44866920152091255, 'partlycloudy': 0.23574144486692014, 'rain': 0.06463878326996197, 'unknown': 0.0038022813688212928}, 'partlycloudy': {'clear': 0.31141868512110726, 'cloudy': 0.01384083044982699, 'hazy': 0.0034602076124567475, 'mostlycloudy': 0.22145328719723184, 'partlycloudy': 0.3875432525951557, 'rain': 0.05536332179930796, 'tstorms': 0.006920415224913495}, 'rain': {'clear': 0.01951219512195122, 'cloudy': 0.13658536585365855, 'fog': 0.004878048780487805, 'mostlycloudy': 0.06341463414634146, 'partlycloudy': 0.08292682926829269, 'rain': 0.6390243902439025, 'tstorms': 0.05365853658536585}, 'tstorms': {'clear': 0.017241379310344827, 'partlycloudy': 0.034482758620689655, 'rain': 0.20689655172413793, 'tstorms': 0.7413793103448276}, 'unknown': {'cloudy': 0.6666666666666666, 'mostlycloudy': 0.3333333333333333}}
seq = ["clear"]
for i in range(100):
seq.append(discrete_prob(mc[seq[-1]]))
seq
['clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'partlycloudy', 'partlycloudy', 'mostlycloudy', 'mostlycloudy', 'mostlycloudy', 'cloudy', 'cloudy', 'cloudy', 'cloudy', 'cloudy', 'cloudy', 'rain', 'rain', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'rain', 'tstorms', 'tstorms', 'tstorms', 'tstorms', 'rain', 'rain', 'mostlycloudy', 'mostlycloudy', 'mostlycloudy', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'partlycloudy', 'partlycloudy', 'partlycloudy', 'partlycloudy', 'clear', 'partlycloudy', 'partlycloudy', 'partlycloudy', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'hazy', 'clear', 'clear', 'clear', 'partlycloudy', 'partlycloudy', 'mostlycloudy', 'partlycloudy', 'partlycloudy', 'mostlycloudy', 'mostlycloudy', 'clear', 'clear', 'clear', 'clear', 'clear', 'partlycloudy', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear', 'clear']
weighted = {"T":{"T":0.55,"H":0.45}, "H":{"T":0.45, "H":0.55}}
seq = ["T"]
for i in range(1000):
seq.append(discrete_prob(weighted[seq[-1]]))
len(seq)
1001
rc = 0.5 ** len(seq)
rc
4.6663180925160944e-302
prob = 1
for i in range(1, len(seq)):
prob *= weighted[seq[i - 1]][seq[i]]
prob
2.5241020314743266e-301
prob / rc
5.409194104282167