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:continueclone = 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.shapeelse:a = DataSet.shape[0]b = 1c = (a-X_width-y_width-a%gap)/gapX = np.reshape(DataSet.iloc[0:X_width,:].values,(1,X_width,b))for i in range(len(DataSet) - X_width - y_width):i += 1if i > c:breakj = i * gaptmp = DataSet.iloc[j:j + X_width,:].valuestmp = np.reshape(tmp,(1,X_width,b))X = np.concatenate([X,tmp],0)return Xelse: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)/gapy = 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 += 1if i > c:breakj = i * gap + X_widthtmp = DataSet.iloc[j:j + y_width,:].valuestmp = 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_widthout_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 += 1return 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_widthout_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)