python中的几何均方根误差

时间:2018-02-01 15:11:42

标签: python forecasting

给定两个向量ftyt,如何在python中从头开始实现以下错误度量?:

enter image description here

示例数据:

ft=(2,3,4.5,6,4,3,2)
yt=(2.1,4.2,4.5,7,3,2,2)
  • 目标是制作一个使用以下功能:

    grmse(ft,yt)
    

1 个答案:

答案 0 :(得分:2)

我建议您使用numpy数组,这将是最简单的方法。将元组转换为数组或将它们存储为数组。 如果你减去numpy数组,它们将被逐元素地减去。平方也是如此(顺便说一下,在Python中,^2而不是**2)。然后,您将拥有一个包含所有(y_t - f_t)** 2的列表。从那里,你可以使用numpys产品将所有这些元素相互叠加,取得根源,你就完成了。

import numpy as np
def grmse(ft, yt):
    N = len(ft)
    prod = np.product( (ft-yt)**2 ) # do the product
    return prod**(1/(2*N))  # return the (2N)th root

if __name__ == '__main__':
    ft=np.array([2,3,4.5,6,4,3,2])
    yt=np.array([2.1,4.2,4.5,7,3,2,2])
    print(grmse(ft,yt)) 

从技术上讲,如果它不会让你感到困惑,你可以将其改为一行:

def grmse(ft, yt):
    return (np.product( (ft-yt)**2 ))**(1/(2*len(ft)))

编辑再说一点,你也可以将reduce与lambda表达式一起使用,这也可以在不转换它们的情况下使用列表。您可以压缩您的值(即创建元组列表(y_t,f_t)),然后执行列表推导以获得与之前相同的点。然后获取列表元素的乘积(使用reduce)。 Reduce将操作(即我们将要提供它的乘法)按顺序应用于列表的元素。

from functools import reduce
def grmse2(ft,yt):
    prod_terms = [(x-y)**2 for x,y in zip(ft,yt)]
    prod = reduce(lambda x, y: x * y, prod_terms, 1)
    N = len(ft)
    return prod**(1/(2*N))

或者再一次,在一行中(也许不这样做,它只是为了表明它是多么棒的python)

def grmse2(ft,yt):
    return (reduce(lambda x,y:x*y, [(x-y)**2 for x,y in zip(ft,yt)], 1))**(1/(2*len(ft)))

我建议你也尝试用基本的python解决这个问题,即没有库,用于学习目的。干杯!