【问题标题】:curve-fit interprets the input of a function both as array and scalar曲线拟合将函数的输入解释为数组和标量
【发布时间】:2019-12-05 21:42:06
【问题描述】:

我目前遇到以下问题: 我想使用curve_fit进行以下拟合:

def fit_fun(x,c,gamma,B):
    return (c/3.)*np.log((60./pi)*np.sin(pi 
  *x/60.)+ gamma+B*v[x]

popt, pcov = curve_fit(fit_fun,range(1,60),entropy)

其中 v 和熵是给定的列表,我希望 c、gamma、B 是浮点标量。

我得到的错误信息如下:

"只有整数标量数组可以转换为标量索引"

据我了解,问题是由于curve_fit的实现在某个点将输入视为数组,在定义的最后一项中不能将其用作索引功能。 我不知道如何摆脱这种明显的矛盾,因为 x 一开始是整数,然后在拟合过程中进入数组。

【问题讨论】:

  • 尝试分享您的列表内容和您用来使您的示例可重现的变量内容
  • 列表 v,entropy 可以是任何长度为 59 的浮点数列表,我从输入文件中提取它们,但是任何这种类型的列表都应该可以检查它是否适合数据。 Pi 只是 3.14...

标签: python curve-fitting scipy-optimize


【解决方案1】:

问题是你在 curve_fit 中的 x 值是作为 -list- 传递的,因此你不能将它用作你的 v 数组的索引。

我用模拟变量做了一个例子。如果您尝试打印发送到您的函数的值 (x) 是一个列表。我还将 X 值转换为 int。无论如何我改变了 v 的索引。我不知道这样曲线是否正确拟合

from scipy.optimize import curve_fit
import numpy as np
from numpy import pi

entropy = [0.1 for i in range(60)]
v = [i for i in range(60)]

def fit_fun(x, c, gamma, B):
    return (c/3.) * np.log(60./pi)  * np.sin(pi * x/60.) + gamma + np.array(B) * [v[int(i)] for i in x]

popt, pcov = curve_fit(fit_fun, np.array([i for i in range(0,60)]), entropy)

【讨论】:

  • 请问您的示例是否可以解决问题?据我所知,.astype 将数组元素转换为整数,但 x 仍然是一个数组。
  • @Igotta 我的回答是解释为什么你不能在你的具体情况下使用curve_fit
  • @Igotta 我更改了答案,添加了索引处理。
猜你喜欢
  • 2021-09-01
  • 2021-05-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-04-03
  • 1970-01-01
  • 1970-01-01
  • 2017-08-29
相关资源
最近更新 更多