我試圖擬合二維高斯到一些灰度圖像數據,這是由一個二維數組給出的。 lmfit庫實現了一個易於使用的Model類,它應該能夠做到這一點。 不幸的是,文檔(http://lmfit.github.io/lmfit-py/model.html)只提供了一維擬合的例子。對於我的情況,我簡單地用兩個獨立變量構造lmfit模型。Python lmfit:擬合2D模型
下面的代碼似乎對我有效,但會導致scipy拋出「minpack.error:函數調用的結果不是一個適當的浮點數組。
Tom總結:如何將2D(x1,x2) - >(y)數據輸入到lmfit模型。
以下是我的方法: 所有內容都包含在GaussianFit2D類中,但以下是重要部分: 這就是高斯函數。文檔說有關用戶定義的函數
Of course, the model function will have to return an array that will be the same size as the data being modeled. Generally this is handled by also specifying one or more independent variables.
我真的不明白這是什麼意思應該,因爲對於給定的值X1,X2的唯一合理的結果是標量值。
def _function(self, x1, x2, amp, wid, cen1, cen2):
val = (amp/(np.sqrt(2*np.pi)*wid)) * np.exp(-((x1-cen1)**2+(x2-cen2)**2)/(2*wid**2))
return val
這裏生成的模型:
def _buildModel(self, **kwargs):
model = lmfit.Model(self._function, independent_vars=["x1", "x2"],
param_names=["amp", "wid", "cen1", "cen2"])
return model
這是獲取數據的功能,構建模型,而params,並呼籲lmfit符合():終於在這裏
def fit(self, data, freeX, **kwargs):
freeX = np.asarray(freeX, float)
model = self._buildModel(**kwargs)
params = self._generateModelParams(model, **kwargs)
model.fit(data, x1=freeX[0], x2=freeX[1], params=params)
ANF這個適合的功能被稱爲:
data = np.asarray(img, float)
gaussFit = GaussianFit2D()
x1 = np.arange(len(img[0, :]))
x2 = np.arange(len(img[:, 0]))
fit = gaussFit.fit(data, [x1, x2])
你需要'lmfit',或其他工具('curve_fit'或SciPy的'leastsq')也未嘗不可? – Evert 2014-10-22 07:57:01
lmfit很迷人,因爲它很容易爲參數,約束等添加初始值......如果我不管理它,那麼scipy可能是第二次嘗試。 – m0e 2014-10-23 06:52:19