我的目标是对一些衰变数据(NMR T2衰变通过CPMG)进行逆拉普拉斯变换。为此,我们得到了CONTIN算法。这个算法是adapted to Matlab by Iari-Gabriel Marino,它工作得很好。我想把这段代码改编成Python。问题的核心是scipy.optimize.fmin,它没有以任何类似于Matlab的fminsearch的方式最小化均方差(MSD)。后者的结果是一个很好的最小化,而前者没有
我已经用Python一行一行地阅读了我的改编代码,以及原始的Matlab。我检查了每一个矩阵和每一个输出。我用它来确定临界点在fmin。我也尝试了scipy.optimize.minimize和其他最小化算法,但是没有一个算法给出一点点令人满意的结果。你知道吗
我为Python和Matlab制作了两个MWE,以使其对所有人都具有可复制性。示例数据来自matlab函数的文档。抱歉,如果这是长代码,但我真的不知道如何缩短它不牺牲可读性和清晰度。我试着让线条尽可能地吻合。我在windows8.1上使用python3.7.3、scipyv1.3.0、numpy1.16.2、matlabr2018b。这是一个相对较新的Anaconda安装(<;2个月)。你知道吗
我的代码:import numpy as np
from scipy.optimize import fmin
import matplotlib.pyplot as plt
def msd(g, y, A, alpha, R, w, constraints):
""" msd: mean square deviation. This is the function to be minimized by fmin"""
if 'zero_at_extremes' in constraints:
g[0] = 0
g[-1] = 0
if 'g>0' in constraints:
g = np.abs(g)
r = np.diff(g, axis=0, n=2)
yfit = A @ g
# Sum of weighted square residuals
VAR = np.sum(w * (y - yfit) ** 2)
# Regularizor
REG = alpha ** 2 * np.sum((r - R @ g) ** 2)
# output to be minimized
return VAR + REG
# Objective: match this distribution