我建议您为此使用 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 来解决这个问题,即没有库,用于学习目的。干杯!