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:
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)
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.
sumber
Y * np.log(A)
np.dot(X, dz.T)
Jawaban:
Dalam hal ini, dua rumus matematika menunjukkan kepada Anda jenis perkalian yang benar:
np.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)))
ataucost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))
sementaraY
danA
memiliki bentuk(m,1)
dan itu harus memberikan hasil yang sama. NBnp.sum
hanya 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.sumber
Apakah Anda bertanya, apa perbedaan antara produk titik dari dua vektor, dan menjumlahkan produk elementwise mereka? Mereka sama.
np.sum(X * Y)
adalahnp.dot(X, Y)
. Versi dot akan lebih efisien dan mudah dimengerti, secara umum.np.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.
sumber
np.sum(a * y)
tidak akan sama sepertinp.dot(a, y)
karenaa
dany
berbentuk vektor kolom(m,1)
, sehinggadot
fungsi 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.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.
sumber