1

特定の関数をscipyに適合させようとしていたところ、奇妙な結果が得られました。答えがわかっているものをテストすることにしたので、これを作成しました。

from scipy.optimize import curve_fit as cf
import numpy as np
import random

def func(x,a):
    return a+X

X =[]
for i in range (10):
    V = random.random()
    X.append(i+3 + V/10)

print cf(func, np.array(range(10)),np.array(X))

私は約3を取得することを期待していましたが、それでも、ここでの出力は次のとおりです。

(array([ -2.18158824e-12]), inf)

ちなみに、私は自分が何を送信するかを確認しようとしましたfuncが、これを取得しました。

print func(np.array(range(10)),3)

Traceback (most recent call last):
  File "/tmp/py1759O-P", line 16, in <module>
    print func(np.array(range(10)),3)
  File "/tmp/py1759O-P", line 6, in func
    return a+X
TypeError: unsupported operand type(s) for +: 'int' and 'list

私は何が間違っているのですか?

4

2 に答える 2

3

xこのような異なる意味を持つ変数名としてandを使用しないでくださいX(または、Python では大文字と小文字が区別されることを知らなかったのでしょうか?):

def func(x,a):
    return a+X

X =[]

xnumpy 配列、Xリスト、およびaスカラー パラメータ値です。

a+Xリストにスカラーを追加できないため、エラーが発生します。

于 2012-09-06T15:59:03.803 に答える
1

funcでは、引数はですxX、関数の本体で使用されます。

これがあなたのコードの修正版です。numpyのさらにいくつかの機能を使用します(たとえば、random.random()の代わりにnp.random.random())。

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


def func(x, a):
    return a + x


n = 10
xdata = np.arange(n)
ydata = func(xdata, 3) + np.random.random(n) / 10

print cf(func, xdata, ydata)

出力は

(array([ 3.04734293]), array([[  8.19208558e-05]]))
于 2012-09-06T16:02:32.787 に答える