1200字范文,内容丰富有趣,写作的好帮手!
1200字范文 > 非线性最小二乘法 python_Python:具有非线性最小二乘法的双曲线高斯拟合

非线性最小二乘法 python_Python:具有非线性最小二乘法的双曲线高斯拟合

时间:2023-06-09 14:46:41

相关推荐

非线性最小二乘法 python_Python:具有非线性最小二乘法的双曲线高斯拟合

这个代码适用于我,只要你只适合两个高斯分布的组合的函数.

我刚刚做出了一个残差函数,增加了两个高斯函数,然后从真实数据中减去它们.

我传递给Numpy最小二乘函数的参数(p)包括:第一个高斯函数(m)的平均值,与第一和第二高斯函数(dm,即水平移位)的平均值,标准偏差的第一(sd1)和第二(sd2)的标准偏差.

import numpy as np

from scipy.optimize import leastsq

import matplotlib.pyplot as plt

######################################

# Setting up test data

def norm(x, mean, sd):

norm = []

for i in range(x.size):

norm += [1.0/(sd*np.sqrt(2*np.pi))*np.exp(-(x[i] - mean)**2/(2*sd**2))]

return np.array(norm)

mean1, mean2 = 0, -2

std1, std2 = 0.5, 1

x = np.linspace(-20, 20, 500)

y_real = norm(x, mean1, std1) + norm(x, mean2, std2)

######################################

# Solving

m, dm, sd1, sd2 = [5, 10, 1, 1]

p = [m, dm, sd1, sd2] # Initial guesses for leastsq

y_init = norm(x, m, sd1) + norm(x, m + dm, sd2) # For final comparison plot

def res(p, y, x):

m, dm, sd1, sd2 = p

m1 = m

m2 = m1 + dm

y_fit = norm(x, m1, sd1) + norm(x, m2, sd2)

err = y - y_fit

return err

plsq = leastsq(res, p, args = (y_real, x))

y_est = norm(x, plsq[0][0], plsq[0][2]) + norm(x, plsq[0][0] + plsq[0][1], plsq[0][3])

plt.plot(x, y_real, label='Real Data')

plt.plot(x, y_init, 'r.', label='Starting Guess')

plt.plot(x, y_est, 'g.', label='Fitted')

plt.legend()

plt.show()

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。