我知道 scipy curve_fit 可以做得更好

2024-05-07

我使用 python/numpy/scipy 来实现此算法,用于根据地形坡向和坡度对齐两个数字高程模型 (DEM):

“用于量化冰川厚度变化的卫星高程数据集的联合配准和偏差校正”,C. Nuth 和 A. Kääb,doi:10.5194/tc-5-271-2011 http://dx.doi.org/10.5194/tc-5-271-2011

我已经设置了框架,但是 scipy.optimize.curve_fit 提供的拟合质量很差。

def f(x, a, b, c):
    y = a * numpy.cos(numpy.deg2rad(b-x)) + c
    return y

def compute_offset(dh, slope, aspect):
    import scipy.optimize as optimization

    idx = random.sample(range(dh.compressed().size), 10000)
    xdata = numpy.array(aspect.compressed()[idx], float)
    ydata = numpy.array((dh/numpy.tan(numpy.deg2rad(slope))).compressed()[idx], float)

    #Generate synthetic data to test curve_fit
    #xdata = numpy.arange(0,360,0.01)
    #ydata = f(xdata, 20.0, 130.0, -3.0) + 20*numpy.random.normal(size=len(xdata))

    print xdata
    print ydata

    x0 = numpy.array([0.0, 0.0, 0.0])

    fit = optimization.curve_fit(f, xdata, ydata, x0)[0]
    #optimization.leastsq(f, x0[:], args=(xdata, ydata))
    genplot(xdata, ydata, fit)
    return fit

def genplot(x, y, fit):
    a = (numpy.arange(0,360))
    f_a = f(a, fit[0], fit[1], fit[2])
    idx = random.sample(range(x.size), 10000)
    plt.figure()
    plt.xlabel('Aspect (deg)')
    plt.ylabel('dh/tan(slope) (m)')
    plt.plot(x[idx], y[idx], 'r.')
    plt.axhline(color='k')
    plt.plot(a, f_a, 'b')
    plt.ylim(-80,80)
    plt.show()

#Input DEMs
dem1_fn = sys.argv[1]
dem2_fn = sys.argv[2]

dem1_ds = gdal.Open(dem1_fn, gdal.GA_ReadOnly)
dem2_ds = gdal.Open(dem2_fn, gdal.GA_ReadOnly)

#Extract band 1 from each dataset as masked array using internal nodata value
dem1 = getperc_new.gdal_getma(dem1_ds, 1)
dem2 = getperc_new.gdal_getma(dem2_ds, 1)

#Produce slope and aspect maps using gdaldem and load into masked arrays
dem1_slope = gdaldem_slope(dem1_fn)
dem1_aspect = gdaldem_aspect(dem1_fn)

#Compute common mask and apply to all products
common_mask = dem1.mask + dem2.mask + dem1_slope.mask + dem1_aspect.mask

diff_euler = numpy.ma.array(dem2-dem1, mask=common_mask)
dem1_slope.__setmask__(common_mask)
dem1_aspect.__setmask__(common_mask)

#Compute relationship between elevation difference, slope and aspect
fit = compute_offset(diff_euler, dem1_slope, dem1_aspect)
print fit

这是我的数据的拟合,最初由约 200 万个点组成,但我出于测试/绘图目的随机抽样:

[-14.9639559 216.01093596 -41.96806735]

那里有大量数据可以很好地拟合,但 curve_fit 的结果很差。当我使用合成数据运行时,我得到了很好的拟合:

原始输入参数 [20.0, 130.0, -3.0]

curve_fit 的结果 [-19.66719631 -49.6673076 -3.12198723]

不确定这是否与使用屏蔽数组、 curve_fit 的限制有关,或者我是否只是忽略了一些简单的事情。感谢您的任何建议。

==========================

编辑 2013 年 9 月 4 日 16:30(太平洋夏令时间)

正如@Evert 和其他人所建议的,问题肯定与异常值有关。去除异常值后,我能够获得更好的拟合效果。看看我的旧代码,似乎我计算了每个方面的中值绝对偏差,然后在拟合之前删除了 2*mad 之外的任何内容。

我在 2012 年 11 月生成了一些额外的图:

但再次查看这些,我几乎肯定它们是针对不同的输入数据生成的。这是我现在能找到的所有内容,因此我将它们作为有偏差抽样的案例示例放在这里。对于这样的情况,这种 DEM 对齐方法注定会失败 - 并且它与 scipy 的曲线拟合能力无关。

我最终开发了一种不同的对齐方法,涉及两个屏蔽 2D numpy 数组的归一化互相关、子像素细化和垂直偏移去除。它速度更快,并且始终提供更好的结果。尽管这种方法已经被 Oleg Alexandrov 开发的迭代最近点 (ICP) 工具 (pc_align) 所取代,作为NASA 艾姆斯立体声管道 http://ti.arc.nasa.gov/tech/asr/intelligent-robotics/ngt/stereo/.

感谢您的所有回复,对于放弃这个问题我深表歉意。


如果您只是想获得具有相位偏移的正弦波,则不需要非线性拟合。

你可以替换它a * sin(x - b) + c by a * sin(x) + b * cos(x) + c,因为任何带有偏移量的正弦都可以写成正弦和余弦的适当组合(“相量加法”,就像在傅里叶变换中一样)。

如果给出相同的结果,那么问题就不是“非线性”拟合。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

我知道 scipy curve_fit 可以做得更好 的相关文章

随机推荐

  • JS:按每个类别的最大值过滤对象数组

    什么是最有效 优雅的方式来实现类似sql的过滤效果 我想过滤它们并只获取某个组中最大值的对象 这是我的代码 它可以工作 但可能不是最好的方法 uniqueValues arr gt new Set arr getMaxTimeOf arr
  • 通过使用 Intents 使用预装的 Google 地图而不是自己的 Activity?

    我只是想知道是否可以将地理坐标传递给谷歌地图应用程序之二意图或类似的东西 我自己编写了一个用于显示路线 坐标等的应用程序 但是让谷歌地图本身显示这些不是更优雅吗 我不知道这是否可能 但也许你们中的一个人可以回答这个问题 如果这是可能的 是否
  • R模糊字符串匹配根据匹配的字符串返回特定列

    我有两个大型数据集 一个大约有 50 万条记录 另一个大约有 7 万条记录 这些数据集有地址 我想匹配较小数据集中的任何地址是否存在于大数据集中 正如您所想象的那样 地址可以用不同的方式和不同的情况 拼写等来书写 此外 如果只写到建筑物级别
  • Swift 2.0 中的 countForFetchRequest

    我正在尝试使用countForFetchRequestSwift 2 0 中托管对象上下文上的方法 我注意到错误处理executeFetchRequest已更改为新的do try catch syntax func executeFetch
  • Xcode 4 上的 Boost 库静态链接

    我在 OS X 上使用 Xcode 使用 Boost 库 Boost 使用 macports 安装在我的系统上 通过将我需要的 3 个 boost 库 例如 libboost thread mt a 添加到 Targets Link Bin
  • 将 CSS 框阴影转换为 iOS 阴影

    有谁知道我如何转换box shadowObjective C 中 UIButton 上的阴影 例如这个阴影 box shadow 2px 0 0 0 46d466 2px 0 0 0 46d466 0 2px 4px 0 rgba 0 0
  • 如何在 C# 中从工作线程发布 UI 消息

    我正在用 C 编写一个简单的 winforms 应用程序 我创建了一个工作线程 我希望主窗口响应线程完成其工作 只需更改文本字段中的一些文本 testField Text Ready 我尝试了事件和回调 但它们都在调用线程的上下文中执行 并
  • 是否可以防止出现文件对话框?为什么?

    假设我有输入 类型 文件 元素 我想拦截 onclick 事件并防止在不满足条件时出现文件对话框 是否可以 如果不是的话 为什么 Soufiane 的代码要求您的页面上有一个名为 jQuery 的 Javascript 库 如果您没有 您可
  • 从 Windows 批处理文件中检测 ANSI 兼容控制台?

    Windows 10 控制台主机 conhost exe has 对 ANSI 转义序列的本机支持 https msdn microsoft com en us library windows desktop mt638032 aspx 旧
  • 获取ADO.NET中的参数前缀

    我想使用列名作为参数基于列列表生成多个 SQL 语句 Edit C var columns new string COL1 COL2 var tableName TABLE 1 var prefix TODO get this from t
  • asp.net web api 中具有两个参数的方法

    如何使用 ASP NET Web Api 创建具有两个参数的方法 这样我就可以像 localhost controller param1 param2 那样调用它 您还可以在查询字符串中使用特定参数名称来调用 url api actions
  • 设置数据漫游开/关

    如何在 Android 应用程序中以编程方式设置数据漫游开 关 提前为重新打开一个死帖子表示歉意 但我已经通过调用此可执行文件成功实现了它 su c settings put global data roaming0 1 另外 要获取第一张
  • S3 Java 客户端经常失败,并出现“内容长度分隔消息正文过早结束”或“java.net.SocketException 套接字已关闭”

    我有一个在 S3 上做很多工作的应用程序 主要是从中下载文件 我看到很多此类错误 我想知道这是否是我的代码中的问题 或者服务是否真的像这样不可靠 我用来从 S3 对象流读取的代码如下 public static final void wri
  • 如何声明朋友聚会?

    我的解决方案中有 2 个项目 装配 基础库 测试组件 NUnit 我已将测试程序集声明为第一个项目中的朋友程序集 assembly InternalsVisibleTo Company Product Tests 一切都工作正常 直到我意识
  • 在 Tensorflow 2.0 中的 tf.function input_signature 中使用字典

    我正在使用 Tensorflow 2 0 并面临以下情况 tf function def my fn items do stuff return 如果 items 是张量的字典 例如 item1 tf zeros 1 1 item2 tf
  • openNLP 与 Solr 集成时出现异常

    我正在尝试将 openNLP 与 Solr 6 1 0 集成 我配置了架构和 solrconfig 文件 详细信息请参见 wiki 链接 https wiki apache org solr OpenNLP https wiki apach
  • 选择性罐包装

    我有一个小program jar 它使用了巨大的library jar 的一小部分 有没有一种工具可以将多个 jar 重新打包成一个 以便它可以独立运行并且尽可能小 Update 大小事项 有proguard http proguard s
  • 复制具有所有关系的 Doctrine 对象

    我想复印一份他所有亲戚的记录 我正在尝试 o Doctrine getTable Table gt Find x copy object gt copy relations o gt getRelations foreach relatio
  • Kubernetes - 服务之间的通信

    我目前正在开发 kubernetes 集群 集群工作正常 我需要在不使用代理的情况下建立服务之间的通信 例如我有以下服务 worker app1 app2 app3 Worker 需要直接通过 SSH 登录应用程序容器并执行一些命令 在 d
  • 我知道 scipy curve_fit 可以做得更好

    我使用 python numpy scipy 来实现此算法 用于根据地形坡向和坡度对齐两个数字高程模型 DEM 用于量化冰川厚度变化的卫星高程数据集的联合配准和偏差校正 C Nuth 和 A K b doi 10 5194 tc 5 271