11

我在尝试使用 NumPy 计算 IPython 中的均方根误差时遇到问题。我很确定这个函数是正确的,但是当我尝试输入值时,它给了我以下 TypeError 消息:

TypeError: unsupported operand type(s) for -: 'tuple' and 'tuple'

这是我的代码:

import numpy as np

def rmse(predictions, targets):
    return np.sqrt(((predictions - targets) ** 2).mean())

print rmse((2,2,3),(0,2,6))

显然我的输入有问题。我需要先建立阵列,然后再将其放入rmse():行中吗?

4

4 回答 4

37

在 rmse 函数中,尝试:

return np.sqrt(np.mean((predictions-targets)**2))
于 2014-09-27T07:18:28.710 回答
7

它说没有为元组定义减法。

尝试

print rmse(np.array([2,2,3]), np.array([0,2,6]))

反而。

于 2014-02-21T08:03:44.980 回答
2

根据Google 公式,RMSD 或 RSME 是根据测量数据和每次测量的预测数据或地面实况数据计算得出的。

在此处输入图像描述

RMSD      = root-mean-square deviation (error)
i         = variable i
N         = number of non-missing data points
x_i       = actual observations time series
\hat{x}_i = estimated time series

这是它使用快速范数函数的 numpy 实现:

rmse = np.linalg.norm(measured - truth) / np.sqrt(len(thruth))

measured并且truth必须具有相同的形状。

于 2021-02-03T21:30:18.697 回答
0

正如@miladiouss 所提到的,np.linalg.norm(y1 - y2) / np.sqrt(len(y1))对于纯 numpy 来说是最快的。

但是,如果你也使用numba,那不再是最快的了。使用小型时间序列数据(大约 8 个数据点)进行基准测试。

import numba
import numpy as np

@jit(nopython=True)
def rmse(y1, y2):
    return np.sqrt(((y1-y2)**2).mean())
# 851 ns ± 1.05 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)

@jit(nopython=True)
def rmse_norm(y1, y2):
    return np.linalg.norm(y1 - y2) / np.sqrt(len(y1))
# 1.17 µs ± 3.44 ns per loop (mean ± std. dev. of 7 runs, 1000000 loops each)
于 2022-02-22T14:27:47.813 回答