我尝试使用函数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以获得满意的拟合?
谢谢!

我正在尝试适合形式的功能:
其中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术语会导致溢出错误.这在函数本身中不是问题,因为这里单项式项乘以它们非常小的系数.
我的问题是:
我正在尝试从我的数据中拟合指数函数。我对将数学函数拟合到我的数据还不是很有经验。下面是我现在的代码。
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)
我认为我不太明白这个错误信息在说什么。谁能帮助我了解导致此错误的原因以及如何改进我的代码?
我试图在双峰分布数据上拟合两个高斯,但大多数优化器总是根据开始猜测给出错误的结果,如下所示

我也尝试GMM从scikit-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) 我有点,属于3D空间中的一些非参数曲线.我需要在球坐标中工作并在给定azimuth和elevation值中插入给定的曲线.
你能用这种插值算法帮助我吗?
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_q和azimuth_q:
elevation_q = pi./4;
azimuth_q = pi./7;
[x_i, y_i ,z_i] …Run Code Online (Sandbox Code Playgroud) 我想这不是困难但我想知道是否有任何功能或任何最佳方式.
考虑到在图像处理之后我有一个矩阵图像,其中0到处都是1,在轮廓处有1.
现在我想沿着该轮廓线找到xy
重要的是例如 [x(2)y(2)] 应该是[x(1)y(1)]的下一个像素
我用过这个:
[CH] =轮廓(图像,1)
x = c(1,:) y = c(2,:)
但结果不是很好,它给出了一些非常糟糕的噪点(并且出于某种原因它看起来是镜像的)
我有一个二维图,它看起来是二次的。我从通过计算以数字方式获得的数据集中得到它。我知道可以通过拟合数据集来获得方程。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)
并得到这个:
需要打印该图的方程
我在这里找到了一些关于这个主题的帖子,但大多数都没有有用的答案。
我有一个 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
我需要应用曲线拟合(看图)。然而,我正在努力根据视觉效果(查看绘图)找到初始参数。那么我现在如何为 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) 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值?
我有以下代表生存函数的数据。
# 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) 我有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) 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
curve-fitting ×13
python ×5
matlab ×4
exponential ×3
python-3.x ×3
scipy ×3
r ×2
3d ×1
contour ×1
curve ×1
function ×1
ggplot2 ×1
numba ×1
numpy ×1
plot ×1
scikit-learn ×1
statistics ×1