Implementasi python fungsi biaya dalam regresi logistik: mengapa dot perkalian dalam satu ekspresi tetapi perkalian elemen-bijaksana di lain

18

Saya punya pertanyaan yang sangat mendasar yang berkaitan dengan Python, numpy dan perkalian matriks dalam pengaturan regresi logistik.

Pertama, izinkan saya meminta maaf karena tidak menggunakan notasi matematika.

Saya bingung tentang penggunaan multiplikasi matriks dot versus elemen pultiplication. Fungsi biaya diberikan oleh:

masukkan deskripsi gambar di sini

Dan dengan python saya telah menulis ini sebagai

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

Tapi misalnya ungkapan ini (yang pertama - turunan dari J sehubungan dengan w)

masukkan deskripsi gambar di sini

adalah

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

Saya tidak mengerti mengapa benar menggunakan dot multiplikasi di atas, tetapi gunakan elemen multiplikasi bijaksana dalam fungsi biaya yaitu mengapa tidak:

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

Saya sepenuhnya mengerti bahwa ini tidak dijelaskan secara terperinci tetapi saya menduga bahwa pertanyaannya sangat sederhana sehingga siapa pun yang bahkan dengan pengalaman regresi logistik dasar akan memahami masalah saya.

Hantu pengendara
sumber
2
yilog(ai)Y * np.log(A)X(AY)Tnp.dot(X, dz.T)
2
Terima kasih, Neil. Maaf atas ambiguitasnya. Kedua. Saya mengerti rumus matematika. Saya hanya tidak bisa mendapatkan intuisi untuk multiplikasi titik dalam satu, dan elemen multiplikasi bijak dalam yang lain
GhostRider

Jawaban:

12

Dalam hal ini, dua rumus matematika menunjukkan kepada Anda jenis perkalian yang benar:

  • yilog(ai)ya

  • ABC=ABCik=jAijBjknp.dot

Sebagian kebingungan Anda berasal dari vektorisasi yang telah diterapkan pada persamaan dalam materi kursus, yang menantikan skenario yang lebih kompleks. Anda sebenarnya bisa menggunakan cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))atau cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))sementara Ydan Amemiliki bentuk (m,1)dan itu harus memberikan hasil yang sama. NB np.sumhanya meratakan nilai tunggal dalam hal itu, sehingga Anda bisa menjatuhkannya dan malah memilikinya [0,0]pada akhirnya. Namun, ini tidak menggeneralisasi ke bentuk output lain (m,n_outputs)sehingga tentu saja tidak menggunakannya.

Neil Slater
sumber
1
Neil - Ya, Anda benar. Andrew Ngs kursus DL baru. Dan juga jawaban Anda masuk akal. Terima kasih atas masukannya.
GhostRider
"Jadi setiap elemen y hanya berinteraksi dengan elemen yang cocok dalam a, yang pada dasarnya adalah definisi elemen-bijaksana" - penjelasan yang sangat jelas.
GhostRider
2

Apakah Anda bertanya, apa perbedaan antara produk titik dari dua vektor, dan menjumlahkan produk elementwise mereka? Mereka sama. np.sum(X * Y)adalah np.dot(X, Y). Versi dot akan lebih efisien dan mudah dimengerti, secara umum.

Ynp.dot

Jadi saya kira jawabannya adalah mereka berbeda operasi melakukan hal yang berbeda, dan situasi ini berbeda, dan perbedaan utama adalah berurusan dengan vektor versus matriks.

Sean Owen
sumber
Terima kasih. Bukan itu yang saya tanyakan. Lihat kode alternatif yang saya miliki untuk fungsi biaya (bit kode terakhir). Ini tidak benar, tetapi saya mencoba memahami mengapa itu salah.
GhostRider
2
Dalam kasus OP np.sum(a * y)tidak akan sama seperti np.dot(a, y)karena adan yberbentuk vektor kolom (m,1), sehingga dotfungsi akan menimbulkan kesalahan. Saya cukup yakin ini semua dari coursera.org/learn/neural-networks-deep-learning (kursus yang baru saja saya lihat baru-baru ini), karena notasi dan kode adalah pasangan yang tepat.
Neil Slater
0

Berkenaan dengan "Dalam kasus OP np.sum (a * y) tidak akan sama dengan np.dot (a, y) karena a dan y adalah vektor bentuk kolom (m, 1), sehingga fungsi titik akan menimbulkan kesalahan. "...

(Saya tidak punya cukup pujian untuk berkomentar menggunakan tombol komentar tapi saya pikir saya akan menambahkan ..)

Jika vektor adalah vektor kolom dan memiliki bentuk (1, m), pola umum adalah bahwa operator kedua untuk fungsi titik adalah postfixed dengan operator ".T" untuk mengubahnya menjadi bentuk (m, 1) dan kemudian titik produk berfungsi sebagai (1, m). (m, 1). misalnya

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

Nilai umum untuk m memungkinkan produk titik (perkalian matriks) diterapkan.

Demikian pula untuk vektor kolom kita akan melihat transpos diterapkan ke angka pertama misalnya np.dot (wT, X) untuk menempatkan dimensi yang> 1 di 'tengah'.

Pola untuk mendapatkan skalar dari np.dot adalah mendapatkan dua bentuk vektor untuk memiliki dimensi '1' di 'luar' dan umum> 1 dimensi di 'dalam':

(1, X). (X, 1) atau np.dot (V1, V2) Di mana V1 adalah bentuk (1, X) dan V2 adalah bentuk (X, 1)

SO hasilnya adalah matriks (1,1), yaitu skalar.

Gordon Hutchison
sumber