我猜函数参数不会改变原始变量。例如
x=10
def mycal(someval):
someval = someval * 2
return someval
如果我调用该函数,它将返回 20:
mycal(x)
20
但是x的值还是10:
x
10
为什么当我运行这段代码时 theta 值变成了 3.7 和 3.2?
import numpy as np
X = 2 * np.random.rand(100,1)
y = 4 +3 * X+np.random.randn(100,1)
def predict_func(slope,intercept,x_test):
pred = ((np.dot(x_test, slope)) + intercept)
return pred
def mse_calc(prediction, y_test):
error = np.mean((prediction - y_test)**2)
return error
def grad_descent(s_theta, l_rate, tolerance, iter_val, x_train, y_train):
n_data = len(x_train)
bias = np.ones((n_data,1))
s_intercept = s_theta[0]
s_slope = s_theta[1:]
prediction = predict_func(s_slope, s_intercept, x_train)
error = mse_calc(prediction, y_train)
x_train_b = np.append(bias, x_train, axis = 1)
for i in range(iter_val):
int_theta = [0 for i in range(len(x_train[0]) + 1)]
n_pt = float(len(x_train))
prediction = predict_func(s_slope, s_intercept, x_train)
int_theta = 2 / n_pt * np.dot(x_train_b.T, (prediction - y_train))
s_theta -= l_rate * int_theta
s_intercept = s_theta[0]
s_slope = s_theta[1:]
prediction = predict_func(s_slope, s_intercept, x_train)
final_error = mse_calc(prediction, y_train)
return s_theta, final_error
theta = np.zeros((len(X[0]) + 1, 1))
tolerance = 0.0001
l_rate = 0.01
iterations = 5000
print (theta)
grad_theta, grad_error = grad_descent(theta, l_rate, tolerance, iterations, X, y)
print (theta)
我希望 theta 值仍然为 0 而 grad_theta 应该是 3.7
在下面的示例中,第一个是重新定义变量,而接下来的两个是指针并附加可变对象。
some_list = some_list + [2]
some_list.append(2)
some_list += [2]
+= 关闭选项 2 而不是我预期的选项 1。
+= 和 -= 到底是什么?
请您参考如下方法:
someval = someval * 2
这重新定义了 someval。重新定义后 x 和 someval 不再引用同一个对象,因此这不会修改 x。
s_theta -= l_rate * int_theta
这会改变 s_theta,不会重新定义它,因此这也会影响 theta 的值,因为 s_theta 和 theta 仍然引用同一个对象。
