看起来它只适合第一个参数。
当我尝试使用 curve_fit 示例生成曲线时,这一切都很好,但当我使用自己的数据时却不然。
这是我的原始数据: https: //pastebin.com/0hs2JVXL
为了简单起见,我将其转换为整数,因此这是我输入的数据curve_fit: https: //pastebin.com/2uP0iyTw
这是我试图拟合的曲线(基本上是具有比例值的对数正态分布的公式):
def func(x, k, s, u):
x=np.array(x)
return k * (1 / (x * s * np.sqrt(2*np.pi))) * np.exp( - np.power((np.log(x)-u),2) / (2*np.power(s , 2)))
Run Code Online (Sandbox Code Playgroud)
这就是我使用它的方式:
graphData.append(
{
'x': xdata,
'y': ydata,
'name': "data",
'mode': 'lines'
}
)
popt, pcov = curve_fit(func, xdata, ydata)
graphData.append(
{
'x': xdata,
'y': func(xdata, *popt),
'name': "" + "[Fit]",
'mode': 'lines'
}
)
Run Code Online (Sandbox Code Playgroud)
但这是我得到的输出数据: https: //pastebin.com/WjaTH9wQ
这些是它正在设置的参数:k=33.06185171 s= 1. u=1.
并可视化: …
我希望限制 optim() 的输出参数。对于我的正弦函数(其中“designL”是我的自变量,“ratio”是我的因变量数据,dfm 是我的数据帧),它不必要地收敛了数千个异相相位:
lo_0 = 2e-6
kc_0 = 80000
min.RSS <- function(data, par) {
with(data, sum( (sin(par[2] *(par[1] + designL))^2 - ratio)^2) )
}
resultt <- optim(par = c(lo_0, kc_0), min.RSS, data = dfm)
Run Code Online (Sandbox Code Playgroud)
我想从 0:2e-5 限制 lo_0(相移)。我找到了一些关于此的文档,但它没有详细说明如何实现:https : //ubuntuforums.org/showthread.php?t=1420061
我试图在 Excel 中但在 C# 中重现相同的曲线拟合(称为“趋势”):指数、线性、对数、多项式和幂。
我发现线性和多项式为:
Tuple<double, double> line = Fit.Line(xdata, ydata);
double[] poly2 = Fit.Polynomial(xdata, ydata, 2);
Run Code Online (Sandbox Code Playgroud)
我还发现了指数拟合。
但我想知道如何对 Power 进行曲线拟合。有人有主意吗?
我应该能够获得两个常量,如 Excel 屏幕截图公式中所示:
我试图采用此线程中提出的此解决方案来确定简单正态分布的参数。即使修改很小(基于维基百科),结果也很糟糕。有什么建议哪里出错了吗?
import math
import numpy as np
from scipy.optimize import minimize
import matplotlib.pyplot as plt
def gaussian(x, mu, sig):
return 1./(math.sqrt(2.*math.pi)*sig)*np.exp(-np.power((x - mu)/sig, 2.)/2)
def lik(parameters):
mu = parameters[0]
sigma = parameters[1]
n = len(x)
L = n/2.0 * np.log(2 * np.pi) + n/2.0 * math.log(sigma **2 ) + 1/(2*sigma**2) * sum([(x_ - mu)**2 for x_ in x ])
return L
mu0 = 10
sigma0 = 2
x = np.arange(1,20, 0.1)
y = gaussian(x, mu0, sigma0)
lik_model = …Run Code Online (Sandbox Code Playgroud) 我是编程工具和 Python 的新手,对数值计算知之甚少。我试图理解Curve_fit的源代码,但对我来说太难了。
如果我们立即曲线拟合非线性模型,通过计算 Hessian 矩阵,我想我们能够找到所有参数的临界点,无论是局部还是全局,以及最小值或最大值。
但是,如果包含模型的函数无法微分,curve_fit 实际如何计算答案?
我想象该算法是在所有数据点的每个参数的每个间隔中找到 Chi^2 的局部最小值。如果这样做,默认间隔是多大,参数的每次试验之间的距离是多少,最大迭代次数是多少?如果像我说的那样,这个迭代在多个参数之间是如何工作的?他们每次都作为一组单独尝试吗?
我想了解算法,以便我可以编写一个很好的函数来应用curve_fit。我试图适应的函数中存在许多脏修复,不同的错误出现在不同的小更改中,因此我无法将代码放在这里,因为我不知道问题所在。
另外,关于 sigma 输入,如果我不知道 y 错误,如果默认 sigma 与数据值相比太大,结果会怎样?或者,如果模型的灵活性对后期处理影响不大,或者 sigma 远小于数据到函数的距离,会发生什么?
我是 python 的新手,并试图使用以下代码来拟合数据集分布。实际数据是一个列表,包含两列——预测市场价格和实际市场价格。我试图使用,scipy.curve_fit()但它给了我在同一个地方绘制的许多线条。任何帮助表示赞赏。
# import the necessary modules and define a func.
from scipy.optimize import curve_fit
from matplotlib import pyplot as plt
def func(x, a, b, c):
return a * x** b + c
# my data
pred_data = [3.0,1.0,1.0,7.0,6.0,1.0,7.0,4.0,9.0,3.0,5.0,5.0,2.0,6.0,8.0]
actu_data =[ 3.84,1.55,1.15,7.56,6.64,1.09,7.12,4.17,9.45,3.12,5.37,5.65,1.92,6.27,7.63]
popt, pcov = curve_fit(func, pred_data, actu_data)
#adjusting y
yaj = func(pred_data, popt[0],popt[1], popt[2])
# plot the data
plt.plot(pred_data,actu_data, 'ro', label = 'Data')
plt.plot(pred_data,yaj,'b--', label = 'Best fit')
plt.legend()
plt.show()
Run Code Online (Sandbox Code Playgroud)
我正在尝试拟合具有多个吸收峰(M\xc3\xb6ssbauer 光谱)的洛伦兹函数,但 curve_fit 函数无法正常工作,仅拟合几个峰值。我怎样才能适应它?
\n\n\n\n下面我展示我的代码。请帮我。
\n\nimport numpy as np\nimport matplotlib.pyplot as plt\nfrom scipy.optimize import curve_fit\n\ndef mymodel_hema(x,a1,b1,c1,a2,b2,c2,a3,b3,c3,a4,b4,c4,a5,b5,c5,a6,b6,c6):\n f = 160000 - (c1*a1)/(c1+(x-b1)**2) - (c2*a2)/(c2+(x-b2)**2) - (c3*a3)/(c3+(x-b3)**2) - (c4*a4)/(c4+(x-b4)**2) - (c5*a5)/(c5+(x-b5)**2) - (c6*a6)/(c6+(x-b6)**2)\n return f\n\ndef main():\n abre = np.loadtxt(\'HEMAT_1.dat\')\n x = np.zeros(len(abre))\n y = np.zeros(len(abre))\n\n for i in range(len(abre)):\n x[i] = abre[i,0]\n y[i] = abre[i,1]\n\n popt,pcov = curve_fit(mymodel_hema, x, y,maxfev=1000000000)\nRun Code Online (Sandbox Code Playgroud)\n\n我的数据 --> https://drive.google.com/file/d/1LvCKNdv0oBza_TDwuyNwd29PgQv22VPA/view?usp=sharing
\n我\xe2\x80\x99m 仍在尝试用Python 编程。\n我第一次尝试使用直方图和拟合!
\n特别是,我有一个数据集,并制作了它的直方图。此时我应该进行瑞利拟合,但我无法找出正确设置参数的正确方法。我读到loc和scale,这应该是fit的参数,通常设置为0和1。显然,这样一来,fit\xe2\x80\x99就不能很好地工作了!有人可以帮助我吗?\n为了明确起见,我附上了我正在使用的代码。
\n谢谢。
\nimport os \nimport numpy as np\nimport nrrd\nimport nibabel as nib\nimport matplotlib.pyplot as plt\nimport matplotlib.image as mpimg\nimport SimpleITK as sitk\nimport scipy.stats\nfrom scipy.stats import rayleigh\nimport math\n\n\n#fit\n\n# Sample from this Random variable\nx0 = np.array(fondi)\n\n# Adjust Distribution parameters\nloc, scale = stats.rayleigh.fit(x0) # (9.990726961181025, \n4.9743913760956335)\n\n# Tabulate over sample range (PDF display):\nxl = np.linspace(x0.min(), x0.max())\n\n# Display Results:\nfig, axe = plt.subplots()\n\naxe.hist(x0,density=1, label="background")\n\naxe.plot(xl,stats.rayleigh(scale=scale, loc=loc).pdf(xl), label="Rayleigh")\naxe.set_title("Distribution Fit")\naxe.set_xlabel("Intensit\xc3\xa0")\n\naxe.legend()\naxe.grid()\nRun Code Online (Sandbox Code Playgroud)\n我的数据(fondi)是这样的:[13 15 13 14 12 13 12 14 15 12 11 10 11 …
我正在尝试使用以下函数来拟合我的数据:
我正在使用的数据如下:
X1:
0 1.0
1 101.0
2 201.0
3 301.0
4 401.0
5 501.0
6 601.0
7 701.0
8 801.0
9 901.0
10 1001.0
11 1101.0
12 1201.0
13 1301.0
14 1401.0
15 1501.0
16 1601.0
17 1701.0
18 1801.0
19 1901.0
Y1:
0 0.121159
1 0.195525
2 0.167305
3 0.125499
4 0.094138
5 0.071610
6 0.053848
7 0.039890
8 0.031099
9 0.023976
10 0.018271
11 0.013807
12 0.010596
13 0.008033
14 0.006710
15 0.005222
16 0.004299
17 0.003376 …Run Code Online (Sandbox Code Playgroud) 我试图将sin函数绘制到数据集.我使用scipy.optimize在线发现了一个教程,但即使我完全复制了代码,它似乎也无法工作.
在顶部:
def func(x, a, b, c, d):
return a * np.sin(b * (x + c)) + d
Run Code Online (Sandbox Code Playgroud)
在末尾:
scipy.optimize.curve_fit(func, clean_time, clean_rate)
pylab.show()
Run Code Online (Sandbox Code Playgroud)
输出窗口上没有行.
如果有人想要屏幕或全部代码,请随时在下面发表评论.
谢谢!
curve-fitting ×10
python ×8
scipy ×4
math ×2
matplotlib ×2
numpy ×2
c# ×1
function ×1
gaussian ×1
histogram ×1
optimization ×1
pow ×1
r ×1
regression ×1