2016-05-20 3 views
3

したがって、データポイントのセットを入力するときに線形回帰を使用して傾向線を表示しようとしています。私はTkinterを使用してデータの入力を取得し、それらをfloatに変換してリストに入れます。私はプログラムを実行するとき、私はこのエラーコードを取得します。linalg.lstsq(numpy)を使用すると数学的なドメインエラーが発生する

Exception in Tkinter callback 
    Traceback (most recent call last): 
     File "C:\Python27\lib\lib-tk\Tkinter.py", line 1486, in __call__ 
     return self.func(*args) 
     File  "C:/Users/NIBO9901/PycharmProjects/Matteuppgift/Trendlinje/Input.py", line 78, in plot 
     m, c = np.linalg.lstsq(a, y)[0] 
     File "C:\Python27\lib\site-packages\numpy\linalg\linalg.py", line 1889, in lstsq 
     nlvl = max(0, int(math.log(float(min(m, n))/2.)) + 1) 
    ValueError: math domain error 

そして、それが参照のうえのコードはここにある:

xList = [] 
    yList = [] 

    x = np.array(xList) 
    y = np.array(yList) 

    if 0 < len(inpX0.get()): 
     xList.append(float(inpX0.get())) 

    if 0 < len(inpX1.get()): 
     xList.append(float(inpX1.get())) 

    if 0 < len(inpY0.get()): 
     yList.append(float(inpY0.get())) 

    if 0 < len(inpY1.get()): 
     yList.append(float(inpY1.get())) 

    a = np.vstack([x, np.ones(len(x))]).T 
    m, c = np.linalg.lstsq(a, y)[0] 

    plt.plot(x, y, 'o', label='Data', markersize=10) 
    plt.plot(x, m*x + c, 'r', label='Trendlinje') 
    plt.legend() 
    plt.show() 

inpX/Yは、Tkinterのエントリです。

+0

は、あなたが 'A'をプリントアウトしたことがありますか?ナンシーアレイは、あなたがそれらを使用する方法では動作しません。 'xList = 'には、' x = np.array(xList) 'を実行する必要があります。 'xList'に項目を追加してもnumpyの配列' x'は更新されません。 – cel

+0

@celありがとうございました! –

答えて

1

numpy配列は静的構造です。まずリストを作成し、それをnumpyの配列に変換する必要があります。その後、リストの変更はnumpy配列に影響しません。

それでは、あなたがやりたいことは、おそらくです:

xList = [] 
yList = [] 

if 0 < len(inpX0.get()): 
    xList.append(float(inpX0.get())) 

if 0 < len(inpX1.get()): 
    xList.append(float(inpX1.get())) 

if 0 < len(inpY0.get()): 
    yList.append(float(inpY0.get())) 

if 0 < len(inpY1.get()): 
    yList.append(float(inpY1.get())) 

a = np.vstack([x, np.ones(len(x))]).T 
m, c = np.linalg.lstsq(a, y)[0] 

# the lists are complete, now convert them to numpy arrays 
x = np.array(xList) 
y = np.array(yList) 

plt.plot(x, y, 'o', label='Data', markersize=10) 
plt.plot(x, m*x + c, 'r', label='Trendlinje') 
plt.legend() 
plt.show() 
関連する問題