2016-07-03 5 views
3

저는 에 대한 방정식을 코드으로 변환하기위한 일반적인 경험적 방법을 개발하려고합니다. 이 특정 질문은 합계 함수를 사용하여 방정식을 구현하는 방법을 설명합니다. Matlab.Matlab에서 행렬 곱셈, sum() 또는 for 루프를 사용할 때 좋은 경험 법칙은 무엇입니까?

행렬 곱셈 대 합()을 사용하는 예 :

equation1

J = 1/(2*m) * sum((X*theta - y).^2); 
:이 방정식을 구현하고, I는 합() 함수를 사용하는 것이 필요하다고 생각

그런 다음 sum() 함수를 사용할 필요없이이 비슷한 방정식을 구현했습니다!

equation2

theta = theta - (alpha/m) * ((X*theta - y)'*X)'; 

장소 :

matlab에의 행렬 곱셈의 합을 "처리"할 때의 원칙은 무엇
X: 100x2 (training input plus a 'ones' vector) 
y: 100x1 (training output) 
theta: 2x1 (parameters) 
m: 100 (length of y) 
alpha: 0.01 (learning rate) 

?

감사!

+0

질문을 완벽하게 이해하고 코딩 된 방정식의 조건에서 변수의 크기를 알면 도움이 될 것입니다. 즉, 일부 행렬 곱셈 규칙에는 중간 항의 합계가 포함됩니다. 특별히 Matlab과 관련이 없으며 수학 규칙 만 적용됩니다. 행렬 곱셈 함수를 제공하는 모든 소프트웨어는 이러한 규칙을 통합해야합니다 (Matlab 에서처럼). – Hoki

+0

수정 사항이 확실하지 않습니다. 네가 무엇을 묻고 있는지 나는 모른다. – rayryeng

+0

원래 응답 및 메모 주셔서 감사합니다! 코드에 방정식을 변환하기위한 일반적인 경험적 방법을 개발하려고합니다. 이 특별한 질문은 _Matlab_에 _summation_ 함수가있는 방정식을 구현하는 방법을 다루었습니다. 아래 코드를 기반으로 두 함수에 sum()을 사용할 필요가없는 것 같습니다. 귀하의 코드 (여기에 복사)가 효과가 있었을 것입니다. 'd = X * theta - y;' 'J = 1/(2 * m) * (d. '* d);' – stevemuse

답변

6

항상은 행렬 곱셈 또는 선형 대수 문맥에서 행렬 또는 벡터를 다루는 어떤 것을 사용합니다. 특히, 선형 대수학 (행렬의 더하기, 빼기, 곱셈 등의 조합)을 사용하여 계산해야하는 모든 것을 계산할 수 있다면 그렇게하십시오. MATLAB이 만들어진 이유는 가능한 한 빨리 선형 대수학을 사용하여 연산을 수행하는 것이 었습니다. sum을 사용하면 확실히 느려질 것입니다. 예를 들어,이 게시물을보십시오 : fast matrix multiplication in Matlab

이 게시물은 통찰력 : Matlab matrix multiplication speed을 제공합니다. MATLAB은 또한이 다중 스레드를 수행하며 다중 코어에 크게 최적화되어 있습니다. 당신이 테스트를 원하는 경우


,의 우리가이 양을 계산하는 중 sum 또는 매트릭스 곱셈을 사용할 수 있음을 볼 수있는 쉬운 경우 (수학 식 1)을 해결할 수 있습니다. 또한 함께 행렬 곱셈을 사용 J 계산할 수

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

X*theta - ym x 1 행렬로 간주된다 행렬 곱셈을 사용하여 계산 될 수 제곱 차이의 합을 계산하는 내적의 정의를 이용한다. 위의 경우, 구체적으로 계산하는 것은 선형 회귀에 대한 비용 함수이며 그래디언트 강하를 통해 최소화해야합니다. theta이 100 x 1이되도록 큰 매개 변수 벡터를 만들고, 데이터 행렬을 10000000 x 100으로 만들어 100 개의 데이터 요소가 100 개의 매개 변수로 생성되도록합시다. 내 컴퓨터에 많은 RAM이 있으므로이 테스트를 수행하지 못할 수도 있습니다. 또한이 모든 것을 임의의 숫자로 초기화하고 재현성을 보장 할 수있는 시드를 설정합니다. timeit을 사용하고이 두 가지가 모두 소요되는 시간을 확인해 보겠습니다.

function test_grad 

rng(123); 
theta = rand(100,1); 
X = rand(1e7, 100); 
y = rand(1e7, 1); 
m = size(X, 1); 

    function test1 
    out = 1/(2*m) * sum((X*theta - y).^2); 
    end 

    function test2 
    d = X*theta - y; 
    out = 1/(2*m)*(d.'*d); 
    end 

t1 = timeit(@test1); 
t2 = timeit(@test2); 
fprintf('The timing for sum: %f seconds\n', t1); 
fprintf('The timing for matrix multiplication: %f seconds\n', t2); 
end 

당신은 MATLAB에서이 기능을 실행하면, 그것은 sum를 사용하여 행렬 곱셈을 사용하여 사이에 광범위한 테스트를 수행합니다 이것은 내가 쓴 테스트 기능입니다.

이것은이 기능을 실행할 때 얻는 것입니다. 당신이 볼 수 있듯이

>> test_grad 
The timing for sum: 0.594337 seconds 
The timing for matrix multiplication: 0.393643 seconds 

는, 행렬 곱셈 (적어도 내 컴퓨터에가) 각 실행에 대한 평균에 0.2 초 차이가 : 나는 맥북 I7와 프로 인텔 코어 2.3 GHz의 CPU에 16GB의 RAM을 가지고 timeit.


tl;dr : 매트릭스 곱셈을 사용할 수 있다면 그렇게하십시오. 코드를 실행할 수있는 속도가 가장 빠릅니다.