python中的最小二乘法?

时间:2017-04-25 17:09:37

标签: python least-squares data-fitting

我有这些价值观:

T_values = (222, 284, 308.5, 333, 358, 411, 477, 518, 880, 1080, 1259) (x values)
C/(3Nk)_values = (0.1282, 0.2308, 0.2650, 0.3120 , 0.3547, 0.4530, 0.5556, 0.6154, 0.8932, 0.9103, 0.9316) (y values)

我知道他们遵循这个模式:

C/(3Nk)=(h*w/(k*T))**2*(exp(h*w/(k*T)))/(exp(h*w/(k*T)-1))**2

我也知道k=1.38*10**(-23)h=6.626*10**(-34)。 我必须找到最能描述测量数据的w。我想在python中使用最小二乘法来解决这个问题,但我真的不明白它是如何工作的。任何人都可以帮助我吗?

2 个答案:

答案 0 :(得分:4)

这个答案提供了使用Python来确定一般指数模式的拟合参数的演练。

数据清理

首先,让我们输入并将采样数据组织成numpy数组,这将有助于计算和清晰度。

import matplotlib.pyplot as plt
import scipy.optimize as opt
import numpy as np

#% matplotlib inline

# DATA ------------------------------------------------------------------------
T_values = np.array([222, 284, 308.5, 333, 358, 411, 477, 518, 880, 1080, 1259])
C_values = np.array([0.1282, 0.2308, 0.2650, 0.3120 , 0.3547, 0.4530, 0.5556, 0.6154, 0.8932, 0.9103, 0.9316])

x_samp = T_values
y_samp = C_values    

scipy和numpy中有许多curve fitting个函数,每个函数的使用方式不同,例如scipy.optimize.leastsqscipy.optimize.least_squares。为简单起见,我们将使用scipy.optimize.curve_fit,但如果没有选择合理的起始参数,很难找到优化的回归曲线。稍后将在选择起始参数时演示一种简单的技术。

评分

首先,尽管OP提供了一个预期拟合方程,但我们将通过回顾指数函数的一般方程来解决使用Python曲线拟合的问题:

enter image description here

现在我们构建这个通用函数,它将被使用几次:

# GENERAL EQUATION ------------------------------------------------------------
def func(x, A, c, d):
    return A*np.exp(c*x) + d

趋势:

  • 较小的A给出较小的幅度
  • 否定A在水平面上翻转曲线
  • 较小的c通过展平曲线的“膝盖”来控制形状
  • 否定c在垂直平面上翻转曲线
  • d设置y-intercept

选择初始参数

使用后面的趋势,让我们首先查看数据并尝试通过调整这些参数来模拟曲线。为了演示,我们举例说明了几个试验:

# SURVEY ----------------------------------------------------------------------
# Plotting Sampling Data
plt.plot(x_samp, y_samp, "ko", label="Data")

x_lin = np.linspace(0, x_samp.max(), 50)                   # 50 evenly spaced digits between 0 and max

# Trials
A, c, d = -1, -1e-2, 1
y_trial1 = func(x_lin,  A,     c, d)
y_trial2 = func(x_lin, -1, -1e-3, 1)
y_trial3 = func(x_lin, -1, -3e-3, 1)

plt.plot(x_lin, y_trial1, "--", label="Trial 1")
plt.plot(x_lin, y_trial2, "--", label="Trial 2")
plt.plot(x_lin, y_trial3, "--", label="Trial 3")
plt.legend()

enter image description here

从简单的试验和误差,我们可以更好地近似曲线的形状,方向,幅度和起点。例如,我们知道前两个参数(Ac)必须为负数。我们对c的数量级也有合理的猜测。

计算估计参数

我们现在将使用最佳试验的参数进行初步猜测:

# REGRESSION ------------------------------------------------------------------
p0 = [-1, -3e-3, 1]                                        # guessed params
w, _ = opt.curve_fit(func, x_samp, y_samp, p0=p0)     
print("Estimated Parameters", w)  

# Model
y_model = func(x_lin, *w)

# PLOT ------------------------------------------------------------------------
# Visualize data and fitted curves
plt.plot(x_samp, y_samp, "ko", label="Data")
plt.plot(x_lin, y_model, "k--", label="Fit")
plt.title("Least squares regression")
plt.legend(loc="upper left")

# Estimated Parameters [-1.66301087 -0.0026884   1.00995394]

enter image description here

这是如何工作的?

curve_fit是scipy提供的众多optimization functions之一。给定初始值,迭代地细化得到的估计参数,使得得到的曲线最小化残余误差,或拟合线和采样数据之间的差异。更好的猜测可以减少迭代次数并加快结果速度。通过拟合曲线的这些估计参数,现在可以计算特定方程的特定系数(留给OP的最终练习)。

答案 1 :(得分:1)

你想使用scipy

let cookieProperties: [HTTPCookiePropertyKey : Any] = [.name : "name",
                                                       .value : "value",
                                                       .domain : "www.example.com",
                                                       .originURL : "www.example.com",
                                                       .path : "/",
                                                       .version : "0",
                                                       .expires : Date().addingTimeInterval(2629743)
                                                      ]

if let cookie = HTTPCookie(properties: cookieProperties) {
    HTTPCookieStorage.shared.setCookie(cookie)
}