标签: curve-fitting

Matlab:如何解决曲线拟合问题

我尝试使用函数lsqcurvefit来查找Bass Diffusion Model的 p和q参数.

起初我用以下方式编写了Bass函数:

function F = Bass(x, cummulativeAdoptersBefore)
m = 1500000;

F = x(1)*m + (x(2)-x(1))*cummulativeAdoptersBefore + x(2)/m*cummulativeAdoptersBefore.^2;
end
Run Code Online (Sandbox Code Playgroud)

x(1)= p x(2)= q

然后是FitBass:

function [ x, resnorm ] = FitBass(priorCumulativeAdopters, currentAdoptersCount)

    xData = priorCumulativeAdopters;
yData = currentAdoptersCount;
x0 = [0.08; 0.41];
[x, resnorm] = lsqcurvefit(@Bass, x0, xData, yData);
end
Run Code Online (Sandbox Code Playgroud)

但相比的结果F =贝斯(X,cummulativeAdoptersBefore),其中x是匹配的参数的向量和YDATA这是实际数据的情况下,我注意到,F(下部曲线 - X〜1)甚至不类似于YDATA:

在这种情况下(以及一般情况下),anayone是否知道这里可能存在什么问题或如何找到参数x以获得满意的拟合?

谢谢!

在此输入图像描述

matlab curve-fitting

0
推荐指数
1
解决办法
1158
查看次数

最小二乘拟合正弦幂级数

我正在尝试适合形式的功能:

在此输入图像描述

其中A和B是固定常数.在scipy中,我通常(我认为合理规范)解决此类问题的方法如下:

def func(t, coefs):
    phase = np.poly1d(coefs)(t)
    return A * np.cos(phase) + B

def fit(time, data, guess_coefs): 
    residuals = lambda p: func(time, p) - data
    fit_coefs = scipy.optimize.leastsq(residuals, guess_coefs) 
    return fit_coefs
Run Code Online (Sandbox Code Playgroud)

这项工作正常,但我想提供一个分析雅可比行列式来改善收敛性.从而:

def jacobian(t, coefs):
    phase = np.poly1d(coefs, t)
    the_jacobian = []
    for i in np.arange(len(coefs)):
        the_jac.append(-A*np.sin(phase)*(t**i))
    return the_jac

def fit(time, data, guess_coefs):
    residuals = lambda p: func(time, p) - data
    jac = lambda p: jacobian(time, p)
    fit_coefs = scipy.optimize.leastsq(residuals, guess_coefs, 
                                       Dfun=jac, col_deriv=True)
Run Code Online (Sandbox Code Playgroud)

即使订单为2或更低,这也不会起作用.使用optimize.check_gradient()快速检查也不会产生积极的结果.

我几乎可以肯定Jacobian和代码是正确的(虽然请纠正我)并且问题更为基础:雅各比派中的t**i术语会导致溢出错误.这在函数本身中不是问题,因为这里单项式项乘以它们非常小的系数.

我的问题是:

  1. 我上面做了什么,代码有什么不对吗?
  2. 还是有其他问题吗?
  3. 如果我的假设是正确的,有没有办法预处理拟合函数,那么雅可比行为更好?也许我可以适应数据和时间的对数,或者其他东西. …

python numpy mathematical-optimization curve-fitting scipy

0
推荐指数
1
解决办法
251
查看次数

function() 需要 4 个位置参数,但 Python 3.5 中的 5 个是 given_def 函数

我正在尝试从我的数据中拟合指数函数。我对将数学函数拟合到我的数据还不是很有经验。下面是我现在的代码。

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

my_x = (4,10,12,14,16,18,20,22,24,26,28,30,32,34,36,38,40)
my_y = (0.022172333,0.020881,0.017729,0.021641333,0.02479,0.030755667,0.037235,0.048389,0.068451,0.06898974,0.161409,0.242802333,0.316012667,0.440762333,0.569118333,0.7016839,0.832527333)

def myfunc(x,a,b,c):
    return a*np.exp(b*x)+c


p=[my_x,0.0045,0.1262,0] #pre-determined a=0.0045, b=0.1262, c=0 according to excel
popt, pcov = curve_fit(myfunc,my_x,my_y, p0=p)


plt.plot (my_x,myfunc(my_x, *popt))
Run Code Online (Sandbox Code Playgroud)

我得到的错误消息如下。

return function(xdata, *params) - ydata

TypeError: myfunc() takes 4 positional arguments but 5 were given
Run Code Online (Sandbox Code Playgroud)

我认为我不太明白这个错误信息在说什么。谁能帮助我了解导致此错误的原因以及如何改进我的代码?

python function curve-fitting exponential python-3.x

0
推荐指数
1
解决办法
2711
查看次数

将两个高斯拟合在较少表达的双峰数据上

我试图在双峰分布数据上拟合两个高斯,但大多数优化器总是根据开始猜测给出错误的结果,如下所示

我也尝试GMMscikit-learn,这并没有太大的帮助.我想知道我可能做错了什么以及什么是更好的方法,以便我们可以测试和拟合双峰数据.使用curve_fit数据的示例代码之一如下

import numpy as np
import matplotlib.pyplot as plt
from scipy.optimize import curve_fit

def gauss(x,mu,sigma,A):
    return A*np.exp(-(x-mu)**2/2/sigma**2)

def bimodal(x,mu1,sigma1,A1,mu2,sigma2,A2):
    return gauss(x,mu1,sigma1,A1)+gauss(x,mu2,sigma2,A2)

def rmse(p0):
    mu1,sigma1,A1,mu2,sigma2,A2 =p0
    y_sim = bimodal(x,mu1,sigma1,A1,mu2,sigma2,A2)
    rms = np.sqrt((y-y_sim)**2/len(y))

data = pd.read_csv('data.csv')
x, y = data.index, data['24hr'].values

expected=(400,720,500,700,774,150)

params,cov=curve_fit(bimodal,x,y,expected, maxfev=100000)
sigma=np.sqrt(np.diag(cov))
plt.plot(x,bimodal(x,*params),color='red',lw=3,label='model')
plt.plot(x,y,label='data')
plt.legend()
print(params,'\n',sigma)
Run Code Online (Sandbox Code Playgroud)

python curve-fitting scipy python-3.x scikit-learn

0
推荐指数
1
解决办法
1087
查看次数

球坐标中的插值曲线

我有点,属于3D空间中的一些非参数曲线.我需要在球坐标中工作并在给定azimuthelevation值中插入给定的曲线.

你能用这种插值算法帮助我吗?

PS我不确定,从我在1D空间中绘制的一维曲线的问题想法是明确的.所以,以防下面的代码创建这样的,但参数化.

x=linspace(-2*pi,2*pi,10^3);
y=sin(x);
z=sinh(x);
Run Code Online (Sandbox Code Playgroud)

更新:

感谢@jodag关于上采样的非常好的帖子.slerp是完美的!然而,我的问题是不同的,或者我不明白如何使用上采样来解决它.假设我将我的点定义为数组(只是一些虚拟数据用于演示):

x_given = rand(9, 1) - 0.5; 
y_given = rand(9, 1) - 0.5; 
z_given = rand(9, 1) - 0.5; 
x_given(end+1) = x_given(1); % should work for closed curves
y_given(end+1) = y_given(1); % should work for closed curves
z_given(end+1) = x_given(1); % should work for closed curves
Run Code Online (Sandbox Code Playgroud)

我想找到x_i, y_i, z_i给定的所有点()elevation_qazimuth_q:

elevation_q = pi./4;
azimuth_q = pi./7;
[x_i, y_i ,z_i] …
Run Code Online (Sandbox Code Playgroud)

3d matlab interpolation curve-fitting

0
推荐指数
1
解决办法
545
查看次数

在Matlab中查找轮廓的坐标

我想这不是困难但我想知道是否有任何功能或任何最佳方式.

考虑到在图像处理之后我有一个矩阵图像,其中0到处都是1,在轮廓处有1.

现在我想沿着该轮廓线找到xy
重要的是例如 [x(2)y(2)] 应该是[x(1)y(1)]的下一个像素

我用过这个:

[CH] =轮廓(图像,1)

x = c(1,:) y = c(2,:)

但结果不是很好,它给出了一些非常糟糕的噪点(并且出于某种原因它看起来是镜像的)

matlab image-processing curve-fitting contour

0
推荐指数
1
解决办法
363
查看次数

求数值曲线的曲线方程

我有一个二维图,它看起来是二次的。我从通过计算以数字方式获得的数据集中得到它。我知道可以通过拟合数据集来获得方程。Python 似乎自动根据数据点进行拟合。我需要打印拟合曲线的方程。

我对不同的 X 求解 Y 并获得两个数组 Y 和 X。然后我将它们绘制出来

plt.plot(X,Y)

plt.xlabel('X')
plt.ylabel('Y')
plt.savefig('YvsX.png', format='png', dpi=1000)

plt.show()
Run Code Online (Sandbox Code Playgroud)

并得到这个:

在此输入图像描述

需要打印该图的方程

python curve-fitting

0
推荐指数
1
解决办法
9968
查看次数

Numba jit 和 Scipy

我在这里找到了一些关于这个主题的帖子,但大多数都没有有用的答案。

我有一个 3DNumPy数据集[images number, x, y],其中像素属于某个类的概率存储为浮点数 (0-1)。我想纠正错误的分段像素(具有高性能)。

这些概率是电影的一部分,其中物体从右向左移动,并可能再次返回。基本思想是,我用高斯函数或类似函数拟合像素,并查看大约 15-30 张图像 ( [i-15 : i+15 ,x, y] )。如果前面的5个像素和后面的5个像素都属于这个类,那么这个像素很可能也属于这个类。

为了说明我的问题,我添加了示例代码,结果是在不使用以下内容的情况下计算的numba

from scipy.optimize import curve_fit
from scipy import exp
import numpy as np
from numba import jit

@jit
def fit(size_of_array, outputAI, correct_output):
    x = range(size_of_array[0])
    for i in range(size_of_array[1]):
        for k in range(size_of_array[2]):
            args, cov = curve_fit(gaus, x, outputAI[:, i, k])
            correct_output[2, i, k] = gaus(2, *args)
    return correct_output

@jit
def gaus(x, a, x0, sigma):
    return a*exp(-(x-x0)**2/(2*sigma**2)) …
Run Code Online (Sandbox Code Playgroud)

artificial-intelligence curve-fitting scipy python-3.x numba

0
推荐指数
1
解决办法
1585
查看次数

曲线拟合指数函数python

我需要应用曲线拟合(看图)。然而,我正在努力根据视觉效果(查看绘图)找到初始参数。那么我现在如何为 a、b 或 c 选择哪个值。你有我可以读的文档吗?

图形

我正在尝试实现这个方程:

def func(t, a, b, c):   
    t0 = new_time[maximum_force_index]
    return a*np.exp(-b*(t-t0))+c
Run Code Online (Sandbox Code Playgroud)

以及曲线拟合

popt, pcov = curve_fit(func, t, f)
Run Code Online (Sandbox Code Playgroud)

python curve-fitting exponential

0
推荐指数
1
解决办法
204
查看次数

计算R和ggplot2中平滑线的曲线最大值的x值

data <- dput(data): structure(list(x = 1:16, y = c(-79.62962963, -84.72222222, -88.42592593, -74.07407407, -29.62962963, 51.38888889, 79.62962963, 96.2962963, 87.96296296, 88.42592593, 73.14814815, 12.96296296, -63.42592593, -87.03703704, -87.5, -87.96296296)), .Names = c("x", "y"), row.names = c(NA, 16L), class = "data.frame")
Run Code Online (Sandbox Code Playgroud)

我在R中用ggplot2计算了我的数据集的平滑线:

p1 <- ggplot(data, aes(x=x(°), y=(%)))

library(splines)
library(MASS)
(p2 <- p1 + stat_smooth(method = "lm", formula = y ~ ns(x,3)) +
  geom_point()
)
Run Code Online (Sandbox Code Playgroud)

如何计算平滑线曲线最大值的x值?

r curvesmoothing curve-fitting best-fit-curve ggplot2

-1
推荐指数
1
解决办法
1837
查看次数

将分布拟合到生存曲线

我有以下代表生存函数的数据。

# A tibble: 53 x 2
   month survival
   <int>    <dbl>
 1     0    1.00 
 2     1    1.00 
 3     2    1.00 
 4     3    1.00 
 5     4    1.00 
 6     5    1.00 
 7     6    0.999
 8     7    0.998
 9     8    0.997
10     9    0.993
11    10    0.984
12    11    0.976
13    12    0.973
14    13    0.971
15    14    0.969
16    15    0.969
17    16    0.969
18    17    0.969
19    18    0.968
20    19    0.968
21    20    0.968
22    21    0.968
23    22    0.968 …
Run Code Online (Sandbox Code Playgroud)

statistics r curve-fitting survival-analysis

-2
推荐指数
1
解决办法
1008
查看次数

用于指数衰减函数的Matlab图

我有9组患者的经验数据,数据以这种格式显示

               input = [10      -1      1
                        20      17956   1
                        30      61096   1
                        40      31098   1
                        50      18446   1
                        60      12969   1
                        95      7932    1
                        120     6213    1
                        188     4414    1
                        240     3310    1
                        300     3329    1
                        610     2623    1
                        1200    1953    1
                        1800    1617    1
                        2490    1559    1
                        3000    1561    1
                        3635    1574    1
                        4205    1438    1
                        4788    1448    1
                      ];
                      calibrationfactor_wellcounter =1.841201569;
Run Code Online (Sandbox Code Playgroud)

这里,第一列描述时间值,下一列是浓度.如您所见,浓度会增加一段时间,然后随着时间的增加呈指数下降.

如果我绘制以下特征,我获得以下曲线 在此输入图像描述

我想创建一个代表上面引用的相同行为的脚本.以下是我制定的脚本,其中浓度线性增加直到某个时间段和后果它以指数方式衰减,但是当我绘制此函数我获得线性特征时,请告诉我我的逻辑是否合适

function c_o = Sample_function(td,t_max,a1,a2,a3,b1,b2,b3)
   t =(0: 100 :5000); % time of the sample post …
Run Code Online (Sandbox Code Playgroud)

matlab plot curve curve-fitting exponential

-4
推荐指数
1
解决办法
4453
查看次数

如何只拟合数据集的线性部分?

p=(-50:50)^2
y=c(p, 2500+10*(1:99), p+1000)
plot(seq_along(y), y+100*rnorm(length(y)))
Run Code Online (Sandbox Code Playgroud)

假设我有一个像上面这样的数据集,其中只有数据的一个子集是线性的。像lm()R 中的简单线性回归不能智能地找出适合线性拟合的区域(在本例中为 100 到 200)。

如何找出数据的哪一部分是线性的并仅在这个数据集子集中执行拟合?欢迎使用 R 和 python 中的解决方案。

在此处输入图片说明

请注意,上面显示的日期只是一个示例,只要它包含线性部分,该方法就应该对任意数据集具有鲁棒性。当有多个线性部分时,还应显示那些多个线性部分。如果没有线性部分,它应该显示没有找到线性部分。

编辑:一般来说,统计方法可能不适合稳健地解决这个问题。我添加了计算机视觉和机器学习标签。也许这些领域中的方法通常更适合稳健地解决这个问题?

machine-learning curve-fitting computer-vision linear-regression

-9
推荐指数
2
解决办法
138
查看次数