给定两个向量ft
和yt
,如何在python中从头开始实现以下错误度量?:
示例数据:
ft=(2,3,4.5,6,4,3,2)
yt=(2.1,4.2,4.5,7,3,2,2)
目标是制作一个使用以下功能:
grmse(ft,yt)
答案 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解决这个问题,即没有库,用于学习目的。干杯!