首页 > 其他分享 >scipy_optimize_curve_fit 拟合多维曲面问题_scipy leastsq 拟合曲面

scipy_optimize_curve_fit 拟合多维曲面问题_scipy leastsq 拟合曲面

时间:2024-05-19 12:58:36浏览次数:30  
标签:10 func1 yn popt xx scipy 曲面 拟合 np

CSDN搬家失败,手动导出markdown后再导入博客园

在做模板匹配算法过程中,想要通过拟合高斯曲面的方式实现亚像素精度。初始代码如下

# 创建一个函数模型用来生成数据
    def func1(x, a, b, c, d):
        r = a * np.exp(-((x[0] - b) ** 2 + (x[1] - d) ** 2) / (2 * c ** 2))
        return r
 # 生成原始数据
    x1 = np.linspace(0, 10, 10).reshape(1, -1)
    x2 = np.linspace(0, 10, 10).reshape(1, -1)
   
    x = np.append(x1, x2, axis=0)
    X, Y = np.meshgrid(x1, x2)
    XX = np.expand_dims(X, 0)
    YY = np.expand_dims(Y, 0)
    xx = np.append(XX, YY, axis=0)
    
    y = func1(xx, 10, 5, 2, 5)
 # 对原始数据增加噪声
    yn = y + 0.002 * np.random.normal(size=xx.shape[1])
 # 使用curve_fit函数拟合噪声数据
    t0 = timeit.default_timer()
    popt, pcov = curve_fit(func1, xx, yn)
    elapsed = timeit.default_timer() - t0
    print('Time: {} s'.format(elapsed))
 # popt返回最拟合给定的函数模型func的参数值
    print(popt)

结果在执行

File "D:\ProgramData\Anaconda3\envs\vis\lib\site-packages\scipy\optimize\minpack.py", line 763, in curve_fit
    res = leastsq(func, p0, Dfun=jac, full_output=1, **kwargs)
  File "D:\ProgramData\Anaconda3\envs\vis\lib\site-packages\scipy\optimize\minpack.py", line 401, in leastsq
    gtol, maxfev, epsfcn, factor, diag)
minpack.error: Result from function call is not a proper array of floats.

时报错

# 创建一个函数模型用来生成数据
    def func1(x, a, b, c, d):
        r = a * np.exp(-((x[0] - b) ** 2 + (x[1] - d) ** 2) / (2 * c ** 2))
        return r.ravel()
 # 生成原始数据
    x1 = np.linspace(0, 10, 10).reshape(1, -1)
    x2 = np.linspace(0, 10, 10).reshape(1, -1)
    x = np.append(x1, x2, axis=0)
    X, Y = np.meshgrid(x1, x2)
    XX = np.expand_dims(X, 0)
    YY = np.expand_dims(Y, 0)
    xx = np.append(XX, YY, axis=0)
    y = func1(xx, 10, 5, 2, 5)
 # 对原始数据增加噪声
    yn = y + 0.002 * np.random.normal(size=xx.shape[1] * xx.shape[2])
 # 使用curve_fit函数拟合噪声数据
    t0 = timeit.default_timer()
    popt, pcov = curve_fit(func1, xx, yn)
    elapsed = timeit.default_timer() - t0
    print('Time: {} s'.format(elapsed))
 # popt返回最拟合给定的函数模型func的参数值
    print(popt)
 
    fig = plt.figure('拟合图')
    ax = Axes3D(fig)
    X, Y = np.meshgrid(x1, x2)
    XX = np.expand_dims(X, 0)
    YY = np.expand_dims(Y, 0)
    xx = np.append(XX, YY, axis=0)
    R = func1(xx, *popt)
 # R, _ = np.meshgrid(R, x1)
 # y = func1(xx, 10, 5, 2, 5)
 # # 对原始数据增加噪声
 # yn = y + 0.002 * np.random.normal(size=xx.shape[1] * xx.shape[2])
    R = R.reshape(10, 10)
    yn = yn.reshape(10, 10)
    ax.plot_surface(X, Y, R, rstride=1, cstride=1, cmap='rainbow')
    ax.plot_surface(X, Y, yn, rstride=1, cstride=1, color='red')
 
    plt.show()
    y_predict_1 = func1(x, *popt)
    indexes_1 = getIndexes(y_predict_1, yn)
    print(indexes_1)

查看 scipy 的文档 scipy.optimize.curve_fit 文档可知,

xdata array_like or object

The independent variable where the data is measured. Should usually be an M-length sequence or an (k,M)-shaped array for functions with k predictors, but can actually be any object.

ydata array_like

The dependent data, a length M array - nominally f(xdata, ...).

代码中定义的 fun1 函数是直接把高斯曲面的值返回了,是一个二维数组,而文档中明确指明 ydata 是长度为 M 的 array,即一维数组。为解决这一问题,使用 numpy 的 ravel 方法将返回值拉伸为一维数组即可。

完整代码如下:

# 创建一个函数模型用来生成数据
    def func1(x, a, b, c, d):
        r = a * np.exp(-((x[0] - b) ** 2 + (x[1] - d) ** 2) / (2 * c ** 2))
        return r.ravel()
 # 生成原始数据
    x1 = np.linspace(0, 10, 10).reshape(1, -1)
    x2 = np.linspace(0, 10, 10).reshape(1, -1)
    x = np.append(x1, x2, axis=0)
    X, Y = np.meshgrid(x1, x2)
    XX = np.expand_dims(X, 0)
    YY = np.expand_dims(Y, 0)
    xx = np.append(XX, YY, axis=0)
    y = func1(xx, 10, 5, 2, 5)
 # 对原始数据增加噪声
    yn = y + 0.002 * np.random.normal(size=xx.shape[1] * xx.shape[2])
 # 使用curve_fit函数拟合噪声数据
    t0 = timeit.default_timer()
    popt, pcov = curve_fit(func1, xx, yn)
    elapsed = timeit.default_timer() - t0
    print('Time: {} s'.format(elapsed))
 # popt返回最拟合给定的函数模型func的参数值
    print(popt)
 
    fig = plt.figure('拟合图')
    ax = Axes3D(fig)
    X, Y = np.meshgrid(x1, x2)
    XX = np.expand_dims(X, 0)
    YY = np.expand_dims(Y, 0)
    xx = np.append(XX, YY, axis=0)
    R = func1(xx, *popt)
 # R, _ = np.meshgrid(R, x1)
 # y = func1(xx, 10, 5, 2, 5)
 # # 对原始数据增加噪声
 # yn = y + 0.002 * np.random.normal(size=xx.shape[1] * xx.shape[2])
    R = R.reshape(10, 10)
    yn = yn.reshape(10, 10)
    ax.plot_surface(X, Y, R, rstride=1, cstride=1, cmap='rainbow')
    ax.plot_surface(X, Y, yn, rstride=1, cstride=1, color='red')
 
    plt.show()
    y_predict_1 = func1(x, *popt)
    indexes_1 = getIndexes(y_predict_1, yn)
    print(indexes_1)

生成的拟合曲面如图

![[output/attachments/9f9bb80cdaf59bfe5c0146413e9771fd_MD5.png]]

标签:10,func1,yn,popt,xx,scipy,曲面,拟合,np
From: https://www.cnblogs.com/algorithmSpace/p/18200237

相关文章

  • EPAI手绘建模APP扩展样条曲面1
    (8) 扩展样条曲面图 224 扩展样条曲面工具栏-1图 225 扩展样条曲面工具栏-2① 扩展样条曲面工具栏包括一些建模过程中常用的建模工具。一般是针对曲线和曲面的。② 过渡曲线,选择第一条边一个顶点;选择第二条边的一个顶点。在两个顶点之间创建一条曲线边,曲线在两个顶点......
  • EPAI手绘建模APP扩展样条曲面2
    ⑩ 修补曲面,选择一条或者多条首尾相连形成闭合区间的边。设置修补曲面参数,次数和阶数,次数和阶数越大,生成的曲面越平滑越陡峭,曲面的轮廓也越接近选择的边。生成的修补曲面通过选择的边,可以用编辑模型工具栏其它工具进行后续处理。更多详细参见另一篇文章《曲面生成方式知多少》。......
  • R语言基于ARMA-GARCH-VaR模型拟合和预测实证研究分析案例
    原文链接:http://tecdat.cn/?p=3186原文出处:拓端数据部落公众号 本文显示了如何基于潜在的ARMA-GARCH模型(当然也涉及更广泛意义上的QRM)来拟合和预测风险价值(VaR)。从ARMA-GARCH过程模拟(log-return)数据我们考虑使用t分布的ARMA(1,1)-GARCH(1,1)过程。模拟一个序列(用于说明目的)。......
  • vis.js造型曲面3d图形
    代码案例<!DOCTYPEhtml><html><head><title>Graph3Ddemo</title><style>body{font:10ptarial;}fieldset{width:fit-content;}fieldset>......
  • [深度学习]模型选择、过拟合、欠拟合
    模型选择、过拟合、欠拟合在机器学习和统计建模中,模型选择、过拟合和欠拟合是常见的概念,关系到模型的性能和泛化能力。1.模型选择举个一个有趣的例子:惊讶的发现:你发现所有的5个人在面试的时候都穿了蓝色衬衫(就是咱们说的蓝领嘛)你的模型也发现了这个强信号这会有什么问......
  • 将曲面移植指定文件夹
    参照这个帖子,简单修改了一下, 改成了扩展方法:publicstaticvoidMoveTo(thisTinSurfacesur,stringfolderName){varsurfRootFolderId=Autodesk.Civil.DatabaseServices.FolderUtil.GetNonAlignmentRootFolder(RXClass.GetClass(typeof(Autodesk.Civil.DatabaseSe......
  • Peakfit | 光谱分析拟合软件功能介绍&安装教程
    PeakFit当前新版本为V4.12SystatPeakFit是一款功能强大的数据峰值拟合软件,通过该软件,用户可以快速的将数据导入软件进行分析,为用户拟合出各项数据的峰值,该软件支持大多数数据文件格式导入您可以利用软件中的数据扫面功能将该分析数据运用在软件中,当您创建一个新的峰值时,可以将计......
  • Python SciPy库
    SciPy库为Python提供了科学计算的基本算法基本操作求解非线性方程(组)scipy.optimize模块的fsolve和root可求非线性方程(组)的解fsolve或root求解非线性方程组时,先把非线性方程组写成F(x)=0这样的形式,其中,x为向量,F(x)为向量函数scipy.optimize.fsolve(func, x0, args......
  • (求助)SPSS、Matlab中非线性回归拟合报错-来自即将延毕研究生的苟延残喘
    提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档文章目录1原函数形式2SPSS中输入式3Matlab代码及数据集3.1数据集3.2Matlab代码4求助目的1原函数形式原函数形式是这样的,建立多元非线性回归模型,求解参数2SPSS中输入式我的输入式是:0.24a*......
  • 【Mathematical Model】基于Python实现随机森林回归算法&特征重要性评估&线性拟合
    ​    前段时间在做遥感的定量反演,所以研究了一下回归算法,由于之前发的几篇博文都是定义好基础方程进行拟合的,不太满足我的需求。所以研究了一下随机森林回归的算法,之前使用随机森林都是做分类,这次做了回归算法也算是补全了RF算法的空缺了。今天抽空给大家分享一下使用P......