使用**和pow功能的区别

时间:2018-11-01 07:24:14

标签: python-3.x numpy linear-regression

尝试编写用于线性回归的成本函数时,在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个维必须是正方形的

1 个答案:

答案 0 :(得分:1)

首先让我们区分pow**np.powerpow是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。这就是为什么我们经常要求查看整个追溯。

为什么将xytheta设置为np.matcost_function使用matmul。使用该功能及其@运算符,使用np.matrix的理由很少。

尽管有主题行,但您并未尝试使用pow。这使我和至少另一位评论员感到困惑。我试图找到np.powscipy的版本。