@@ -52,32 +52,22 @@ def partial_fit(self, train_main, train_appliances, **load_kwargs):
52
52
train_app_tmp .append ((app_name ,df_list ))
53
53
54
54
train_appliances = train_app_tmp
55
-
56
-
57
55
learnt_model = OrderedDict ()
58
-
59
56
means_vector = []
60
-
61
57
one_hot_states_vector = []
62
-
63
58
pi_s_vector = []
64
-
65
59
transmat_vector = []
66
-
67
60
states_vector = []
68
61
69
62
train_main = train_main .values .flatten ().reshape ((- 1 ,1 ))
70
-
63
+
71
64
for appliance_name , power in train_appliances :
72
65
#print (appliance_name)
73
66
self .appliances .append (appliance_name )
74
-
75
67
X = power .values .reshape ((- 1 ,1 ))
76
-
77
68
learnt_model [appliance_name ] = hmm .GaussianHMM (self .default_num_states , "full" )
78
69
# Fit
79
70
learnt_model [appliance_name ].fit (X )
80
-
81
71
means = learnt_model [appliance_name ].means_ .flatten ().reshape ((- 1 ,1 ))
82
72
states = learnt_model [appliance_name ].predict (X )
83
73
transmat = learnt_model [appliance_name ].transmat_
@@ -88,17 +78,16 @@ def partial_fit(self, train_main, train_appliances, **load_kwargs):
88
78
89
79
for i in keys :
90
80
total += counter [i ]
91
-
92
- pi = []
93
81
82
+ pi = []
94
83
for i in keys :
95
84
pi .append (counter [i ]/ total )
96
-
85
+
97
86
pi = np .array (pi )
98
87
99
88
nb_classes = self .default_num_states
100
89
targets = states .reshape (- 1 )
101
-
90
+
102
91
means_vector .append (means )
103
92
pi_s_vector .append (pi )
104
93
transmat_vector .append (transmat .T )
@@ -110,46 +99,7 @@ def partial_fit(self, train_main, train_appliances, **load_kwargs):
110
99
self .pi_s_vector = pi_s_vector
111
100
self .means_vector = means_vector
112
101
self .transmat_vector = transmat_vector
113
-
114
- # print(transmat_vector)
115
- # print (means_vector)
116
- # print (states_vector)
117
- # print (pi_s_vector)
118
102
print ("Finished Training" )
119
- # print (self.signal_aggregates)
120
- # print (np.log(transmat))
121
- # print(pi)
122
- # print (np.log(pi))
123
- #print (np.sum(transmat_vector[0],axis=1))
124
- #print (np.sum(transmat_vector[0],axis=0))
125
- #print (states.shape)
126
- #print (one_hot_targets.shape)
127
-
128
- # one_hot_states_vector = np.array(one_hot_states_vector)
129
-
130
- # # print (transmat_vector[0])
131
- # # print (np.sum(transmat_vector[0],axis=0))
132
- # # print (np.sum(transmat_vector[0],axis=1))
133
- # appliance_variable_matrix = []
134
-
135
- # #print (len(states_vector))
136
- # #variable_matrix = np.zeros((len(appliance_states),self.default_num_states,self.default_num_states))
137
-
138
- # for appliance_states in states_vector:
139
-
140
- # variable_matrix = np.zeros((len(appliance_states),self.default_num_states,self.default_num_states))
141
-
142
- # for i in range(1,len(appliance_states)):
143
- # current_state = appliance_states[i]
144
- # previous_state = appliance_states[i-1]
145
- # variable_matrix[i,current_state, previous_state] = 1
146
- # appliance_variable_matrix.append(variable_matrix)
147
-
148
- # appliance_variable_matrix = np.array(appliance_variable_matrix)
149
- # term_1_list = []
150
-
151
- # term_2_list = []
152
-
153
103
154
104
def disaggregate_thread (self , test_mains ,index ,d ):
155
105
means_vector = self .means_vector
@@ -168,57 +118,67 @@ def disaggregate_thread(self, test_mains,index,d):
168
118
sigma = (test_mains .flatten () - usage .flatten ()).reshape ((- 1 ,1 ))
169
119
sigma = np .where (sigma < 1 ,1 ,sigma )
170
120
else :
171
-
172
121
if flag == 0 :
173
122
constraints = []
174
123
cvx_state_vectors = []
175
124
cvx_variable_matrices = []
176
125
delta = cvx .Variable (shape = (len (test_mains ),1 ), name = 'delta_t' )
177
126
178
127
for appliance_id in range (self .num_appliances ):
179
- state_vector = cvx .Variable (shape = (len (test_mains ), self .default_num_states ), name = 'state_vec-%s' % (appliance_id ))
128
+ state_vector = cvx .Variable (
129
+ shape = (len (test_mains ),
130
+ self .default_num_states ),
131
+ name = 'state_vec-%s' % (appliance_id )
132
+ )
180
133
cvx_state_vectors .append (state_vector )
181
134
# Enforcing that their values are ranged
182
135
constraints += [cvx_state_vectors [appliance_id ]>= 0 ]
183
136
constraints += [cvx_state_vectors [appliance_id ]<= 1 ]
184
137
# Enforcing that sum of states equals 1
185
138
for t in range (len (test_mains )): # 6c
186
139
constraints += [cvx .sum (cvx_state_vectors [appliance_id ][t ])== 1 ]
140
+
187
141
# Creating Variable matrices for every appliance
188
142
appliance_variable_matrix = []
189
143
for t in range (len (test_mains )):
190
- matrix = cvx .Variable (shape = (self .default_num_states , self .default_num_states ), name = 'variable_matrix-%s-%d' % (appliance_id ,t ))
144
+ matrix = cvx .Variable (
145
+ shape = (self .default_num_states , self .default_num_states ),
146
+ name = 'variable_matrix-%s-%d' % (appliance_id ,t )
147
+ )
191
148
appliance_variable_matrix .append (matrix )
149
+
192
150
cvx_variable_matrices .append (appliance_variable_matrix )
193
151
# Enforcing that their values are ranged
194
152
for t in range (len (test_mains )):
195
153
constraints += [cvx_variable_matrices [appliance_id ][t ]>= 0 ]
196
154
constraints += [cvx_variable_matrices [appliance_id ][t ]<= 1 ]
155
+
197
156
# Constraint 6e
198
157
for t in range (0 ,len (test_mains )): # 6e
199
158
for i in range (self .default_num_states ):
200
- constraints += [cvx .sum (((cvx_variable_matrices [appliance_id ][t ]).T )[i ]) == cvx_state_vectors [appliance_id ][t ][i ]]
159
+ constraints += [
160
+ cvx .sum (((cvx_variable_matrices [appliance_id ][t ]).T )[i ]) == cvx_state_vectors [appliance_id ][t ][i ]
161
+ ]
162
+
201
163
# Constraint 6d
202
164
for t in range (1 ,len (test_mains )): # 6d
203
165
for i in range (self .default_num_states ):
204
- constraints += [cvx .sum (cvx_variable_matrices [appliance_id ][t ][i ]) == cvx_state_vectors [appliance_id ][t - 1 ][i ]]
205
-
166
+ constraints += [
167
+ cvx .sum (cvx_variable_matrices [appliance_id ][t ][i ]) == cvx_state_vectors [appliance_id ][t - 1 ][i ]
168
+ ]
206
169
207
170
for appliance_id in range (self .num_appliances ):
208
171
appliance_usage = cvx_state_vectors [appliance_id ]@means_vector [appliance_id ]
209
172
total_appliance_usage = cvx .sum (appliance_usage )
210
- constraints += [total_appliance_usage <= self .signal_aggregates [self .appliances [appliance_id ]]]
211
-
173
+ constraints += [
174
+ total_appliance_usage <= self .signal_aggregates [self .appliances [appliance_id ]]
175
+ ]
212
176
213
177
# Second order cone constraints
214
-
215
178
total_observed_reading = np .zeros ((test_mains .shape ))
216
- #print (len(cvx_state_vectors))
217
179
for appliance_id in range (self .num_appliances ):
218
- total_observed_reading += cvx_state_vectors [appliance_id ]@means_vector [appliance_id ]
180
+ total_observed_reading += cvx_state_vectors [appliance_id ]@means_vector [appliance_id ]
219
181
flag = 1
220
-
221
-
222
182
term_1 = 0
223
183
term_2 = 0
224
184
@@ -234,21 +194,20 @@ def disaggregate_thread(self, test_mains,index,d):
234
194
# The expression involving start states
235
195
first_one_hot_states = one_hot_states [0 ]
236
196
term_2 -= cvx .sum (cvx .multiply (first_one_hot_states ,np .log (pi )))
237
-
197
+
238
198
flag = 1
239
199
240
200
expression = 0
241
201
term_3 = 0
242
202
term_4 = 0
243
-
244
203
for t in range (len (test_mains )):
245
- term_4 += .5 * ((test_mains [t ][0 ] - total_observed_reading [t ][0 ])** 2 / (sigma [t ]** 2 ))
204
+ term_4 += .5 * ((test_mains [t ][0 ] - total_observed_reading [t ][0 ])** 2 / (sigma [t ]** 2 ))
246
205
term_3 += .5 * (np .log (sigma [t ]** 2 ))
206
+
247
207
expression = term_1 + term_2 + term_3 + term_4
248
208
expression = cvx .Minimize (expression )
249
209
u = time .time ()
250
210
prob = cvx .Problem (expression , constraints )
251
-
252
211
prob .solve (solver = cvx .SCS ,verbose = False , warm_start = True )
253
212
s_ = [i .value for i in cvx_state_vectors ]
254
213
@@ -260,22 +219,14 @@ def disaggregate_thread(self, test_mains,index,d):
260
219
261
220
d [index ] = pd .DataFrame (prediction_dict ,dtype = 'float32' )
262
221
263
-
264
-
265
-
266
-
267
-
268
-
269
222
def disaggregate_chunk (self , test_mains_list ):
270
-
271
- # Sistributes the test mains across multiple threads and runs them in parallel
223
+ # Distributes the test mains across multiple threads and runs them in parallel
272
224
manager = Manager ()
273
225
d = manager .dict ()
274
-
275
226
predictions_lst = []
276
- for test_mains in test_mains_list :
227
+ for test_mains in test_mains_list :
277
228
test_mains_big = test_mains .values .flatten ().reshape ((- 1 ,1 ))
278
- self .arr_of_results = []
229
+ self .arr_of_results = []
279
230
st = time .time ()
280
231
threads = []
281
232
for test_block in range (int (math .ceil (len (test_mains_big )/ self .time_period ))):
@@ -293,7 +244,6 @@ def disaggregate_chunk(self, test_mains_list):
293
244
self .arr_of_results .append (d [i ])
294
245
prediction = pd .concat (self .arr_of_results ,axis = 0 )
295
246
predictions_lst .append (prediction )
296
-
247
+
297
248
return predictions_lst
298
249
299
-
0 commit comments