尝试编写用于线性回归的成本函数时,在cost_function中用pow函数替换**时出现错误:
原始成本函数
def cost_function(x,y,theta):
m = np.size(y)
j = (1/(2*m))*np.sum(np.power(np.matmul(x,theta)-y),2)
return j
给出错误的成本函数:
def cost_function(x,y,theta):
m = np.size(y)
j = (1/(2*m))*np.sum((np.matmul(x,theta)-y)**2)
return j
梯度下降
def gradient_descent(x,y,theta,learn_rate,iters):
x = np.mat(x);y = np.mat(y); theta= np.mat(theta);
m = np.size(y)
j_hist = np.zeros(iters)
for i in range(0,iters):
temp = theta - (learn_rate/m)*(x.T*(x*theta-y))
theta = temp
j_hist[i] = cost_function(x,y,theta)
return (theta),j_hist
变量值
theta = np.zeros((2,1))
learn_rate = 0.01
iters = 1000
x is (97,2) matrix
y is (97,1) matrix
成本函数的精细计算值为32.0727 在梯度下降中使用相同的函数时会出现错误。
得到的错误是 LinAlgError:数组的最后2个维必须是正方形的
答案 0 :(得分:1)
首先让我们区分pow
,**
和np.power
。 pow
是Python函数,根据docs,当与2个参数一起使用时,其等效于**
。
第二,将np.mat
应用于数组,生成np.matrix
对象。根据其文档:
它具有某些特殊的运算符,例如
*
(矩阵乘法)和**
(矩阵幂)。
矩阵幂:
In [475]: np.mat([[1,2],[3,4]])**2
Out[475]:
matrix([[ 7, 10],
[15, 22]])
元素方格:
In [476]: np.array([[1,2],[3,4]])**2
Out[476]:
array([[ 1, 4],
[ 9, 16]])
In [477]: np.power(np.mat([[1,2],[3,4]]),2)
Out[477]:
matrix([[ 1, 4],
[ 9, 16]])
矩阵功效:
In [478]: arr = np.array([[1,2],[3,4]])
In [479]: arr@arr # np.matmul
Out[479]:
array([[ 7, 10],
[15, 22]])
使用非平方矩阵:
In [480]: np.power(np.mat([[1,2]]),2)
Out[480]: matrix([[1, 4]]) # elementwise
尝试在非平方矩阵上进行matrix_power
:
In [481]: np.mat([[1,2]])**2
---------------------------------------------------------------------------
LinAlgError Traceback (most recent call last)
<ipython-input-481-18e19d5a9d6c> in <module>()
----> 1 np.mat([[1,2]])**2
/usr/local/lib/python3.6/dist-packages/numpy/matrixlib/defmatrix.py in __pow__(self, other)
226
227 def __pow__(self, other):
--> 228 return matrix_power(self, other)
229
230 def __ipow__(self, other):
/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py in matrix_power(a, n)
600 a = asanyarray(a)
601 _assertRankAtLeast2(a)
--> 602 _assertNdSquareness(a)
603
604 try:
/usr/local/lib/python3.6/dist-packages/numpy/linalg/linalg.py in _assertNdSquareness(*arrays)
213 m, n = a.shape[-2:]
214 if m != n:
--> 215 raise LinAlgError('Last 2 dimensions of the array must be square')
216
217 def _assertFinite(*arrays):
LinAlgError: Last 2 dimensions of the array must be square
请注意,整个回溯都列出了matrix_power
。这就是为什么我们经常要求查看整个追溯。
为什么将x
,y
和theta
设置为np.mat
? cost_function
使用matmul
。使用该功能及其@
运算符,使用np.matrix
的理由很少。
尽管有主题行,但您并未尝试使用pow
。这使我和至少另一位评论员感到困惑。我试图找到np.pow
或scipy
的版本。