2017-01-10 7 views
2

저는 Coursera의 Professor Andrew Ng 's Machine Learning 코스를하고 있습니다. 비용 함수를 코딩하려고합니다. 비용 함수, sum (x)와 ones (1, length (x))의 차이점은 무엇입니까? x?

내 최초의 솔루션이었다

J= (1/(2*m))* (ones(1,97) * (((X*theta)-y).^2)); 

그러나 그것은 받아 들여지지 않았다, 그래서 나는 합계로 시도 :

J = 1/(2 * m) * sum(((X * theta) - y).^2); 

을하고 받아 들여졌다. 왜 그런지 말해 줄 수 있어요? 내가 바꾼 유일한 것은 사람과 합계 였지만 결과는 여전히 동일했습니다.

답변

5

처음에는 답변이 잘못되었습니다. 그러나 ones 벡터에 97 개의 요소가 하드 코드되어 있습니다. 당신이해야 할 일은 ones 벡터가 훈련 예제만큼 오래 있는지 확인하는 것입니다. 97 요소가 데이터 세트 X에 대해 작동하지 않습니다. 97 요소가 없으므로 다른 모양의 X에서이 항목을 실행하려고하면 호환되지 않는 치수 오류가 발생합니다.

따라서, 요소 m의 총 수를 사용하여 다음 수를 97 대체하는 것을 사용

J= (1/(2*m)) * (ones(1, m) * (((X*theta)-y).^2)); 

그냥 당신이 바로 그 해답을 얻고 있는지 확인하기를,의는 임의의 X, y를 만들 수 및 100 개의 트레이닝 예제 및 2 개의 파라미터 벡터를 갖는 theta을 포함한다. 우리는 비용을 모두 표현을 사용하고이 같은 비용으로 생산하는 것을 보여 드리겠습니다 : 조언

>> rng(123); 
>> X = rand(100, 2); 
>> y = rand(100, 1); 
>> theta = rand(2, 1); 
>> m = size(X, 1); 
>> J = 1/(2 * m) * sum(((X * theta) - y).^2); 
>> J2 = (1/(2*m)) * (ones(1, m) * (((X*theta)-y).^2)); 
>> format long g; 
>> J 

J = 

     0.0702559647930643 

>> J2 

J2 = 

     0.0702559647930643 

단어를

당신은 벡터를 곱하여 벡터의 합을 발견하는 것은 할 수 없다고 판단했습니다 적절하게 채워진 벡터는 ones으로 가득 차 있습니다. 저는 이것이 덜 효율적이라고 주장 할 것입니다.이 특정 비용 함수에서 X*theta - y으로 생성 된 벡터와 내적 벡터를 찾을 수 있다는 사실을 사용할 수 있습니다. 내적은 편리하게는 v.' * v에 의해 계산 될 수 있으며, 여기서 v은 열 벡터이다. 이것은 단순히 곱셈 연산자의 왼쪽이 행 벡터이고 곱셈 연산자의 오른쪽이 열 벡터 인 행렬 곱셈입니다. 나는 너 자신에게 이것을 확인하게 할 것이지만 만약 동등한 작업이 무엇인지 알아 내면, 이는 내적이다.

위의 공식으로 인해 벡터의 내적을 취하면 X*theta - y의 모든 요소의 제곱 값이 합쳐집니다. 따라서, 대신 이렇게 :

>> d = X*theta - y; 
>> J = (1/(2*m)) * (d.' * d) 

J = 

     0.0702559647930643 
:

d = X*theta - y; 
J = (1/(2*m)) * (d.' * d); 

당신은 또한 당신이 같은 결과를 얻을 것을 볼 수 있습니다