【问题标题】:Scipy Bodgy curve fitScipy Bodgy 曲线拟合
【发布时间】:2013-02-04 05:49:24
【问题描述】:

我使用未校准的指南针在现场收集了简单的调查数据。意识到这个问题,在现场,将一个好的罗盘与未校准的罗盘进行了比较,并记录了 11 个方位的差异。该图显示差异非常接近 sin 函数。 我希望将多项式(3 次)拟合到这个结果函数中,以使用未校准的罗盘来校正测量数据。我的曲线拟合程序产生的拟合曲线很差。谁能看出什么问题?

import numpy as np
import scipy
import pylab
correctCompass=\
np.array([134.4,112.6,069.7,051.1,352.5,314.6,218.3,258.2,237.8,186.5,153.7])
errorCompass=\
np.array([131.6,108.9,065.6,047.0,349.8,314.0,284.6,262.7,243.4,189.8,153.2])
# sort compass values
for i in range(0,11):
   for j in range(i+1,11):
       if correctCompass[i] > correctCompass[j]:
          tmp=correctCompass[j]
          correctCompass[j]=correctCompass[i]
          correctCompass[i]=tmp
          tmp=errorCompass[j]
          errorCompass[j]=errorCompass[i]
          errorCompass[i]=tmp

diff = correctCompass - errorCompass + 15.0
height=diff.max() + 16.0
polycoeffs = scipy.polyfit(correctCompass, diff, 3)

# fit the data with a polynomial
yfit = scipy.polyval(polycoeffs,correctCompass)

pylab.plot(correctCompass, diff, 'k.')
pylab.plot(correctCompass, yfit, 'r-')

pylab.axis([0,360,-10.0,height])
pylab.show()

【问题讨论】:

  • pylab 包含 numpy,所以导入这两个是多余的。我建议import matplotlib.pyplot as plt 和 numpy

标签: python curve-fitting


【解决方案1】:

polyfit 工作正常,问题是diff 中的一个负点降低了拟合,但当您将 y 轴的最小值设置为 -10 时,该点未显示在您的图中

diff = array([ 19.1,  19.1,  18.7,  17.8,  15.5,  11.7, -51.3,   9.4,  10.5, 15.6,  17.7])

如果您评论pylab.axis([0,360,-10.0,height]),您会看到“问题”

此外,您可以使用以下三行代码替换两个嵌套的 for 循环,从而改进代码并使代码更具可读性:

sort = np.argsort(correctCompass)
correctCompass = correctCompass[sort]
errorCompass = errorCompass[sort]

【讨论】:

  • 呃呃没看到。我不小心将 81 转为 18 并没有看到数据点错误,因为它不在图上。感谢您提供关于排序的提示,这是一个很好的技巧。
  • 不客气。它确实发生了。作为规则:如果您必须做一些暗示 for 循环的事情,请尝试:1)找到一些不需要 for 的解决方案(列表理解,numpy,列表之间的操作,数组,...); 2)如果你不能避免,看看你是否可以避免嵌套循环(在这种情况下itertools通常是你的朋友)
猜你喜欢
  • 2017-04-21
  • 2018-11-20
  • 2013-10-10
  • 1970-01-01
  • 2021-11-01
  • 2016-11-29
  • 2018-06-02
  • 2014-09-08
  • 2016-06-24
相关资源
最近更新 更多