首先,我创建了一个jupyter notebook来正确显示代码。 Please take a look。
其次,我使用线性最小二乘拟合而不是非线性最小二乘拟合速度。我试图解决的问题涉及在电子显微镜的光谱图像上拟合大量的高斯,我们当前的nlls算法很慢。它需要在边界内拟合,这就是我们不使用numpy.linalg.lstsq
我正在尝试使用scipy.optimize.lsq_linear
将两个高斯分量(g1
和g2
)与固定的sigma和中心分量简单拟合到一个2D数组{{1这是两位高斯的不同混音的列表。
首先,定义高斯:
G
然后创建组件:
def gaussian(x, mu, sig):
return np.exp(-np.power(x - mu, 2.) / (2 * np.power(sig, 2.)))
然后通过混合组件创建两组数据:
x = np.linspace(-3, 3, 100)
g1 = gaussian(x, -0.5, 0.5)
g2 = gaussian(x, 0.5, 0.5)
我进行了堆栈的转置,因为G1 = 5*g1 + 8*g2
G2 = 2*g1 + 2*g2
G = np.stack([G1,G2]).T
函数要求数据的形状为lsq_linear
,其中(m, n)
是要适合的组件的形状。
我通过
逐个调整组件(m,)
,它应该为documentation中g1_res = lsq_linear(G, g1)
g2_res = lsq_linear(G, g2)
中每个混音的组件提供权重。
将权重与组件相乘会返回:
g1_res["x"]
但是,合适(第一次混合如下所示)不正确。有人能帮我弄清楚我做错了吗?
g1_fit = [g1*fit for fit in g1_res["x"]]
g2_fit = [g2*fit for fit in g2_res["x"]]
答案 0 :(得分:0)
你混淆了什么。您使用1个组件拟合所有测量的光谱。相反,您希望使用两个组件来拟合每个光谱。因此,需要交换的东西:
g = np.stack([g1,g2]).T
g1_res = lsq_linear(g, G1)
g2_res = lsq_linear(g, G2)
g1_res["x"]
# --> array([ 5., 8.])
g2_res["x"]
# --> array([ 2., 2.])
顺便说一句,如果你有很多光谱,高斯的形状参数(这里给出[+ -0.5,0.5])总是相同但不知道或形状相同但理想情况下甚至不对应对于高斯,那么你可能想尝试主成分分析。 已有Python包。