1,滑动窗口
滑动窗口,简单来说,就是以动态的边界限定的一组元素。
2,窗口大小;滑动步长
其中边界限定的大小称为窗口大小,边界变化的幅度称为滑动步长。
窗口大小为5,滑动步长为1的滑动窗口
滑动窗口用在图片定位
def sliding_window(image, window, step):
#第一个 for 循环控制矩形框以 step 的步长在图片中上下移动
for y in range(0, image.shape[0] - window[1], step):
#第二个 for 循环控制矩形框以 step 的步长在图中左右移动。
for x in range(0, image.shape[1] - window[0], step):
#最后通过 yield 生成器返回一个元组
#元组的第一个元素 x 和第二个元素 y 表示矩形框左上角的坐标
#第三个元素 image[y:y + window[1], x:x + window[0]] 就是处在图片中不同位置的矩形框。
yield (x, y, image[y:y + window[1], x:x + window[0]])
#遍历每一个滑动窗口
for (x, y, window) in sliding_window(image, (window_w, window_h), 200):
#使用一个 if 语句来判断获得的滑动窗口和我们设定的滑动窗口大小是否一致
#如果滑动窗口截取的区域与设定的 (window_w, window_h) 中任意一个元素不同,
#则执行 continue 跳过该滑动窗口。
if window.shape[0] != window_w or window.shape[1] != window_h:
continue
clone = image.copy()
cv2.rectangle(clone, (x, y), (x + window_w, y + window_h), (0, 255, 0), 2)
#OpenCV 图片是以 B,G,R(蓝,绿,红)的通道顺序存储的,而在 Matplotlib 中图片是以 R,G,B 的通道顺序存储,所以我们使用 clone[:,:,::-1] 切片方法来跳转图片通道的顺序
clone = clone[:,:,::-1]
plt.imshow(clone)
plt.pause(0.1) #让每张图片显示暂停一段时间,函数的参数 0.1 表示暂停 0.1 秒。
display.clear_output(wait=True) #清除已经显示的图片为下一张图片显示做准备。
滑动窗口处理数据
时间序列预测中的数据滑窗操作
时间预测的原理:将历史数据x预测未来数据y。为了充分利用原始(历史)数据,所以对原始数据集进行滑窗操作
例子(多特征时间序列)。这种数据一般使用在待预测的数据跟多个特征相关性较高的场合中
这是含三个特征的数据集,H( humidity)、PT(pressure)、PE(power)三个特征为预测依据。
取当前和上三个时刻共四个时刻的已知数据对下一时刻的PE(功率)进行预测
那么对于X数据集的滑窗就应该如下图所示
对y数据集的滑窗应该如下图所示。y数据集只能是一维
def sliding_window(DataSet, X_width, y_width, gap = 1, multi_vector = None, X_data = True):
'''
DataSet has to be as a DataFrame
'''
if X_data:
if multi_vector:
a,b = DataSet.shape
else:
a = DataSet.shape[0]
b = 1
c = (a-X_width-y_width-a%gap)/gap
X = np.reshape(DataSet.iloc[0:X_width,:].values,(1,X_width,b))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap
tmp = DataSet.iloc[j:j + X_width,:].values
tmp = np.reshape(tmp,(1,X_width,b))
X = np.concatenate([X,tmp],0)
return X
else:
if multi_vector:
print('y_data-error:expect 1D ,given %dD'%DataSet.shape[1])
return;
else:
a = DataSet.shape[0]
c = (a-X_width-y_width-a%gap)/gap
y = np.reshape(DataSet.iloc[X_width:X_width + y_width,0].values,(1,y_width))
for i in range(len(DataSet) - X_width - y_width):
i += 1
if i > c:
break
j = i * gap + X_width
tmp = DataSet.iloc[j:j + y_width,:].values
tmp = np.reshape(tmp,(1,y_width))
y = np.concatenate([y,tmp])
return y
单特征
#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width)
train_y = sliding_window(DataSet, X_width, y_width, X_data = None)
多特征
#DataSet训练数据集
#X_width使用的历史数据长度
#y_width要预测的数据长度
#multi_vector是否为多特征
#X_data是否是X数据集
train_X = sliding_window(DataSet, X_width, y_width, multi_vector = True)
test_y = sliding_window(DataSet, X_width, y_width, multi_vector = True, X_data = None)
单变量输入
def sliding_window(train, sw_width=7, n_out=7, in_start=0):
'''
该函数实现窗口宽度为7、滑动步长为1的滑动窗口截取序列数据
'''
data = train.reshape((train.shape[0] * train.shape[1], train.shape[2])) # 将以周为单位的样本展平为以天为单位的序列
X, y = [], []
for _ in range(len(data)):
in_end = in_start + sw_width
out_end = in_end + n_out
# 保证截取样本完整,最大元素索引不超过原序列索引,则截取数据;否则丢弃该样本
if out_end < len(data):
# 训练数据以滑动步长1截取
train_seq = data[in_start:in_end, 0] !!!!!这里
train_seq = train_seq.reshape((len(train_seq), 1))
X.append(train_seq)
y.append(data[in_end:out_end, 0])
in_start += 1
return np.array(X), np.array(y)
多变量输入
ef sliding_window(train, sw_width=7, n_out=7, in_start=0):
'''
该函数实现窗口宽度为7、滑动步长为1的滑动窗口截取序列数据
截取所有特征
'''
# 这里是将三维数组重塑成二维数组,这样就还原回以每日为单位的采样序列
data = train.reshape((train.shape[0] * train.shape[1], train.shape[2])) # 将以周为单位的样本展平为以天为单位的序列
X, y = [], []
# print(train.shape[0]) #159
# print(train.shape[1]) #7
# print(train.shape[2]) #8
# print(len(data)) #1113
# print(data.shape) #(1113, 8)
for _ in range(len(data)):
in_end = in_start + sw_width
out_end = in_end + n_out
# 保证截取样本完整,最大元素索引不超过原序列索引,则截取数据;否则丢弃该样本
if out_end < len(data):
# 因为是for循环,所以滑动窗口的滑动步长为1;想调整滑动步长可以通过yield实现,后边的文章会讲;
!!!!!这里
X.append(data[in_start:in_end, :]) # 截取窗口宽度数量的采样点的全部8个特征
y.append(data[in_end:out_end, 0]) # 截取样本之后7个时间步长的总有功功耗(截取一个单列片段,有7个元素)
in_start += 1
# print(np.array(X).shape) #(1092, 14, 8)
# print(np.array(y).shape) #(1092, 7)
return np.array(X), np.array(y)