【问题标题】:Python curve fitting with an infinite summation具有无限求和的 Python 曲线拟合
【发布时间】:2019-12-29 15:28:09
【问题描述】:

我正在尝试在 python 中进行曲线拟合,其中包括无限求和。

我总是出错。

from mpmath import nsum, exp, inf
import numpy as np
import pylab
from scipy.optimize import curve_fit

# get the data
y=[]
x=[]
for t in range(0,100,10):
    x += [t]
    y += [round(float((nsum(lambda n: exp(-(0.0002)*(n)*t),[0, inf]))),3)]
print(y)

# curve fitting
def test(t,D):
    return  [round(float((nsum(lambda n: exp(-(D)*(n)*t),[0, inf]))),3)]

                 
parameters, params_covariance=curve_fit(test, x, y)

print(parameters)

我希望我可以从曲线拟合函数中得到估计的 D 但我总是得到错误:

TypeError: cannot create mpf from array([mpf('0.0'), mpf('0.0'), mpf('0.0'), mpf('0.0'), mpf('0.0'),
       mpf('0.0'), mpf('0.0'), mpf('0.0'), mpf('0.0'), mpf('0.0')],
      dtype=object)

谢谢!

【问题讨论】:

  • 请将所有导入语句添加到您发布的代码中,以便我可以运行与您正在运行的完全相同的代码。
  • 包含 complete 回溯也会有所帮助,因此我们可以看到错误发生的位置
  • 另外,请仔细查看错误消息。该代码试图在某处创建mpf 对象。所以(查看mpmath 的文档)它需要单个 floatstrint 或其他mpf。但它得到一个numpy 数组mpf。因此出现错误。
  • @RolandSmith 我同意,因为错误标记为“TypeError”,数据类型(dtype)显示为“dtype=object”。我认为如果从非常紧凑的 lambda 表达式中取出 nsum 并尽可能将其单独放置在一行上以进行隔离,那么这将更容易排除故障。一旦故障排除并解决了类型错误,就可以轻松地重构 lambda。

标签: python python-3.x curve-fitting


【解决方案1】:

你需要把test()的输入输出都列在列表里

def test(x,D):
    return  [float((nsum(lambda n: exp(-(D)*(n)*t),[0, inf]))) for t in x]

【讨论】:

    【解决方案2】:

    使用您显示的代码,我无法重现错误。

    (我使用列表推导来创建xy,但它们等同于您的代码。)

    In [1]: from mpmath import nsum, exp, inf
    
    In [2]: x = [t for t in range(0, 100, 10)]
    Out[2]: [0, 10, 20, 30, 40, 50, 60, 70, 80, 90]
    
    In [3]: y = [round(float((nsum(lambda n: exp(-(0.0002)*(n)*t),[0, inf]))),3) for t in range(0, 100, 10)]
    Out[3]: [150.0, 500.5, 250.5, 167.167, 125.501, 100.501, 83.834, 71.93, 63.001, 56.057]
    
    In [4]: [type(t) for t in y]
    Out[4]: [float, float, float, float, float, float, float, float, float, float]
    
    In [5]: [type(t) for t in x]
    Out[5]: [int, int, int, int, int, int, int, int, int, int]
    

    可以看出,x 是一个整数列表,y 是一个浮点数列表。所以看不到mpf...

    唯一的是test返回一个列表:

    In [6]: def test(t,D):
       ...:     return  [round(float((nsum(lambda n: exp(-(D)*(n)*t),[0, inf]))),3)]
       ...:
    
    In [7]: test(30, 0.002)
    Out[7]: [17.172]
    

    curve_fit 的文档没有明确说明这一点,但我希望该函数只返回这样的数字:

    In [8]: def test(t,D):
       ...:     return  round(float((nsum(lambda n: exp(-(D)*(n)*t),[0, inf]))),3) 
       ...:
    
    In [9]: test(30, 0.002)
    Out[9]: 17.172
    

    我没有安装 scipi,但curve_fit 应该没有问题 xy。我不知道test 返回列表是否会出现问题,但这肯定不会重现此特定错误。

    编辑: 由于数据中以及提交给curve_fit 的函数中都没有mpf 对象,因此curve_fit 应该不可能引发此异常。

    编辑2: 根据回溯,似乎从test() 返回列表 确实是问题所在。当 mpmath 看到返回的列表并且您正在使用 numpy 时,它会尝试将列表转换为 mpf。这就是它似乎出错的地方。更改test() 以返回一个数字而不是我上面显示的列表。那应该可以解决它。

    【讨论】:

    • @Vicky 查看已编辑的答案。所以我认为产生错误的代码与您问题中显示的代码不同。因此,检查这段代码是否真的产生了这个错误。如果确实如此,请编辑您的问题以显示完整的错误回溯
    • @Vicky 查看更新的答案。仔细阅读回溯并参考 mpmath 源代码。你可以看到哪里出错了。
    猜你喜欢
    • 2015-06-20
    • 2019-02-20
    • 2013-11-08
    • 2020-12-06
    • 1970-01-01
    • 2021-03-21
    • 1970-01-01
    • 2011-07-07
    • 2016-02-12
    相关资源
    最近更新 更多