numpy 形状为(5377,1)的不可广播输出操作数与广播形状(5377,15)不匹配

uemypmqf  于 2023-03-02  发布在  其他
关注(0)|答案(2)|浏览(173)

当我想通过使用inverse_transform转换回原始形式时,我得到了以下错误:

X_train = []
   y_train = []
for i in range(120, data_training.shape[0]):
 X_train.append(data_training[i-120:i])
 y_train.append(data_training[i,0])
X_train , y_train = np.array(X_train) , np.array(y_train)
X_train.shape , y_train.shape
((5377, 120, 15), (5377,))
train_pred=scaler.inverse_transform(train_pred)               #error
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-44-2819933dc538> in <module>()
      1 #Transformback to original form
----> 2 train_pred=scaler.inverse_transform(train_pred)

/usr/local/lib/python3.7/dist-packages/sklearn/preprocessing/_data.py in inverse_transform(self, X)
    434                         force_all_finite="allow-nan")
    435 
--> 436         X -= self.min_
    437         X /= self.scale_
    438         return X

ValueError: non-broadcastable output operand with shape (5377,1) doesn't match the broadcast shape (5377,15)

我刚开始接触人工智能,不明白这个错误意味着什么。
有人能解释一下它的意思和如何修复它吗?

rn0zuynd

rn0zuynd1#

这个错误告诉你NumPy不能对这两个数组执行元素级操作。
发生这种情况的原因是,如这里所述,NumPy使用了一组严格的规则:
1.如果两个数组的维数不同,则维数较少的数组的形状在其前导(左)侧用1填充。
1.如果两个数组的形状在任何维度上都不匹配,则在该维度上形状等于1的数组将被拉伸以匹配另一个形状。
1.如果在任何维度中,大小不一致且都不等于1,则会引发错误。
由于数组的形状是(5377,1)(5377,15)-它们属于第二类,因此第一个数组(维度为(5377,1))被拉伸以适合形状为(5377,15)的数组。
然后,如-=所示,尝试将其重新赋给形状为(5377,1)的对象,这会引发错误。
你可以做的是:
使用X = X - self.min_代替X -= self.min_

import numpy as np

X = np.random.randn(5377).reshape((5377,1))
min_ = np.random.randn(5377*15).reshape((5377,15))

X = X - min_
X

或者,如果X应保持初始形状(5377, 1),则可以对列求和:

import numpy as np

X = np.random.randn(5377).reshape((5377,1))
min_ = np.random.randn(5377*15).reshape((5377,15))

X = (X - min_).sum(axis=1)
X

但是你应该从你所使用的算法的Angular 来考虑这个结果是否符合你的需要。
干杯

bfnvny8b

bfnvny8b2#

这个train_pred必须与你在其上拟合定标器的数据集具有相同的形状。要做inverse_transform,你可以从你的定标器中提取所需的属性,并将它们应用到你的预测中。

mm_scaler = MinMaxScaler()
df_scaled = mm_scaler.fit_transform(df)
#you do you data split and modeling ...

# inverse transform your prediction
mm_scaler_pred = MinMaxScaler()
mm_scaler_pred.min_, mm_scaler_pred.scale_ = mm_scaler.min_[1], mm_scaler.scale_[1]

prediction = mm_scaler_pred.inverse_transform(y_pred)

Here你有一个解释得很好的解决方案。

相关问题