【发布时间】:2021-07-12 12:37:43
【问题描述】:
由于某种原因,当我尝试将大量数据转换为正弦波时,它会失败并适合水平线。谁能解释一下?
最少的工作代码:
import numpy as np
import matplotlib.pyplot as plt
from scipy import optimize
# Seed the random number generator for reproducibility
import pandas
np.random.seed(0)
# Here it work as expected
# x_data = np.linspace(-5, 5, num=50)
# y_data = 2.9 * np.sin(1.05 * x_data + 2) + 250 + np.random.normal(size=50)
# With this data it breaks
x_data = np.linspace(0, 2500, num=2500)
y_data = -100 * np.sin(0.01 * x_data + 1) + 250 + np.random.normal(size=2500)
# And plot it
plt.figure(figsize=(6, 4))
plt.scatter(x_data, y_data)
def test_func(x, a, b, c, d):
return a * np.sin(b * x + c) + d
# Used to fit the correct function
# params, params_covariance = optimize.curve_fit(test_func, x_data, y_data)
# making some guesses
params, params_covariance = optimize.curve_fit(test_func, x_data, y_data,
p0=[-80, 3, 0, 260])
print(params)
plt.figure(figsize=(6, 4))
plt.scatter(x_data, y_data, label='Data')
plt.plot(x_data, test_func(x_data, *params),
label='Fitted function')
plt.legend(loc='best')
plt.show()
有谁知道,如何解决这个问题。我应该使用不同的拟合方法而不是最小二乘吗?还是应该减少数据点的数量?
【问题讨论】:
-
你试过
lmfit吗? lmfit.github.io/lmfit-py/… -
你的适合确实工作,你只需要更好的起始值来为你的数据集不适合。您注释掉的示例甚至根本没有初始值。
curve_fit是危险的错误并且(故意 - 是的,故意的!)误导您不提供初始值是合理的。它不是。初始值始终是必需的,它们应该是预期值的近似值,并为您正在建模的函数提供不平凡的结果。所以,简而言之:猜得更好。
标签: pandas numpy scipy curve-fitting scipy-optimize