Python线性最小二乘函数不起作用

时间:2017-03-12 11:50:54

标签: python numpy linear-regression

好的,所以我在python中编写一个线性最小二乘函数,它只是一个方程式。但由于某种原因,我得到了一个ValueError。我最好的猜测是它与.reshape函数有关,因为在这个问题中我有a very similar problem并且重塑是解决方案。我已经阅读了它,从我收集的内容来看,我的函数中的w是格式(n,),结果将在(n,1)中,就像我之前提到的问题一样。我尝试重塑x_trainy_train,但我只有一个错误,我不能改变数组的大小。我想我的参数设置错了。现在我迷路了,我还有更多这样的功能可以通过 - 我希望我能理解我的代码中缺少的内容。这个等式似乎是有序的,所以我想每次都应该添加一些东西 - 可能是reshape函数,因为我仍然使用与上一种情况相同的模型。我希望这是发布这个问题的正确位置,我不知道还能做什么,但我真的很想了解,所以将来我不会遇到这些问题,谢谢。

代码(np。代表numpy):

def least_squares(x_train, y_train, M):
    '''
    :param x_train: training input vector  Nx1
    :param y_train: training output vector Nx1
    :param M: polynomial degree
    :return: tuple (w,err), where w are model parameters and err mean squared error of fitted polynomial
    '''
    w = np.linalg.inv(design_matrix(x_train, M). * design_matrix(x_train, M)) * design_matrix(x_train, M).T * y_train
    err = mean_squared_error(x_train, y_train, w)
    return (w, err)

design_matrixmean_squared_error工作得很好。 回溯:

ERROR: test_least_squares_err (test.TestLeastSquares)
----------------------------------------------------------------------
Traceback (most recent call last):
  File "\content.py", line 48, in least_squares
    w = np.linalg.inv(design_matrix(x_train, M).T * design_matrix(x_train, M)) * design_matrix(x_train, M).T * y_train
ValueError: operands could not be broadcast together with shapes (7,20) (20,7)

1 个答案:

答案 0 :(得分:2)

假设design_matrix返回一个矩阵,此代码

design_matrix(x_train, M).T * design_matrix(x_train, M)
由于*执行逐元素乘法(两个矩阵的Hadamard乘积),因此很可能不会执行预期的操作。因为你的矩阵不是正方形,所以它会抱怨形状不相容。

要获得矩阵矩阵乘积,人们可能会这样做(假设numpy导入为import numpy as np):

np.dot(design_matrix(x_train, M).T, design_matrix(x_train, M))

类似的推理则适用于陈述的其余部分* design_matrix(x_train, M).T * y_train ......

此外,您可能只需要评估design_matrix一次,例如,添加类似

的内容
mat = design_matrix(x_train, M)
在计算w的行之前

,然后仅使用mat