python 的几何均方根误差

geometric root mean squared error in python

给定两个向量 ftyt,如何在 python 中从头开始实施以下误差测量?:

示例数据:

ft=(2,3,4.5,6,4,3,2)
yt=(2.1,4.2,4.5,7,3,2,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)))

Edit 多说一点,您还可以将 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 解决此问题,即没有库,以供学习之用。干杯!