【问题标题】:Python linear least squares function not workingPython线性最小二乘函数不起作用
【发布时间】:2017-03-12 11:50:54
【问题描述】:

好的,所以我正在 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)

【问题讨论】:

  • 看起来您使用的是逐分量乘法* 而不是矩阵-矩阵、矩阵-向量积np.dot
  • 您可能还想看看使用np.linalg.lstsq,它可能更快且数值更稳定
  • @Eric 谢谢你,会检查的!将来可能会派上用场。这次我应该自己编写函数,但当我不得不再次使用它时我不会拒绝它:)

标签: python numpy linear-regression


【解决方案1】:

假设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

【讨论】:

  • 非常感谢!刚做了这个,它奏效了!不敢相信我花了几个小时试图找出错误,却没有遇到这个。尽管 w 被接受,但它现在仅对 err 不起作用。我不知道为什么它不接受错误?我在这个函数中没有得到任何类型的错误,只是因为错误而失败:(
  • @LinK 不客气 :) 很难说不知道 mean_squared_error - 也许结果的预期形状不同?
  • 我得到的错误是:TypeError: type numpy.ndarray doesn't define round method but it's in the test file,我只是依赖的,不是应该改变它。 mean_squared_error 只是 err = sum(np.power(y - polynomial(x, w), 2)) / len(x) 所以我会说它是相同的形状?但我不确定,形状真的让我很困惑。
  • @LinK np.sum 而不是 sum 有什么不同吗?
  • 它确实!我的天啊。太感谢了。我整个周末都在坐下来试图解决所有这些问题,我无法相信我读过的大量文档,结果却是如此小的变化,使它变得正确。反正。谢谢。我很高兴能做到这一点:)
猜你喜欢
  • 2017-08-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-08-29
  • 1970-01-01
  • 1970-01-01
  • 2017-02-24
  • 1970-01-01
相关资源
最近更新 更多