로지스틱 회귀 분석에서 비용 함수의 파이썬 구현


18

로지스틱 회귀 설정에서 파이썬, numpy 및 행렬의 곱셈과 관련된 매우 기본적인 질문이 있습니다.

먼저, 수학 표기법을 사용하지 않은 것에 대해 사과드립니다.

매트릭스 도트 곱셈과 요소 별 곱셈의 사용에 대해 혼란 스럽습니다. 비용 함수는 다음과 같이 제공됩니다.

여기에 이미지 설명을 입력하십시오

그리고 파이썬에서 나는 이것을 다음과 같이 썼다.

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

그러나 예를 들어이 표현 (첫 번째 표현-w에 대한 J의 파생어)

여기에 이미지 설명을 입력하십시오

이다

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

위의 점 곱셈을 사용하는 것이 올바른 이유를 이해하지 못하지만 비용 함수에 요소 별 곱셈을 사용하십시오.

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

나는 이것이 정교하게 설명되지 않았다는 것을 완전히 얻었지만 기본적인 로지스틱 회귀 경험을 가진 사람이라면 누구나 내 문제를 이해할 수있을 정도로 질문이 너무 간단하다고 생각합니다.


2
yilog(ai)Y * np.log(A)X(AY)Tnp.dot(X, dz.T)

2
고마워 닐 애매하게해서 죄송합니다. 두번째. 나는 수학 공식을 이해합니다. 한 점에서는 점 곱셈에 대한 직관과 다른 점에서는 요소 현명한 곱셈에 대해 머리를 맞출 수 없습니다.
GhostRider

답변:


12

이 경우 두 수학 공식은 올바른 곱셈 유형을 보여줍니다.

  • yilog(ai)ya

  • ABC=ABCik=jAijBjknp.dot

부분적으로 혼란은 더 복잡한 시나리오를 기대하는 과정 자료의 방정식에 적용된 벡터화 에서 비롯됩니다 . 당신은 사실 사용 할 수 cost = -1/m * np.sum( np.multiply(np.log(A), Y) + np.multiply(np.log(1-A), (1-Y)))또는 cost = -1/m * np.sum( np.dot(np.log(A), Y.T) + np.dot(np.log(1-A), (1-Y.T)))동안 YA모양을 가지고 (m,1)있으며 동일한 결과를 제공해야합니다. NB는 np.sum그중 하나의 값을 평탄화하므로 값을 버리고 대신 [0,0]에 끝낼 수 있습니다. 그러나 이것은 다른 출력 형태로 일반화 (m,n_outputs)되지 않으므로 코스에서 사용하지 않습니다.


1
닐-네 맞습니다. Andrew Ngs 새로운 DL 과정. 또한 귀하의 답변은 완벽합니다. 입력 해 주셔서 감사합니다.
GhostRider

"그래서 y의 각 요소는 기본적으로 요소의 정의 인 a의 일치하는 요소와 만 상호 작용합니다."
GhostRider

2

두 벡터의 내적과 요소 별 곱을 합산하는 것의 차이점은 무엇입니까? 그들은 동일합니다.np.sum(X * Y)입니다 np.dot(X, Y). 도트 버전은 일반적으로보다 효율적이고 이해하기 쉽습니다.

Ynp.dot

답은 서로 다른 작업을 수행하는 다른 작업이며 이러한 상황은 다르며 주요 차이점은 벡터 대 행렬을 처리하는 것입니다.


감사. 그것은 내가 요구하는 것이 아닙니다. 비용 함수 (마지막 코드)에 대한 대체 코드를 참조하십시오. 이것은 올바르지 않지만 왜 잘못된 지 이해하려고합니다.
GhostRider

2
영업의 경우에 np.sum(a * y)동일하게 설정하지 않을 np.dot(a, y)때문에 ay열 벡터이다 형상 (m,1)소위, dot함수가 에러를 발생한다. 표기법과 코드가 정확히 일치하기 때문에 이것이 coursera.org/learn/neural-networks-deep-learning (최근에 살펴 본 과정 )의 모든 것 입니다.
Neil Slater

0

"OP의 경우 np.sum (a * y)는 np.dot (a, y)와 같지 않습니다. a와 y는 열 벡터 모양 (m, 1)이므로 점 함수는 오류가 발생했습니다. "...

(댓글 버튼을 사용하여 댓글을 달기에 충분한 명도가 없지만 추가 할 것이라고 생각했습니다 ..)

벡터가 열 벡터이고 모양 (1, m)을 갖는 경우 일반적인 패턴은 점 함수의 두 번째 연산자에 ".T"연산자를 붙여서 모양 (m, 1)으로 바꾼 다음 점입니다. 제품은 (1, m)으로 작동합니다. (m, 1). 예 :

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

m에 대한 공통 값은 내적 (행렬 곱셈)을 적용 할 수있게합니다.

마찬가지로 열 벡터의 경우 첫 번째 숫자 (예 : np.dot (wT, X))에 전치가 적용되어 '중간'에> 1 인 차원을 넣는 것을 볼 수 있습니다.

np.dot에서 스칼라를 얻는 패턴은 두 개의 벡터 모양을 '외부'에서 '1'치수를 가지며 '내부'에서 공통> 1 치수를 갖도록하는 것입니다.

(1, X). (X, 1) 또는 np.dot (V1, V2) 여기서 V1은 모양 (1, X)이고 V2는 모양 (X, 1)입니다

따라서 결과는 (1,1) 행렬, 즉 스칼라입니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.