[英]Different results in numpy vs matlab
I'm trying to implement a gradient descent algorithm that was previously written in matlab in python with numpy, but I'm getting a set of similar but different results. 我正在尝试实现以前用numpy在python中用matlab编写的梯度下降算法,但是我得到了一组相似但不同的结果。
Here's the matlab code 这是Matlab代码
function [theta] = gradientDescentMulti(X, y, theta, alpha, num_iters)
m = length(y);
num_features = size(X,2);
for iter = 1:num_iters;
temp_theta = theta;
for i = 1:num_features
temp_theta(i) = theta(i)-((alpha/m)*(X * theta - y)'*X(:,i));
end
theta = temp_theta;
end
end
and my python version 和我的python版本
def gradient_descent(X,y, alpha, trials):
m = X.shape[0]
n = X.shape[1]
theta = np.zeros((n, 1))
for i in range(trials):
temp_theta = theta
for p in range(n):
thetaX = np.dot(X, theta)
tMinY = thetaX-y
temp_theta[p] = temp_theta[p]-(alpha/m)*np.dot(tMinY.T, X[:,p:p+1])
theta = temp_theta
return theta
Test case and results in matlab Matlab中的测试用例和结果
X = [1 2 1 3; 1 7 1 9; 1 1 8 1; 1 3 7 4]
y = [2 ; 5 ; 5 ; 6];
[theta] = gradientDescentMulti(X, y, zeros(4,1), 0.01, 1);
theta =
0.0450
0.1550
0.2225
0.2000
test case and result in python 测试用例和python中的结果
test_X = np.array([[1,2,1,3],[1,7,1,9],[1,1,8,1],[1,3,7,4]])
test_y = np.array([[2], [5], [5], [6]])
theta, cost = gradient_descent(test_X, test_y, 0.01, 1)
print theta
>>[[ 0.045 ]
[ 0.1535375 ]
[ 0.20600144]
[ 0.14189214]]
This line in your Python: Python中的这一行:
temp_theta = theta
doesn't do what you think it does. 不按照您的想法去做。 It doesn't make a copy of
theta
and "assign" it to the "variable" temp_theta
-- it just says " temp_theta
is now a new name for the object currently named by theta
". 它不会复制
theta
并将其“分配”给“变量” temp_theta
-只是说“ temp_theta
现在是当前由theta
命名的对象的新名称”。
So when you modify temp_theta
here: 因此,当您在此处修改
temp_theta
:
temp_theta[p] = temp_theta[p]-(alpha/m)*np.dot(tMinY.T, X[:,p:p+1])
You're actually modifying theta
-- because there's only the one array, now with two names. 您实际上是在修改
theta
因为只有一个数组,现在有两个名称。
If you instead write 如果你写
temp_theta = theta.copy()
you'll get something like 你会得到类似
(3.5) dsm@notebook:~/coding$ python peter.py
[[ 0.045 ]
[ 0.155 ]
[ 0.2225]
[ 0.2 ]]
which matches your Matlab results. 与您的Matlab结果匹配。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.