- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我想弄清楚我在这里不明白的是什么。
我正在关注 http://www.scipy.org/Cookbook/FittingData并试图拟合正弦波。真正的问题是卫星磁力计数据,它在旋转的航天器上产生了一个很好的正弦波。我创建了一个数据集,然后尝试对其进行拟合以恢复输入。
这是我的代码:
import numpy as np
from scipy import optimize
from scipy.optimize import curve_fit, leastsq
import matplotlib.pyplot as plt
class Parameter:
def __init__(self, value):
self.value = value
def set(self, value):
self.value = value
def __call__(self):
return self.value
def fit(function, parameters, y, x = None):
def f(params):
i = 0
for p in parameters:
p.set(params[i])
i += 1
return y - function(x)
if x is None: x = np.arange(y.shape[0])
p = [param() for param in parameters]
return optimize.leastsq(f, p, full_output=True, ftol=1e-6, xtol=1e-6)
# generate a perfect data set (my real data have tiny error)
def mysine(x, a1, a2, a3):
return a1 * np.sin(a2 * x + a3)
xReal = np.arange(500)/10.
a1 = 200.
a2 = 2*np.pi/10.5 # omega, 10.5 is the period
a3 = np.deg2rad(10.) # 10 degree phase offset
yReal = mysine(xReal, a1, a2, a3)
# plot the real data
plt.figure(figsize=(15,5))
plt.plot(xReal, yReal, 'r', label='Real Values')
# giving initial parameters
amplitude = Parameter(175.)
frequency = Parameter(2*np.pi/8.)
phase = Parameter(0.0)
# define your function:
def f(x): return amplitude() * np.sin(frequency() * x + phase())
# fit! (given that data is an array with the data to fit)
out = fit(f, [amplitude, frequency, phase], yReal, xReal)
period = 2*np.pi/frequency()
print amplitude(), period, np.rad2deg(phase())
xx = np.linspace(0, np.max(xReal), 50)
plt.plot( xx, f(xx) , label='fit')
plt.legend(shadow=True, fancybox=True)
这使得这个情节:
[44.2434221897 8.094832581 -61.6204033699]
的恢复拟合参数与我开始时的参数完全不同。
对我不理解或做错的事情有什么想法吗?
scipy.__version__
'0.10.1'
编辑:建议固定一个参数。在上面的示例中,将振幅固定为 np.histogram(yReal)[1][-1]
仍然会产生 Not Acceptable 输出。拟合:[175.0 8.31681375217 6.0]
我应该尝试不同的拟合方法吗?有什么建议?
最佳答案
这里是一些实现 Zhenya 想法的代码。它使用
yhat = fftpack.rfft(yReal)
idx = (yhat**2).argmax()
freqs = fftpack.rfftfreq(N, d = (xReal[1]-xReal[0])/(2*pi))
frequency = freqs[idx]
猜测数据的主要频率,以及
amplitude = yReal.max()
猜测振幅。
import numpy as np
import scipy.optimize as optimize
import scipy.fftpack as fftpack
import matplotlib.pyplot as plt
pi = np.pi
plt.figure(figsize = (15, 5))
# generate a perfect data set (my real data have tiny error)
def mysine(x, a1, a2, a3):
return a1 * np.sin(a2 * x + a3)
N = 5000
xmax = 10
xReal = np.linspace(0, xmax, N)
a1 = 200.
a2 = 2*pi/10.5 # omega, 10.5 is the period
a3 = np.deg2rad(10.) # 10 degree phase offset
print(a1, a2, a3)
yReal = mysine(xReal, a1, a2, a3) + 0.2*np.random.normal(size=len(xReal))
yhat = fftpack.rfft(yReal)
idx = (yhat**2).argmax()
freqs = fftpack.rfftfreq(N, d = (xReal[1]-xReal[0])/(2*pi))
frequency = freqs[idx]
amplitude = yReal.max()
guess = [amplitude, frequency, 0.]
print(guess)
(amplitude, frequency, phase), pcov = optimize.curve_fit(
mysine, xReal, yReal, guess)
period = 2*pi/frequency
print(amplitude, frequency, phase)
xx = xReal
yy = mysine(xx, amplitude, frequency, phase)
# plot the real data
plt.plot(xReal, yReal, 'r', label = 'Real Values')
plt.plot(xx, yy , label = 'fit')
plt.legend(shadow = True, fancybox = True)
plt.show()
产量
(200.0, 0.5983986006837702, 0.17453292519943295) # (a1, a2, a3)
[199.61981404516041, 0.61575216010359946, 0.0] # guess
(200.06145097308041, 0.59841420869261097, 0.17487141943703263) # fitted parameters
请注意,通过使用 fft,对频率的猜测已经非常接近最终拟合参数。
看来您不需要修复任何参数。通过使频率猜测更接近实际值,optimize.curve_fit
能够收敛到一个合理的答案。
关于python - SciPy leastsq 适合正弦波失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13405053/
我正在使用 SciPy 的 LeastSq 将实验谱拟合到理论期望。当然存在与实验值相关的误差。我如何将这些输入到 LeastSq 或者我是否需要不同的例程?我在文档中找不到任何内容。 最佳答案 sc
我正在研究一个图像分析程序,我已经缩小了我的瓶颈,尝试多次将 2D 高斯拟合到一个小窗口 (20x20) 像素。 90% 的执行时间花在这段代码上。 我正在使用 scipy cookbook 中给出的
我想弄清楚我在这里不明白的是什么。 我正在关注 http://www.scipy.org/Cookbook/FittingData并试图拟合正弦波。真正的问题是卫星磁力计数据,它在旋转的航天器上产生了
我有一个数据表面,我正在使用 SciPy 的 leastsq 函数进行拟合。 我想在 leastsq 返回后对拟合质量进行一些估计。我原以为这会作为函数的返回值包含在内,但如果是这样,似乎没有明确记录
我正在尝试使函数适合我的数据。我有两个不同的轴,x 轴:高度,y 轴:体重。通过目视检查,我可以看到它或多或少给出了在权重 = 10 附近饱和的平方根函数的形状。这是我正在做的: from scipy
我想了解如何设置 python scipy 最小化问题。这是我从 Excel Solver 问题中获取的示例。解释该问题的最简单方法是尝试求解一个非常简单的电网: R1: 100 R2: 1000 R
有谁知道scipy.optimize.leastsq中具体实现了哪种优化算法? 最佳答案 根据 the documentation : “leastsq” is a wrapper around MI
我想用参数 (mu=1, sig=2, height=1) 和传递初始参数 x0 = (0.8, 0.8, 0.9)。 我想知道优化器如何知道参数的顺序。我本可以采用 (mu,height,sig)
基于 https://stackoverflow.com/a/10552563/8235309 ,我正在尝试并行执行 scipy.optimize.leastsq。 xx,yy,zz 是 3D 云点的
除了最后一行,一切正常。我的目标是通过卡方检验计算最佳拟合。 leastsq函数的应用有问题。z,d 和 d_err 是相同长度的数组,给定(实验数据)。 def df(z,omega_m,omega
SciPy 关于 LeastSq 的文档是 here .它指出 ier 是 An integer flag. If it is equal to 1, 2, 3 or 4, the solution
我正在尝试让我的雅可比行列式与 SciPy 的优化库的 leastsq 函数一起工作。 我有以下代码: #!/usr/bin/python import scipy import numpy from
我想将洛伦兹峰拟合到一组数据 x 和 y,数据很好。 OriginLab 等其他程序非常适合它,但我想使用 python 自动进行拟合,所以我有以下基于 http://mesa.ac.nz/?page
如何在 python 中计算最小二乘拟合 (scipy.optimize.leastsq) 的置信区间? 最佳答案 我会使用自举方法。 看这里:http://phe.rockefeller.edu/L
我正在 scipy/numpy 中寻找一个优化例程,它可以解决非线性最小二乘类型问题(例如,将参数函数拟合到大型数据集),但包括边界和约束(例如,最小值和最大值)待优化参数)。目前我正在使用 mpfi
我有两个函数和一组数据。这两个函数具有相同的 x 数据和相同的参数。我想通过最适合我的数据的最小二乘法获得参数。 参数为:ex,ey,ez。 X数据为:RA,DE(比如3000点) Y数据为:dRA,
我正在使用 optimize.leastsq 来拟合数据。我想将拟合参数限制在一定范围内。使用 optimize.leastsq 时是否可以定义边界?边界在 optimize.fmin_slsqp 中
自从我参加了 Python 讲座后,我想用它来拟合我的数据。虽然我现在已经尝试了一段时间,但我仍然不知道为什么这不起作用。 我想做什么 从子文件夹(此处称为“测试”)中取出一个又一个数据文件,稍微转换
我可以从 scipy.optimize.leastsq 模块获取 RMSE 的值吗? 最佳答案 这是一个使用 leastsq 的小例子: import numpy as np import scipy
我试图解决一个小玩具问题 import numpy as np import scipy.optimize as opt def f(a): return np.array([a+.2,a-.
我是一名优秀的程序员,十分优秀!