Python 线性最小二乘函数不起作用
Python linear least squares function not working
好的,所以我在 python 中编写了一个线性最小二乘函数,它几乎只是一个方程。但出于某种原因,我遇到了 ValueError。我最好的猜测是它与 .reshape
函数有关,因为在这个问题中我有 并且重塑是解决方案。我已经阅读了它并且从我收集到的内容来看,我的函数中的 w 格式为 (n,) 并且结果将在 (n,1) 中,就像我之前提到的问题一样。我尝试重塑 x_train
和 y_train
但我只收到无法更改数组大小的错误。我想我的参数设置错误。现在我迷路了,我还有很多类似的功能要完成——我希望我能理解我的代码中缺少什么。方程似乎是有序的,所以我想我每次都应该添加一些东西 - 可能是 reshape
函数,因为我仍在使用与上一种情况相同的模型。我希望这是 post 这个问题的正确位置,我不知道还能做什么,但我真的很想了解,这样我以后就不会遇到这些问题了,谢谢。
代码(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_matrix
和 mean_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)
假设design_matrix
returns一个矩阵,这段代码
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
.
好的,所以我在 python 中编写了一个线性最小二乘函数,它几乎只是一个方程。但出于某种原因,我遇到了 ValueError。我最好的猜测是它与 .reshape
函数有关,因为在这个问题中我有 x_train
和 y_train
但我只收到无法更改数组大小的错误。我想我的参数设置错误。现在我迷路了,我还有很多类似的功能要完成——我希望我能理解我的代码中缺少什么。方程似乎是有序的,所以我想我每次都应该添加一些东西 - 可能是 reshape
函数,因为我仍在使用与上一种情况相同的模型。我希望这是 post 这个问题的正确位置,我不知道还能做什么,但我真的很想了解,这样我以后就不会遇到这些问题了,谢谢。
代码(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_matrix
和 mean_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)
假设design_matrix
returns一个矩阵,这段代码
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
.