2016-10-25 3 views
1

Ich versuche, eine polynomische Regression auf einige Daten, die ich habe, zu tun. Ich konnte erfolgreichPandas ValueError: zu viele Werte zu entpacken np.polyfit

m, b = np.polyfit(x.values.flatten(), y.values.flatten(), 1)

jedoch rufen, wenn ich den Grad etwas erhöhen höher als 1 ist, dann bekomme ich folgende Fehlermeldung:

np.polyfit(x.values.flatten(), y.values.flatten(), 2) 
ValueError: too many values to unpack 

ich Daten lese wie:

x = pandas.read_csv('D3.csv', usecols = [0]) 
y = pandas.read_csv('D3.csv', usecols = [3]) 

Eine Idee, warum das passieren könnte?

Antwort

3

Bevor Ihr Problem zu berühren, durch documentation, np.polyfit gibt nur zwei Argumente:

  1. ein Array von Koeffizienten für den Einbau Polynom
  2. des Kovarianzmatrix für diese Koeffizienten

nun die Das zweite Argument wird nur angezeigt, wenn Sie np.polyfit mit zwei optionalen Argumenten aufrufen: full = False and cov=True.

Zurück zu Ihrem Problem: Da Sie cov = True (standardmäßig full=False) nicht festlegen, gibt Ihre Funktion nur ein einzelnes Array zurück. Wenn Sie den Grad auf 1 setzen, hat das zurückgegebene Array zwei Elemente ([a,c] in ax + c) und python weist Ihrem Code automatisch m = a und b = c zu. Bei einem höheren Grad hat das zurückgegebene Array mehr als zwei Elemente, und Python versucht, sie allen Variablen zuzuordnen, die Sie vor der Zuweisung eingefügt haben, aber da es mehr als 2 gibt, benötigen Sie mehr als 2 Variablen. I.e. Betrachten Sie diesen kleinen Lauf in Python 2:

>>> a,c = [1,2] 
>>> a 
1 
>>> c 
2 
>>> a,c = [1,2,3] 
Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
ValueError: too many values to unpack 

Nun ist der richtige Weg, dies zu tun ist, nur einen einzigen Rückgabewert gesetzt. Beispiel:

import pandas 
import numpy as np 
import sys 

deg = int(sys.argv[1]) 

x = pandas.read_csv('test.csv',usecols=[0]) 
y = pandas.read_csv('test.csv',usecols=[1]) 
m = np.polyfit(x.values.flatten(), y.values.flatten(), deg) 

print m 

diesen Code wird angenommen, ist in der Datei stackoverflow.py. Beispielaufrufe:

Chip [email protected] 09:15:[email protected] ~: python stackoverflow.py 1 
[ 8. -12.] 
Chip [email protected] 09:15:[email protected] ~: python stackoverflow.py 2 
[ 1.00000000e+00 -1.45528372e-14 3.11727844e-14] 
Chip [email protected] 09:15:[email protected] ~: python stackoverflow.py 3 
[ -3.16472437e-16 1.00000000e+00 -2.82243562e-14 4.43123853e-14] 

Mit anderen Worten, alle Koeffizienten werden in einem einzigen Array gepackt und zurückgegeben.

0

Wenn wir dies wie folgt testen:

import numpy as np 

x = [1,2,3,4,5,6,7,8,9,10] 
y = [2,4,5,7,8,9,8,7,2,1] 

pf = np.polyfit(x,y,1) 
print (pf) 

pf = np.polyfit(x,y,2) 
print (pf) 

pf = np.polyfit(x,y,3) 
print (pf) 

... erhalten wir:

[-0.05454545 5.6  ] 
[-0.35984848 3.90378788 -2.31666667] 
[-0.02466977 0.0472028 2.02641803 -0.2  ] 

... also gibt es nur zwei Elemente im ersten Fall entpacken, aber mehr in die anderen Fälle.

Verwandte Themen