NILM问题是一个典型的时间序列分析问题
以功率为例,某一时刻的总功耗由各设备的工作状态和该时刻对应的总功率决定
假定设备只有开、关两种状态,且功率恒定,总功率可表示为:
图中:am(t)表示设备m的开关状态(开为1,关为0),Pm表示设备m的功率,e(t)为噪声或误差的量
将NILM问题看作一个优化问题
若M个设备各自的功率都已知且给定测量到的总功率,则可以将NILM问题看作一个优化问题:
在每个时刻t,对m维向量进行搜索使得功率误差a^(t)尽量最小:
将NILM看作一个序列建模问题
序列建模是将输入序列或观察序列映射到输出序列或标记序列。
序列建模公式的一般形式可以看作是满足因果约束的任意映射函数 f:X^T+1 →Y^T+1,该预测只使用x1,x2x3,...,xt-1来预测yt,而不会使用这之后时刻的数据。
这种方法的目的是训练一个模型
传统做法为建立一个基于seq2seq并结合递归神经网络和LSTM网络的回归模型
将输入序列Y(总负荷的功率序列)的滑动窗口片段映射为另一个序列X(单独一个设备相应的功率),以最大化概率 P(y1,y2,...,yn | x1,x2,...,xn)。
公式表示如下:
t:t+W-1表示从t开始的长度为W的滑动时间窗口
损失函数:
T为序列长度,θs为网络Fs的参数
在seq2seq模型中,对输出信号的每个元素进行多次预测,通过对多次预测的平均得到最终的预测。
事实上,一些滑动窗口可以提供比其他窗口更好的预测,但简单的滑动窗口平均不能利用这些信息
seq2point(S2P)模型
为解决以上问题所提出的
输入与seq2seq模型一样为总负债的滑动窗口片段,但是将输出变为目标设备的单个点
并使用卷积神经网络对模型进行训练,将网络的表征能力集中在窗口的中点上,以产生更准确的预测
在该模型总神经网络(Fp)将输入的总功率数据(Y)在t到 t+W-1之间的滑动窗口片段的数据映射到相应时间范围中的每个设备的功率数据()的中点
公式:
损失函数:
主要优点是对每个中点元素进行单一的预测,而不是对每个窗口的预测的平均值
结构体系:
# Creates and returns the ShortSeq2Point Network
model = Sequential()
# 1D Conv
model.add(Conv1D(30, 10, activation='relu', input_shape=(time_stamp,1), padding="same", strides=1))
model.add(Dropout(0.5))
model.add(Conv1D(30, 8, activation='relu', padding="same", strides=1))
model.add(Dropout(0.5))
model.add(Conv1D(40, 6, activation='relu', padding="same", strides=1))
model.add(Dropout(0.5))
model.add(Conv1D(50, 5, activation='relu', padding="same", strides=1))
model.add(Dropout(0.5))
model.add(Conv1D(50, 5, activation='relu', padding="same", strides=1))
model.add(Dropout(0.5))
# Fully Connected Layers
model.add(Flatten())
model.add(Dense(1024, activation='relu'))
model.add(Dropout(0.5))
model.add(Dense(1, activation='linear'))
model.compile(loss='mse', optimizer="adam")