2013-08-13 5 views
0

이처럼 Matlab에서 코사인 유사성을 구현했습니다. 사실, 저는 2 차원의 50 x 50 매트릭스를 가지고 있습니다. 코사인을 얻으려면 항목을 라인 형식으로 비교해야합니다.Matlab에서 코사인 유사성을 얻는 방법은 무엇입니까?

for j = 1:50 
    x = dat(j,:); 
    for i = j+1:50 
     y = dat(i,:); 
     c = dot(x,y); 
     sim = c/(norm(x,2)*norm(y,2)); 
    end 
end 

이 정보가 맞습니까? 질문은 이것입니다 : wath는이 상태의 복잡성 또는 O (n)입니까?

+1

"줄 단위로." 행 방향 또는 열 방향을 의미합니까? – horchler

+0

죄송합니다. 저는 행 방향입니다. a) 선택한 알고리즘 (MATLAB 독립), b) 쌍간 코사인 유사성 (다시 MATLAB 독립) 또는 c) 효율적/빠른 MATLAB 구현을위한 효율적인 알고리즘을 가지고있는 문제가 무엇입니까? – sima412

+0

사이에 문제가 있습니까? 요청되는 내용을 간결하게 작성하십시오. – gevang

답변

1

더 나은 결과 49. 아마 인덱스에 시뮬레이션을 추가해야합니까?

for j = 1:49 
    x = dat(j,:); 
    for i = j+1:50 
     y = dat(i,:); 
     c = dot(x,y); 
     sim(j) = c/(norm(x,2)*norm(y,2)); 
    end 
end 

복잡성은 대략 o (n^2)와 비슷해야합니다. 그렇지 않습니까? 어쩌면 상관 관계 함수를 살펴 봐야 할 것입니다 ... 정확히 쓰고 싶지는 않지만 비슷한 것을하고 싶은 것처럼 보입니다. Matlab에는 내장 된 상관 관계 함수가 있습니다.

+0

Melachtron에 감사드립니다. 복잡한 코사인 유사성을 얻고 싶습니다. 하지만 또 다른 질문은 코사인 유사도와 해밍 거리를 비교하기를 원하지만 (두 벡터 간의 유사성을 얻으려면 1- 해밍 거리). 당신은 복잡성 해밍 거리가 무엇인지 알고 있습니까? 그렇지만 해밍 거리는 1 해밍 거리입니다. 그리고 대구가 matlab에 해밍? – sima412

+0

Hamming 거리에 대한 http://www.mathworks.de/de/help/stats/pdist.html 참조 - Matlab의 내장 명령 인 을 사용하여 직접 프로그래밍 할 수 있습니다. gevang – Melanchtron

+1

의 응답에서'sim '에 대한 이중 색인이 필요합니다. 즉'sim (j, i)'가 필요합니다. 그렇지 않으면 내부'i' 루프가 실행될 때마다 이전의 것을 덮어 씁니다 (따라서'sim (j)' 마지막 호출'i = j + 50' 만). 사실상, 'n (n-1)/2' 유사성 값을 1 차원 또는 2 차원 배열에 저장해야합니다. 후자가 더 편리 할 수 ​​있습니다. – gevang

1

벡터화 된 행렬 연산 (MATLAB에서 최적화 됨)을 사용하여 동일한 작업을 효율적으로 구현하는 방법에 대한 메모입니다. 이것은 큰 행렬을 위해 엄청난 시간을 절약 할 수 있습니다 :

dat = randn(50, 50); 

OP (더블 용) 구현 :

sim = zeros(size(dat)); 
nRow = size(dat,1); 
for j = 1:nRow 
    x = dat(j, :); 
    for i = j+1:nRow 
     y = dat(i, :); 
     c = dot(x, y); 
     sim(j, i) = c/(norm(x,2)*norm(y,2)); 
    end 
end 

벡터화 구현 : 1000

normDat = sqrt(sum(dat.^2, 2));   % L2 norm of each row 
datNorm = bsxfun(@rdivide, dat, normDat); % normalize each row 
dotProd = datNorm*datNorm';    % dot-product vectorized (redundant!) 
sim2 = triu(dotProd, 1);     % keep unique upper triangular part 

비교 x 1000 매트릭스 : (MATLAB 2013a, x64, Int 엘 코어 i7 960 @ 3.20GHz)

Elapsed time is 34.103095 seconds. 
Elapsed time is 0.075208 seconds. 
sum(sum(sim-sim2)) 
ans = 
    -1.224314766369880e-14 
+0

대단히 고맙습니다. 해밍 거리는 사실입니까? 및 유사성 측정은? – sima412

+0

@ sima412는 pairwise 관측을 위해 정의 된 서로 다른 유사성 측정 ('해밍'과 '코사인'포함)의 구현을 위해'pdist2 '를 조사합니다. – gevang

+0

ok 고맙습니다.하지만 다른 종류의 햄민 거리를 사용합니다. 나는 1-haming을 원한다. – sima412

관련 문제