In [18]:
%matplotlib inline
import sys
import os
sys.path.append(os.path.join(os.pardir,os.pardir))
from disaggregator import GreenButtonDatasetAdapter as gbda
from disaggregator import fhmm
import matplotlib.pyplot as plt
import numpy as np

In [8]:
with open("../../../xml_data.xml",'r') as f:
    trace = gbda.get_trace(f.read())

In [14]:
plt.plot(trace.series[1000:2000])


Out[14]:
[<matplotlib.lines.Line2D at 0x1154d4850>]

In [116]:
means = np.array([200,400,2000,2500])
ons = np.array([.9,.9,.9,.9])
offs = np.array([.9,.9,.9,.9])
pis = np.array([.5,.5,.5,.5])
covs_on = np.array([50,100,100,100])
covs_off = np.array([20,20,20,20])

def get_fhmm(means,ons,offs,pis,covs_on,covs_off):
    hmms = {}
    for i,(mean,on,off,cov_on,cov_off,pi) in enumerate(zip(means,ons,offs,covs_on,covs_off,pis)):
        pi_prior = np.array([1 - pi,pi])
        a_prior = np.array([[off, 1 - off],[1 - on,on]])
        mean_prior = np.array([0,mean])[:,np.newaxis]
        cov_prior = np.array([cov_on,cov_off])[:,np.newaxis,np.newaxis]
        hmms["device_{}".format(i)] = fhmm.init_HMM(pi_prior,a_prior,mean_prior,cov_prior)
    appliance_hmm,_,_ = fhmm.generate_FHMM_from_HMMs(hmms)
    return appliance_hmm
    
appliance_fhmm,a,b = get_fhmm(means,ons,offs,pis,covs_on,covs_off)

In [118]:
def get_combinations(n):
    combos = []
    for i in range(2**n):
        combo = []
        for j in range(n-1,-1,-1):
            combo.append(int(2**j<=i))
            if 2**j <= i:
                i = i - 2**j
        combos.append(combo)
    return np.array(combos)

def get_states(individual_means,appliance_fhmm,use):
    states = appliance_fhmm.predict(use)
    combinations = get_combinations(individual_means.shape[0])
    state_means = []
    for combo in combinations:
        state_means.append(np.sum(individual_means * combo))
    decoded_state_key = sorted(zip(state_means,combinations), key = lambda x: x[0])
    decoded_states = [decoded_state_key[state][1] for state in states]
    return np.array(decoded_states)
use = trace.series.values.astype(float)[:,np.newaxis]
decoded_states = get_states(means,appliance_fhmm,use)
plt.plot(np.sum(decoded_states * means,axis=1)[1000:2000])
print np.sum((decoded_states * means)[1000:2000],axis=0)


[146000 120400 258000  30000]

In [99]:



Out[99]:
array([[0, 0, 0],
       [0, 0, 1],
       [0, 1, 0],
       [0, 1, 1],
       [1, 0, 0],
       [1, 0, 1],
       [1, 1, 0],
       [1, 1, 1]])

In [ ]: