То, что вы делаете в первом примере, во втором блоке вы пропустили шаг, не так ли? Я предполагаю, что вы объединили X с вектором из единиц.
temp=X(:,2) * temp
Последний пример будет работать, но его можно еще больше векторизовать, чтобы сделать его более простым и эффективным.
Я предположил, что у вас есть только 1 функция. он будет работать одинаково с несколькими функциями, поскольку все, что происходит, это добавление дополнительного столбца в матрицу X для каждой функции. В основном вы добавляете вектор из единиц к x, чтобы векторизовать перехват.
Вы можете обновить матрицу тета 2x1 в одной строке кода. С помощью x соедините вектор из единиц, сделав его матрицей nx2, тогда вы можете вычислить h(x) путем умножения на тета-вектор (2x1), это (X * тета) бит.
Вторая часть векторизации заключается в транспонировании (X * тета) - y), что дает вам матрицу 1 * n, которая при умножении на X (матрица n * 2) будет в основном объединять оба (h (x) -y) x0 и (h(x)-y)x1. По определению оба тета выполняются одновременно. Это приводит к матрице 1 * 2 моих новых тета, которые я просто снова транспонирую, чтобы перевернуть вектор, чтобы он был тех же размеров, что и тета-вектор. Затем я могу выполнить простое скалярное умножение на альфа и векторное вычитание с тета.
X = data(:, 1); y = data(:, 2);
m = length(y);
X = [ones(m, 1), data(:,1)];
theta = zeros(2, 1);
iterations = 2000;
alpha = 0.001;
for iter = 1:iterations
theta = theta -((1/m) * ((X * theta) - y)' * X)' * alpha;
end
person
Shaun Ryan
schedule
19.03.2014
tmpTheta1= theta(1) - alpha * (1/m) * ((X * theta) - y)' * X(:, 1); tmpTheta2= theta(2) - alpha * (1/m) * ((X * theta) - y)' * X(:, 2);
theta(1)=tmpTheta1;
theta(2)=tmpTheta2;
- person Einar Sundgren   schedule 29.04.2013