改变矩阵的值并赋值

时间:2018-05-25 10:56:45

标签: python numpy machine-learning

以下基于http://www.johnwittenauer.net/machine-learning-exercises-in-python-part-1/的代码

theta = np.matrix(np.array([0, 0]))
def computeCost(X, y, theta, iterations, alpha):

    temp = np.matrix(np.zeros(theta.shape))
    m = len(X)
    theta_trans = theta.T
    for j in range(iterations):
        hyp = np.dot(X, theta_trans)-y

        term = np.multiply(hyp, X[:,0])
        temp[0,0] = theta[0,0] - ((alpha / len(X)) * np.sum(term))

        term = np.multiply(hyp, X[:,1])
        temp[0,1] = theta[0,1] - ((alpha / len(X)) * np.sum(term))

        theta = temp
        theta_trans = theta.T
    return theta

然而,当我直接使用theta代替temp时,例如theta[0,0] = theta[0,0] - ((alpha / len(X)) * np.sum(term)))并注释掉theta = temp我总是得到0和0为theta。

当我在函数外做类似的操作时,θ会被改变。例如,

theta = np.matrix(np.array([0,0]))
theta[0,0] = theta[0,0] - 1
print(theta)

theta显示为[-1,0]。

为什么这种类型的赋值在函数内部不起作用?

1 个答案:

答案 0 :(得分:0)

一个可能的解释:它是类型的问题(int vs float)。

作业

theta = np.matrix(np.array([0, 0]))

创建一个整数矩阵。直接分配其系数时,有一些隐式转换为整数:

>>> m = np.matrix(np.array([0, 0]))
>>> m
matrix([[0, 0]])
>>> m[0,0] = 0.5    # float
>>> m
matrix([[0, 0]])    # no effect, 0.5 converted to 0
>>> m[0,0] = 1      # int
>>> m
matrix([[1, 0]])

相反,temp变量是一个浮点矩阵(因为np.zeros在未指定dtype时创建一个浮点数组),因此浮点数的赋值按预期工作。

所以只需将theta直接声明为浮点数矩阵,你就可以了。