首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何为ML适当地构造输入数组

如何为ML适当地构造输入数组
EN

Stack Overflow用户
提问于 2020-03-06 17:05:56
回答 1查看 161关注 0票数 1

如果这个问题看起来很傻,我会提前道歉,但我想了解一个关于LSTM类型ML算法的机器掌握博客,更具体地说,是关于输入数据是如何被重塑的。在这个问题上,我没有太多的智慧,也没有一个CS学位。

在博客关于LSTM CNN部分的一半时间里,Jason谈到:

第一步是将输入序列分割成可以由CNN模型处理的子序列。例如,我们可以首先将单变量时间序列数据分解为输入/输出样本,其中四个步骤作为输入,一个步骤作为输出。然后,每个样本可以分成两个子样本,每个子样本有两个时间步骤。CNN可以解释两个时间步骤的每个子序列,并向LSTM模型提供子序列的解释作为输入。 我们可以将其参数化,并将子序列的数量定义为n_seq,将每个子序列的时间步数定义为n_steps。然后,可以对输入数据进行整形,使其具有所需的结构:

[samples, subsequences, timesteps, features]

我的问题是,这是否要求数据只被赋形为4 steps?或者可以更大些?下面的代码将尝试打印数组,我在git帐户上使用了我自己的数据示例这里

代码语言:javascript
复制
import pandas as pd
import numpy as np
# univariate data preparation
from numpy import array



df = pd.read_csv("trainData.csv")
df = df[['kW']].shift(-1)
df = df.dropna()
raw_seq = df.values.tolist()


# split a univariate sequence into samples
def split_sequence(sequence, n_steps):
    X, y = list(), list()
    for i in range(len(sequence)):
        # find the end of this pattern
        end_ix = i + n_steps
        # check if we are beyond the sequence
        if end_ix > len(sequence)-1:
            break
        # gather input and output parts of the pattern
        seq_x, seq_y = sequence[i:end_ix], sequence[end_ix]
        X.append(seq_x)
        y.append(seq_y)
    return array(X), array(y)

# define input sequence
#raw_seq = [10, 20, 30, 40, 50, 60, 70, 80, 90]
# choose a number of time steps
n_steps = 4
# split into samples
X, y = split_sequence(raw_seq, n_steps)
# reshape from [samples, timesteps] into [samples, subsequences, timesteps, features]
n_features = 1
n_seq = 2
n_steps = 2
X = X.reshape((X.shape[0], n_seq, n_steps, n_features))
# summarize the data
for i in range(len(X)):
    print(X[i], y[i])

上面的代码工作,但当我改变n_steps = 7 (从4),我得到这个形状错误。

代码语言:javascript
复制
  File "convArray.py", line 39, in <module>
    X = X.reshape((X.shape[0], n_seq, n_steps, n_features))
ValueError: cannot reshape array of size 2499 into shape (357,2,2,1)

我想尝试和使用7个时间步骤的原因是,我正在试验的数据是一个建筑物每天的电力需求单位,每周7天将是一个理想的实验时间步骤!

任何小费都非常感谢

EN

回答 1

Stack Overflow用户

发布于 2020-03-06 17:30:34

在这种情况下,错误中提到了这个问题。问题是,您正在尝试将数组重塑为特定的形状,但这是不可能的。数组X有2499个元素,2499不能重塑为(357,2,2,1)形状。形状中的数字的乘积是元素的整体数量。A (357,2,2,1)具有357*2*2*1=1428元素。因此,当n_steps = 2时,您的代码返回一个包含1428个元素的数组。我认为在您的示例中,它依赖于raw_seq,因为它的长度决定了split_sequence()内for循环运行的次数及其返回的数组。raw_seq取决于数据,因此对于这个数据集,n_steps可能是有限的。不过,我不能百分之百肯定。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60568604

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档