使用linalg.lstsq(numpy)时出现数学域错误

时间:2016-05-20 06:06:42

标签: python python-2.7 numpy math

所以我在尝试输入一组数据点时使用线性回归来显示趋势线。我正在使用Tkinter获取数据的输入,然后将它们转换为float以将它们放入列表中。我在运行程序时得到了这个错误代码。

    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条目。

1 个答案:

答案 0 :(得分: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()