Python thực hiện hàm chi phí trong hồi quy logistic: tại sao phép nhân dấu chấm trong một biểu thức nhưng phép nhân phần tử trong một biểu thức khác


18

Tôi có một câu hỏi rất cơ bản liên quan đến Python, numpy và phép nhân của ma trận trong thiết lập hồi quy logistic.

Đầu tiên, hãy để tôi xin lỗi vì đã không sử dụng ký hiệu toán học.

Tôi bối rối về việc sử dụng phép nhân chấm ma trận so với pultiplication phần tử. Hàm chi phí được đưa ra bởi:

nhập mô tả hình ảnh ở đây

Và trong python tôi đã viết điều này như

    cost = -1/m * np.sum(Y * np.log(A) + (1-Y) * (np.log(1-A)))

Nhưng ví dụ biểu thức này (biểu thức đầu tiên - đạo hàm của J liên quan đến w)

nhập mô tả hình ảnh ở đây

   dw = 1/m * np.dot(X, dz.T)

Tôi không hiểu tại sao sử dụng phép nhân dấu chấm ở trên là đúng, nhưng sử dụng phép nhân phần tử trong hàm chi phí tức là tại sao không:

   cost = -1/m * np.sum(np.dot(Y,np.log(A)) + np.dot(1-Y, np.log(1-A)))

Tôi hoàn toàn hiểu rằng điều này không được giải thích công phu nhưng tôi đoán rằng câu hỏi rất đơn giản đến nỗi bất kỳ ai có kinh nghiệm hồi quy logistic cơ bản cũng sẽ hiểu vấn đề của tôi.


2
Bạn đang đặt câu hỏi cho các công thức toán học, hoặc bản dịch giữa các công thức toán học và mã? Tức là bạn có muốn biết tại sao hàm chi phí được biểu thị dưới dạng tổng và phép tính độ dốc được biểu thị dưới dạng phép nhân ma trận; hoặc bạn có muốn hiểu tại sao trở thành trong khi trở thành ? X ( A - Y ) Tyilog(ai)Y * np.log(A)X(AY)Tnp.dot(X, dz.T)
Neil Slater

2
Cảm ơn Neil. Xin lỗi vì sự mơ hồ. Thư hai. Tôi hiểu các công thức toán học. Tôi chỉ không thể hiểu được trực giác của phép nhân số chấm trong một và nhân số khôn ngoan trong cái kia
GhostRider

Câu trả lời:


12

Trong trường hợp này, hai công thức toán học cho bạn thấy kiểu nhân chính xác:

  • đăng nhập ( a i ) y ayi và trong hàm chi phí là các giá trị vô hướng. Việc kết hợp các giá trị vô hướng thành một tổng nhất định cho mỗi ví dụ sẽ không thay đổi điều này và bạn không bao giờ kết hợp các giá trị của một ví dụ với giá trị khác trong tổng này. Vì vậy, mỗi phần tử của chỉ tương tác với phần tử phù hợp của nó trong , về cơ bản là định nghĩa của phần tử khôn ngoan.log(ai)ya

  • Các thuật ngữ trong tính toán độ dốc là ma trận và nếu bạn thấy hai ma trận và nhân lên bằng cách sử dụng ký hiệu như , thì bạn có thể viết nó thành một tổng phức hơn: . Đây là tổng số bên trong qua nhiều điều khoản đang thực hiện.B C = A B C i k = j A i j B j kABC=ABCik=jAijBjknp.dot

Một phần là sự nhầm lẫn của bạn bắt nguồn từ việc vector hóa đã được áp dụng cho các phương trình trong tài liệu khóa học, vốn đang mong chờ các kịch bản phức tạp hơn. Trong thực tế bạn có thể sử dụng cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))hoặc cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))trong khi YAcó hình dạng (m,1)và nó sẽ cho kết quả tương tự. NB np.sumchỉ là làm phẳng một giá trị duy nhất trong đó, vì vậy bạn có thể bỏ nó và thay vào đó có [0,0]kết thúc. Tuy nhiên, điều này không khái quát cho các hình dạng đầu ra khác (m,n_outputs)nên khóa học không sử dụng nó.


1
Neil - Vâng, bạn đúng. Khóa học DL mới của Andrew Ngs. Và cũng là câu trả lời của bạn làm cho ý nghĩa hoàn hảo. Cảm ơn các đầu vào.
GhostRider

"Vì vậy, mỗi phần tử của y chỉ tương tác với phần tử phù hợp của nó trong một, về cơ bản là định nghĩa của phần tử khôn ngoan" - giải thích vô cùng sáng suốt.
GhostRider

2

Bạn có hỏi, sự khác biệt giữa một sản phẩm chấm của hai vectơ và tổng hợp sản phẩm nguyên tố của chúng là gì không? Họ giống nhau. np.sum(X * Y)np.dot(X, Y). Phiên bản chấm sẽ hiệu quả hơn và dễ hiểu, nói chung.

Nhưng trong hàm chi phí, là một ma trận, không phải là một vectơ. thực sự tính toán một sản phẩm ma trận và tổng của các phần tử đó không giống với tổng các phần tử của sản phẩm cặp. (Phép nhân thậm chí sẽ không được xác định cho các trường hợp tương tự.)Ynp.dot

Vì vậy, tôi đoán câu trả lời là các hoạt động khác nhau của chúng làm những việc khác nhau và những tình huống này là khác nhau và sự khác biệt chính là xử lý các vectơ so với ma trận.


Cảm ơn. Đó không phải là những gì tôi đang hỏi. Xem mã thay thế tôi có cho hàm chi phí (bit cuối cùng của mã). Điều này không chính xác, nhưng tôi đang cố gắng hiểu tại sao nó không chính xác.
GhostRider

2
Trong trường hợp của OP np.sum(a * y)sẽ không giống như np.dot(a, y)aylà hình dạng vectơ cột (m,1), do đó dothàm sẽ gây ra lỗi. Tôi khá chắc chắn đây là tất cả từ coursera.org/learn/neural-networks-deep-learning (một khóa học tôi mới xem gần đây), bởi vì ký hiệu và mã là một kết hợp chính xác.
Neil Slater

0

Liên quan đến "Trong trường hợp của OP, np.sum (a * y) sẽ không giống với np.dot (a, y) vì a và y là hình dạng vectơ cột (m, 1), vì vậy hàm chấm sẽ đưa ra một lỗi. "...

(Tôi không có đủ danh tiếng để bình luận bằng nút bình luận nhưng tôi nghĩ tôi sẽ thêm ..)

Nếu các vectơ là vectơ cột và có hình dạng (1, m), một mẫu phổ biến là toán tử thứ hai cho hàm dấu chấm được đặt trước một toán tử ".T" để hoán chuyển nó thành hình dạng (m, 1) và sau đó là dấu chấm sản phẩm hoạt động như một (1, m). (m, 1). ví dụ

np.dot (np.log (1-A), (1-Y) .T)

Giá trị chung cho m cho phép sản phẩm chấm (nhân ma trận) được áp dụng.

Tương tự như vậy đối với các vectơ cột, người ta sẽ thấy chuyển vị được áp dụng cho số đầu tiên, ví dụ np.dot (wT, X) để đặt kích thước> 1 ở giữa 'giữa'.

Mẫu để lấy vô hướng từ np.dot là lấy hai hình dạng vectơ để có kích thước '1' ở 'bên ngoài' và chiều chung> 1 trên 'bên trong':

(1, X). (X, 1) hoặc np.dot (V1, V2) Trong đó V1 là hình dạng (1, X) và V2 là hình dạng (X, 1)

Vì vậy, kết quả là một ma trận (1,1), tức là vô hướng.

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.