numpy 矩阵平方和

22 投票
2 回答
84452 浏览
提问于 2025-04-18 13:43

我有一个矩阵,行代表不同的观察(在不同的pH值下的测量),列代表数据点(浓度随时间的变化)。所以每一行包含了一个pH值下的不同数据点。

我想要把一个常微分方程(ODE)拟合到这些数据上。因此,我定义了一个成本函数,并想计算所有观察值的平方和。对这个矩阵计算平方和的方式应该是这样的:

res = y - yhat                        # calculate residuals
ssq = np.diag(np.dot(res.T,res))      # sum over the diagonal

这样做对吗?

2 个回答

3

关于性能比较的后续,这里找到的最快的方法就是直接进行数学运算:

res[:, 0]**2 + res[:, 1]**2 + res[:, 2]**2

这里插入图片描述

import numpy as np
import perfplot

perfplot.live(
    setup=lambda n: np.random.randn(n, 3),
    kernels=[
        lambda a: a[:, 0]**2 + a[:, 1]**2 + a[:, 2]**2,
        lambda a: np.sum(a**2, axis=1),
        lambda a: np.sum(np.square(a), axis=1),
    ],
    labels=["a[:, 0]**2 + a[:, 1]**2 + a[:, 2]**2",
            "np.sum(a**2, axis=1)",
            "np.sum(np.square(a), axis=1)"],
    n_range=[2 ** k for k in range(25)],
    xlabel="len(a)",
)

特别感谢 https://github.com/nschloe/perfplot

43

如果你把最后一个数组的所有数字加起来,那就是对的。不过这样做有点复杂,因为在计算的时候也用到了np.dot这个函数来处理非对角线的元素。其实更快的方法是:

ssq = np.sum(res**2)

如果你想要每个实验的ssd(平方和差),可以这样做:

ssq = np.sum(res**2, axis=1)

撰写回答