Python中的均方误差

8

我正在尝试编写一个函数,用于计算y(真实值)和y_pred(预测值)之间的均方误差,而不使用sklearn或其他实现。

我将尝试以下内容:

def mserror(y, y_pred):
    i=0
    for i in range (len(y)):
        i+=1
        mse = ((y - y_pred) ** 2).mean(y)   
        return mse

请问您能否纠正我在计算上的错误并告诉我如何修复它?


1
在我看来,i+=1 看起来不对,因为你已经有了一个名为 i 的迭代器。 - Divakar
1
你在循环内部也进行了返回,因此你只执行了一次迭代并返回。你总是会在每次迭代中替换mse的值。另外,我不知道你想用那个i做什么。你将其初始化为0,然后递增它,但是你在for循环中使用i作为迭代器。请仔细检查你的代码。 - idjaw
这个问题是一个重复的问题:https://dev59.com/5mQm5IYBdhLWcg3w-S6Y - Eric Leschinski
4个回答

21

你无缘无故地修改了索引。for循环会自动增加它。此外,你没有使用索引,例如,你没有使用任何y[i] - y_pred[i],因此根本不需要循环。

请使用数组

mse = np.mean((y - y_pred)**2)

y 的类型是什么,它是一个 ndarray 吗?与使用 numpy.subtract 有什么不同? - insanely_sin

2

我会说:

def get_mse(y, y_pred):
d1 = y - y_pred
mse = (1/N)*d1.dot(d1) # N is int(len(y))
return mse

只有当 y 和 y_pred 是 numpy 数组时才能正常工作, 但只要您决定不使用其他库,您就希望它们成为 numpy 数组,以便可以对其进行数学运算。

numpy dot() 函数是 2 个 numpy 数组的点积 (您也可以编写 np.dot(d1, d1))


-2
首先,您正在重复使用i并对其进行递增,但在范围内,它会自动迭代到下一个数字。因此,请勿再使用i。另一件事是,您正在取y的平均值,但不是取这个的平均值,而是取((y-y_pred) ** 2)的平均值。我希望您明白了我的意思。

-2

以下是在Python中实现均方误差(MSE)的方法:

def mse_metric(actual, predicted):
    sum_error = 0.0
    # loop over all values
    for i in range(len(actual)):
        # the error is the sum of (actual - prediction)^2
        prediction_error =  actual[i] - predicted[i]
        sum_error += (prediction_error ** 2)
    # now normalize
    mean_error = sum_error / float(len(actual))
    return (mean_error)

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接