2016-03-11 16 views
5

Tôi đang thực hiện khóa học của Andrew Ng trên Machine Learning và tôi đang cố gắng bọc đầu của mình xung quanh việc thực hiện vectơ của tô chuyển tiếp cho nhiều biến. khóa học.Thực hiện gradient gốc cho nhiều biến trong Octave bằng cách sử dụng "sum"

Đây là thuật toán trong câu hỏi (lấy từ here):

enter image description here

Tôi chỉ không thể làm điều này trong quãng tám sử dụng sum tuy nhiên, tôi không chắc chắn làm thế nào để nhân lên tổng các giả thuyết của x (i) - y (i) bởi tất cả các biến xj (i). Tôi cố gắng lặp khác nhau của mã sau nhưng không có kết quả (một trong hai kích thước là không đúng hoặc câu trả lời là sai):

theta = theta - alpha/m * sum(X * theta - y) * X; 

Câu trả lời đúng, tuy nhiên, là hoàn toàn không rõ ràng (để một người mới bắt đầu đại số tuyến tính như tôi dù sao, từ here):

theta = theta - (alpha/m * (X * theta-y)' * X)'; 

có một quy tắc của ngón tay cái đối với trường hợp sum tham gia chi phối biến đổi như trên? Và nếu có, có phiên bản ngược lại ở trên (tức là đi từ một giải pháp dựa trên sum đến phép nhân nhân) như tôi đã có thể đưa ra một cách thực hiện chính xác bằng cách sử dụng sum cho gradient descent cho một biến duy nhất (ví dụ: sum) (mặc dù không phải là một rất thanh lịch):

temp0 = theta(1) - (alpha/m * sum(X * theta - y)); 
temp1 = theta(2) - (alpha/m * sum((X * theta - y)' * X(:, 2))); 

theta(1) = temp0; 
theta(2) = temp1; 

Xin lưu ý rằng chỉ có những lo ngại này vectorised triển khai và mặc dù có một số câu hỏi về SO như thế nào này được thực hiện, câu hỏi của tôi là chủ yếu quan tâm đến việc thực hiện của thuật toán trong Octave sử dụng sum.

+2

Bản sao có thể có của [Học máy - Phép hồi quy tuyến tính bằng cách sử dụng hàng loạt dốc gốc] (http://stackoverflow.com/questions/32274474/machine-learning-linear-regression- sử dụng batch-gradient-descent) – rayryeng

+1

Nhìn vào liên kết trùng lặp - đặc biệt là cách tiếp cận thứ hai với 'sum'. – rayryeng

Trả lời

4

Tổng "quy tắc của ngón tay cái" được như sau, nếu bạn gặp một cái gì đó theo hình thức

SUM_i f(x_i, y_i, ...) g(a_i, b_i, ...) 

sau đó bạn có thể dễ dàng vectorize nó (và đây là những gì được thực hiện ở trên) thông qua

f(x, y, ...)' * g(a, b, ...) 

Vì đây chỉ là một dấu chấm sản phẩm điển hình, mà trong toán học (trong không gian Euclide của chiều kích hữu hạn) trông giống như

<A, B> = SUM_i A_i B_i = A'B 

do đó

(X * theta-y)' * X) 

chỉ

<X * theta-y), X> = <H_theta(X) - y, X> = SUM_i (H_theta(X_i) - y_i) X_i 

như bạn có thể thấy điều này làm việc cả hai cách là, vì đây chỉ là một định nghĩa toán học của dot sản phẩm.

1

Đề cập đến phần này của câu hỏi của bạn một cách cụ thể - "Tôi không biết cách nhân tổng các giả thuyết của x (i) - y (i) với tất cả các biến xj (i)."

Trong Octave bạn có thể nhân xj (i) với tất cả các dự đoán bằng cách sử dụng ".", do đó, nó có thể được viết là:

m = size(X, 1); 
predictions = X * theta; 
sqrErrors = (predictions-y).^2; 
J = 1/(2*m) * sum(sqrErrors); 
Các vấn đề liên quan