滑动窗口sliding_window

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)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值