以下基于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]。
为什么这种类型的赋值在函数内部不起作用?
答案 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
直接声明为浮点数矩阵,你就可以了。