Lojistik regresyonda maliyet fonksiyonunun Python uygulaması: neden bir ifadede nokta çarpımı ancak başka bir ifadede eleman-bilge çarpımı


19

Lojistik regresyon ortamında matrislerin Python, numpy ve çarpımı ile ilgili çok temel bir sorum var.

İlk olarak, matematik notasyonunu kullanmadığım için özür dilerim.

Ben akıllıca pultiplication karşı matris nokta çarpma kullanımı hakkında karıştı. Maliyet fonksiyonu şu şekilde verilir:

resim açıklamasını buraya girin

Ve python'da bunu şöyle yazdım

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

Ancak örneğin bu ifade (birincisi - J'nin w'ye göre türevi)

resim açıklamasını buraya girin

dır-dir

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

Yukarıdaki nokta çarpma neden doğru olduğunu anlamıyorum, ama maliyet fonksiyonunda eleman akıllı çarpma yani neden kullanmayın:

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

Bunun ayrıntılı olarak açıklanmadığını tam olarak anlıyorum, ancak sorunun o kadar basit olduğunu tahmin ediyorum ki, temel lojistik regresyon deneyimi olan herkes bile benim sorunumu anlayacak.


2
Matematik formüllerini mi yoksa matematik formülleri ile kod arasındaki çeviriyi mi soruyorsunuz? Yani maliyet fonksiyonunun neden toplam olarak ve degrade hesaplamasının bir matris çarpımı olarak ifade edildiğini bilmek istersiniz ; ya neden anlamak istiyorum yapmak olur iken olur ? X ( A - Y ) Tyilog(ai)Y * np.log(A)X(AY)Tnp.dot(X, dz.T)
Neil Slater

2
Teşekkürler Neil. Belirsizlik için özür dilerim. İkinci. Matematik formüllerini anlıyorum. Birinde nokta çarpımı için sezginin etrafında kafamı bulamıyorum, diğerinde element bilge çarpımı
GhostRider

Yanıtlar:


12

Bu durumda, iki matematik formülü size doğru çarpma türünü gösterir:

  • günlüğe yazıyorum ( a i ) y ayimaliyet fonksiyonundaki ve skaler değerlerdir. Her örnek üzerinde skaler değerlerin belirli bir toplamda oluşturulması bunu değiştirmez ve bu örneğin hiçbirinde bir örneğin değerlerini başka bir değerle birleştirmezsiniz. Her bir elemanı Yani kendi eşleştirme elemanı ıle tek etkileşimde temel elemanın-bazlı tanımıdır.log(ai)ya

  • Degrade hesaplamasındaki terimler matrislerdir ve iki ve matrisi gibi gösterimi kullanarak çarpılırsa , bunu daha karmaşık bir toplam olarak yazabilirsiniz: . Gerçekleştirilen birden fazla terimdeki bu iç toplamdır .B C = A B C i k = j A i j B j kABC=ABCik=jAijBjknp.dot

Kısmen karışıklığınız , ders materyallerindeki denklemlere uygulanan ve daha karmaşık senaryoları dört gözle bekleyen vektörizasyondan kaynaklanır . Sen aslında kullanımda olabilir cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))veya cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))ederken Yve Aşekle sahip (m,1)ve aynı sonucu vermelidir. Not, np.sumbu sadece tek bir değeri düzleştiriyor, böylece onu düşürebilir ve bunun yerine [0,0]sonunda olabilirsiniz. Bununla birlikte, bu diğer çıktı şekillerine genelleme yapmaz, bu (m,n_outputs)nedenle kurs bunu kullanmaz.


1
Neil - Evet, haklısın. Andrew Ngs yeni DL kursu. Ayrıca cevabınız da mükemmel. Giriş için teşekkürler.
GhostRider

"Yani y'nin her elemanı, temelde element-wise'ın tanımı olan a'daki eşleşen elemanıyla etkileşime girer" - inanılmaz derecede açıklayıcı açıklama.
GhostRider

2

İki vektörün bir nokta ürünü ile elementli ürünlerinin toplanması arasındaki fark nedir diye soruyor musunuz? Onlar aynı. np.sum(X * Y)olduğunu np.dot(X, Y). Nokta versiyonu genellikle daha verimli ve kolay anlaşılır olacaktır.

Ancak maliyet fonksiyonunda, bir vektör değil, bir matristir. gerçekte bir matris ürünü hesaplar ve bu elemanların toplamı, çiftli ürünün elemanlarının toplamı ile aynı değildir. (Çarpma aynı durumlar için tanımlanmayacak bile.)Ynp.dot

Sanırım cevap, farklı şeyler yapan farklı işlemler oldukları ve bu durumların farklı olduğu ve ana farkın vektörler ile matrislerle uğraştığıdır.


Teşekkürler. Sorduğum şey tam olarak bu değil. Maliyet fonksiyonu (kodun son biti) için sahip olduğum alternatif koda bakınız. Bu yanlış, ama neden yanlış olduğunu anlamaya çalışıyorum.
GhostRider

2
OP durumunda np.sum(a * y), np.dot(a, y)çünkü aynı değildir ave ysütun vektörleri şekli vardır (m,1), bu nedenle dotişlev bir hata ortaya çıkarır. Bunların hepsinin coursera.org/learn/neural-networks-deep-learning'den (son zamanlarda baktığım bir ders) olduğundan eminim , çünkü gösterim ve kod tam bir eşleşme.
Neil Slater

0

"OP'nin durumunda np.sum (a * y) np.dot (a, y) ile aynı olmayacaktır, çünkü a ve y sütun vektörleri şeklindedir (m, 1), bu nedenle nokta işlevi hata bildir ".

(Yorum düğmesini kullanarak yorum yapmak için yeterli kudosum yok ama ekleyeceğimi düşündüm ..)

Vektörler sütun vektörleriyse ve şekle (1, m) sahipse, ortak bir desen, nokta işlevinin ikinci operatörünün, şekle (m, 1) ve sonra da noktaya dönüştürmek için bir ".T" operatörü ile sonradan sabitlenmesidir. ürün (1, m) olarak çalışır. (m, 1). Örneğin

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

M için ortak değer nokta ürünün (matris çarpımı) uygulanmasını sağlar.

Benzer şekilde, sütun vektörleri için,> 1 olan boyutu 'ortada' koymak için, ilk sayıya uygulanan devri, örneğin np.dot (wT, X) görülebilir.

Np.dot'tan bir skaler elde etmek için desen, iki vektör şeklinin 'dışarıda' 1 'boyutuna ve' içeride 'ortak> 1 boyutuna sahip olmasını sağlamaktır:

(1, X). (X, 1) veya np.dot (V1, V2) V1'in şekil (1, X) ve V2'nin şekil (X, 1) olduğu

Dolayısıyla sonuç bir (1,1) matris, yani bir skalerdir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.