항상은 행렬 곱셈 또는 선형 대수 문맥에서 행렬 또는 벡터를 다루는 어떤 것을 사용합니다. 특히, 선형 대수학 (행렬의 더하기, 빼기, 곱셈 등의 조합)을 사용하여 계산해야하는 모든 것을 계산할 수 있다면 그렇게하십시오. 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 - y
가 m 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
: 매트릭스 곱셈을 사용할 수 있다면 그렇게하십시오. 코드를 실행할 수있는 속도가 가장 빠릅니다.
질문을 완벽하게 이해하고 코딩 된 방정식의 조건에서 변수의 크기를 알면 도움이 될 것입니다. 즉, 일부 행렬 곱셈 규칙에는 중간 항의 합계가 포함됩니다. 특별히 Matlab과 관련이 없으며 수학 규칙 만 적용됩니다. 행렬 곱셈 함수를 제공하는 모든 소프트웨어는 이러한 규칙을 통합해야합니다 (Matlab 에서처럼). – Hoki
수정 사항이 확실하지 않습니다. 네가 무엇을 묻고 있는지 나는 모른다. – rayryeng
원래 응답 및 메모 주셔서 감사합니다! 코드에 방정식을 변환하기위한 일반적인 경험적 방법을 개발하려고합니다. 이 특별한 질문은 _Matlab_에 _summation_ 함수가있는 방정식을 구현하는 방법을 다루었습니다. 아래 코드를 기반으로 두 함수에 sum()을 사용할 필요가없는 것 같습니다. 귀하의 코드 (여기에 복사)가 효과가 있었을 것입니다. 'd = X * theta - y;' 'J = 1/(2 * m) * (d. '* d);' – stevemuse