8

検索を行ったところ、問題はPython scipy: unsupported operand type(s) for ** or pow(): 'list' and 'list' に似ているようです が、そこに投稿された解決策は機能しませんでした。異なる。

scipy.curve_fit を使用してデータに曲線を当てはめようとしています。3 つのパラメーターをすべて解放したままにしておくと、すべてが正しく機能し、期待どおりの結果が得られます。

def func(x,a,b,c):
  return a*np.exp(b*(x**c)) 

popt, pcov = curve_fit(func,x,y)

ただし、次のように値の1つ(c = 2)を修正しようとすると、

def func2(x,a,b):
  return a*np.exp(b*(x**2))

popt, pcov = curve_fit(func2,x,y)

リンクされた質問で提案されているようにTypeError: unsupported operand type(s) for ** or pow(): 'int' and 'list'使用numpy.power(x,2)すると、コードを実行できますが、間違った結果が生成されます。誰かが私が間違っていることを見ていますか?

追加するように編集:さらに紛らわしいことですが、私が知る限り、curve_fit で使用されている 2 番目の式が機能する leastsq です。

2番目の編集:リストの問題について言及した人へ X と Y は両方とも配列になり、コードはエラーなしで実行されます。ただし、 func2 は依然として大幅に間違った結果を生成します。(ここにグラフを投稿しますが、どうやらもっと担当者が必要です。)

Func 1 のカーブフィットは、[a,b,c] = [ 1.71890826, -0.0239123, 3.17039851]しかし func2 の場合はすべてうまくいきません[a,b] = [ -2.88694423e-15, 9.99999998e-01]。このような小さな変更がどのようにして劇的な問題を引き起こすのか理解できません。leastsq は c=2 でこのデータを適合させることができました。

4

3 に答える 3

5

これTypeErrorは、x渡されるfunc2のがリストであるためです。

以下に例を示します。

import numpy as np
import scipy.optimize as optimize
def func2(x,a,b):
    return a*np.exp(b*(x**2))

x = np.linspace(0,1,6).reshape(2,-1)
y = func2(x,1,1)
x = x.tolist()
y = y.tolist()
print(x)
# [[0.0, 0.2, 0.4], [0.6000000000000001, 0.8, 1.0]]
print(y)
# [[1.0, 1.0408107741923882, 1.1735108709918103], [1.4333294145603404, 1.8964808793049517, 2.718281828459045]]

popt, pcov = optimize.curve_fit(func2, x, y)
# TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'

この場合、形状 (2,3) のfunc2配列を形状 (2,3) の配列にマップします。この関数は、からの戻り値が配列ではなく、一連の数値であると想定しています。xyoptimize.curve_fitfunc2

幸いなことに、この場合、func2は の各コンポーネントで要素ごとに動作します。xの要素間に相互作用はありませんxxしたがって、形状 (2,3) の配列または形状 (6,) の 1D 配列を渡す場合、実際には違いはありません。

形状 (6,) の配列を渡すと、形状 (6,)func2の配列が返されます。完全。それはうまくいくでしょう:

x = np.asarray(x).ravel()
y = np.asarray(y).ravel()
popt, pcov = optimize.curve_fit(func2, x, y)
print(popt)
# [ 1.  1.]
于 2013-01-11T20:14:54.873 に答える
1

どのようなx値を使用しましたか? 次の例は私にとってはうまくいきます。

from scipy.optimize import curve_fit
import numpy as np

def func2(x,a,b):
  return a*np.exp(b*(x**2))

x = np.linspace(0,4,50)
y = func2(x, 2.5, 2.3)
yn = y + 6.*np.random.normal(size=len(x))
popt, pcov = curve_fit(func2,x,yn)
print popt, pcov

random関数に応じて結果が得られます。

[ 1.64182333  2.00134505] [[  1.77331612e+11  -6.77171181e+09]
 [ -6.77171181e+09   2.58627411e+08]]

あなたxyn型の値はリストですか? 次の例では、エラー メッセージが表示されます。

print range(10)**2

TypeError: unsupported operand type(s) for ** or pow(): 'list' and 'int'
于 2013-01-11T19:18:54.467 に答える
0

Pythonは次のようなことをしようとしています:

[1, 2, 3] * 4

* 演算子は CPython で定義されていません。

これは私のために働いた:

def second_order_polynomial(x, a, b, c):
    return [a * x0**2 + b * x0 + c for x0 in x]
于 2022-02-20T11:29:07.537 に答える