一维数据插值以改善拟合效果

对于曲线拟合,如果数据点太少,可能导致拟合效果糟糕。所以有时候需要一维插值。

Pasted-image-20240905153144.png-c037aa7268.png

我就遇到过这种情况,如上图所示,原始数据中采样数太少,然后还想做双峰拟合,结果啥也不是。线性插值之后,双峰拟合的效果好了一点,但还是不理想。因为这两个峰的两侧基线可能相差较大而且数据点比较少,所以我又增加了侧翼,这才拿到比较好的拟合效果。

单峰拟合与双峰拟合详见其它博客:

高斯拟合计算成像分辨率

这里简单展示如何对高斯分布的曲线进行拟合以计算成像分辨率。 由于中心极限定理,我们采集到的数据经常呈现正态分布(也叫高斯分布)。成像数据中,有时我们需要评估成像的分辨率。一个比较直接简单的做法,是找到单个光斑进行划线测量,或者是对线性结构(如细胞微管)的进行垂直划线测量。 中心极限定理说的啥?它说样...

高斯双峰拟合

这里展示如何使用curve fit进行高斯双峰拟合。 其实双峰或者多峰拟合的思路非常简单,就是把单个 gaussian 函数加起来,形成一个新的函数,再使用 curve fit 进行拟合。比较繁琐的是,参数数量倍增。 然后一个很容易理解的情况是,参数越多,拟合难度越大。因此可以在 curve fit...

同样是image j line profile csv 读取的数据表作为输入,插值函数如下:

from scipy.interpolate import interp1d
import pandas as pd
def interp(c:pd.DataFrame, n=300):
'''
c: 读取的imagej中划线测量的profile数据,包含distance和value两列
n: 插值后的数据点数量
'''
x = c.distance.values
y = c.value.values
f = interp1d(x, y)
x2 = np.linspace(x.min(), x.max(), n)
y2 = f(x2)
return x2, y2

然后增加两侧数据点,其实就是拉长水平线。但这个步骤慎重使用,纯粹是为了提高拟合效果拿到更准确的参数,所以这个函数复用性不大,仅作记录。

def add_flank(x2, y2, left_bound=-0.2, left_n=50, right_bound=2, right_n=50):
# 注意这个 flanking 还不能增加太多,稍微多出来一点就行,不然也很影响
x4 = np.linspace(left_bound, x2.min(), left_n)
x5 = np.linspace(x.max(), right_bound, right_n)
xx = np.hstack((x4, x2, x5))
yy = np.hstack((np.ones((left_n,))*y2[0], y2, np.ones((right_n,))*y2[-1]))
return xx, yy