如果您具有基函数,例如10个高斯:
x = np.arange(50, dtype=float)
sigma = 20
centers = np.arange(10)*5
basis = np.exp(-(x[:, None]-centers)**2/sigma) # each column is a Gaussian
您想使用相同的基础来拟合大量数据,您可以将法线矩阵求逆,并且可以使用快速的dot
产品进行拟合
mat_inv = np.linalg.inv(basis.T.dot(basis))
mat_inv_x_basis = mat_inv.dot(basis.T)
mat_inv_x_basis
可以用于我的所有数据集。要获取最适合数据的basis
系数,
data = np.exp(-(x-25)**2/sigma*0.25) + np.random.normal(size=x.shape)*0.05
coeff = mat_inv_x_basis.dot(data)
以上coeff
可以是正负号。
如果我想获取非负系数,则必须使用sp.optimize.nnls
,它比dot
乘积慢30倍。除了nnls之外,是否有等同于反转法线矩阵的运算?
也就是说,如果我有我的基础(全部为非负数),是否可以将其转换为可用于快速计算非负数coeff
的东西?