numpy 矩阵平方和
我有一个矩阵,行代表不同的观察(在不同的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)",
)
43
如果你把最后一个数组的所有数字加起来,那就是对的。不过这样做有点复杂,因为在计算的时候也用到了np.dot这个函数来处理非对角线的元素。其实更快的方法是:
ssq = np.sum(res**2)
如果你想要每个实验的ssd(平方和差),可以这样做:
ssq = np.sum(res**2, axis=1)