创建通用代码

时间:2017-01-12 06:24:08

标签: matlab octave

我一直致力于创建一个通用方程来计算theta函数。我目前的等式并不普遍。这适用于最多2个thetas。如果我必须对theta进行2以上的计算,我必须手动修改theta()括号内的数字。

有没有办法设置通用功能?像thata(j) = equation这样的东西。我在下面粘贴了两个代码,一个正在工作但不是通用的,另一个是我尝试过的,但最终仍然出错。

代码1:

for iter = 1:num_iters


    theta(1) = theta(1) - (alpha/m)*((X*theta-y)')*X(:,1),
    theta(2) = theta(2) - (alpha/m)*((X*theta-y)')*X(:,2);
    theta_hist(iter,1) = theta(1);
    theta_hist(iter,2) = theta(2);

end

代码2:

num_cols = size(X,2)
for inter = 1:num_iters
    for j = 1:num_cols
        theta(j) = theta(j) - (alpha/m)*((X*theta-y)')*X(:,j),
    end,
end, 

此代码的挑战是代码第二次循环(i = 1,j = 2)。该函数使用theta的新值。这搞砸了计算。

非常感谢任何反馈或建议。

以下链接中提到了此问题的更多说明: https://docs.google.com/document/d/1XwAVV1OBN9BhQ7n60F2oEUoT263t_2hcAAuCaroR-2g/edit?usp=sharing

2 个答案:

答案 0 :(得分:1)

经过多次迭代,我能够回答我自己的问题。

代码发布在github的以下链接中: https://github.com/Boniface316/Octave/tree/master/GradientDescent_ThetaCalculator

感谢您的帮助。

答案 1 :(得分:0)

您应该对代码进行矢量化。您没有提供矩阵尺寸和/或样本输入,但如果我猜对了,以下内容应该可以满足您的需求:

% Some random inputs
alpha = 1;
m = 1;
num_iters = 15;
N = 5; k = 12;
X = randn(k,N);
y = randn(k,1);

theta = zeros(N,1);
theta_hist = zeros(N,num_iters);
for i = 1:num_iters
    theta = theta - (alpha/m)*X'*(X*theta-y);
    theta_hist(:,i) = theta;
end