4.5 이진 속성과 유사도

이진 속성은 0과 1의 두 가지 상태 중 하나만 가지는 속성입니다. 여기에서 0은 속성이 없음을, 1은 속성이 있음을 의미합니다. 일반적으로 0은 부정(또는 거짓, False), 1은 긍정(또는 참, True)의 의미이므로 이진 속성을 숫자인 것처럼 취급하면 안 됩니다. 이러한 이진 속성은 "남성"과 "여성"과 같이 두 상태 모두 중요한 경우(0과 1 모두 중요)에는 대칭 이진 속성(Symmetric Binary Attribute)이라 하고, 구매 여부와 같이 두 상태가 동일한 중요성을 가지지 않고 긍정의 값이 더 중요한 경우(1이 더 중요)는 비대칭 이진 속성(Asymmetric Binary Attribute)이라고도 합니다.

여기에서는 대칭 이진 속성을 가진 데이터의 유사도를 계산하는 방법 중 흔히 쓰이는 단순 일치 계수(Simple Matching Coefficient)와 비대칭 이진 속성을 가진 데이터의 유사도를 계산하는 방법 중 자카드 계수(Jaccard Coefficient), 그리고 이진 속성에만 적용할 수 있는 확장 자카드 계수(Extended Jaccard Coefficient)를 유사도 계산을 위해 사용합니다. 이진 속성의 평점 데이터를 사용하는 유사도 계산은 두 사용자 모두에게 평가된 아이템 집합의 평점 간의 유사도를 계산하는 사용자-사용자 유사도(이하 사용자 유사도)와 두 아이템 모두 평가한 사용자 집합의 평점 간의 유사도를 계산하는 아이템-아이템 유사도(이하 아이템 유사도) 계산의 두 가지 방법을 살펴봅니다.

4.5.1 수식 살펴보기

여기에서는 이진 속성 데이터의 유사도 계산을 위한 수식을 먼저 살펴보고, 사용자-사용자 간 이진 속성 유사도 계산과 아이템-아이템 이진 속성 유사도 계산에 대한 수식을 살펴봅니다.

4.5.1.1 이진 속성의 유사도 계산

이진 속성에만 적용할 수 있는 확장 자카드 계수를 이해하는 데 단순 일치 계수와 자카드 계수 계산을 위한 수식과 확장 자카드 계수 계산을 위한 수식도 함께 살펴봅니다. 여기에서는 다음과 같이 이진 데이터 분할표(Contingency Table)를 사용하는 변형식을 사용하여 자카드 계수를 보다 간명하게 살펴봅니다. 다음 표는 이진 속성만 가지는 임의의 벡터 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$의 값을 비교하여 분할표로 나타낸 것입니다.

이진 데이터 분할표 $M$

${{\bf{x}}_a}$
1 (긍정) 0 (부정) 합계
${{\bf{x}}_b}$ 1 (긍정) $a$ $b$ $a+b$
0 (부정) $c$ $d$ $c+d$
합계 $a+c$ $b+d$ $n=a+b+c+d$
여기에서 $a$는 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$의 값이 모두 1인 값을 가지는 속성의 수로 긍정 일치(Positive Match)인 ${M_{11}}$, $b$ 와 $c$는 i와 j의 값 중 하나의 값이 0인 불일치(Mismatch)인 ${M_{01}}$과 ${M_{10}}$, $d$는 i와 j의 값이 모두 0인 값을 가지는 속성의 수로 부정 일치(Negative Match)인 ${M_{00}}$이며, $n$은 속성의 전체 개수입니다.

단순 일치 계수(Simple matching coefficient)는 대칭 이진 속성(Symmetric, 중요성이 같음)으로 이루어진 데이터 간의 유사도 측정에 유용한 유사도 계산 방법입니다. 단순 일치 계수는 자카드 계수와 매우 유사하지만, 합집합과 교집합의 비율로 유사도를 계산할 때 합집합과 교집합 모두 부정 일치인 ${M_{00}}$인 d까지 포함하여 계산한다는 차이점이 있습니다.

임의의 벡터 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$ 간의 단순 일치 계수는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag \mathrm{sim} _{smc} ({{\bf{x}}_a},{{\bf{x}}_b}) & = \frac{a + d}{a + b + c + d} \\ & = \frac{M_{11} + M_{00}} {M_{11} + M_{01} + M_{10} + M_{00}} \end{flalign} $$

임의의 벡터 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$간의 자카드 계수는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag \mathrm{sim} _{jaccard} ({{\bf{x}}_a},{{\bf{x}}_b}) & = \frac{a} {a + b + c} \\ & = \frac{M_{11}} {M_{11} + M_{01} + M_{10}} \end{flalign} $$

또한 다음과 같이 확장 자카드 계수로 두 벡터 간의 자카드 계수를 좀더 간단하게 계산할 수 있습니다.

임의의 벡터 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$간의 확장 자카드 계수는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag \mathrm{sim} _{ExtendedJaccard} ({{\bf{x}}_a},{{\bf{x}}_b}) & = \frac{{{\bf{x}}_a^{\rm T}{{\bf{x}}_b}}} {{\lVert{{\bf{x}}_a}\rVert}_2^2 + {\lVert{{\bf{x}}_b}\rVert}_2^2 - {{\bf{x}}_a^{\rm T}{{\bf{x}}_b}}} \\ & = \frac{{\sum\nolimits_1^n {{a_i}{b_i}} }}{ ({\sqrt {\sum\nolimits_1^n {a_i^2} })^2 + (\sqrt {\sum\nolimits_1^n {b_i^2} } })^2 - \sum\nolimits_1^n {{a_i}{b_i} }} \\ & = \frac{{\sum\nolimits_1^n {{a_i}{b_i}} }} {{\sum\nolimits_1^n {a_i^2 + } \sum\nolimits_1^n {b_i^2} - \sum\nolimits_1^n {{a_i}{b_i}} }} \end{flalign} $$
여기에서 ${\bf{x}}_a^{\rm T}{{\bf{x}}_b} = \sum\nolimits_{i = 1}^n {{a_i}{b_i}} = {a_1}{b_1} + {a_2}{b_2} + \cdots {a_n}{b_n}$로 두 벡터의 내적(Dot Product), $\left\| {{\bf{x}}_a} \right\|_2^2$와 $\left\| {{\bf{x}}_b} \right\|_2^2$는 각 벡터의 유클리드 노름(L2 Norm)의 제곱입니다.

Note:

확장 자카드 계수는 타니모토 계수(Tanimoto Coefficient)라고도 지칭합니다. 집합 개념의 자카드 계수와 달리 이진 속성에만 적용할 수 있는 코사인 유사도를 확장한 확장 자카드 계수는 두 데이터 포인트의 각도와 상대적인 거리를 모두 고려하며 자카드 계수와는 다른 개념으로 내용이 다소 혼란스러울 수 있어 유의해서 사용해야 합니다.

4.5.1.2 사용자 확장 자카드 유사도

사용자 확장 자카드 유사도는 두 사용자 모두에게 평가된 아이템 집합의 평점간 유사도를 계산합니다. 임의의 사용자 $u$와 사용자 $v$의 확장 자카드 유사도는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag \mathrm{sim} _{ExtendedJaccard} (u,v) & = \frac{{\sum\nolimits_{i \in {I_u} \cap {I_v}} {{r_ {ui}}{r_{vi}}} }}{{\sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{ui}^2} + \sum\nolimits_{i \in {I_u} \cap {I_v}} {r_ {vi}^2} - \sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{ui}{r_{vi}}} }} \end{flalign} $$

여기에서 ${I_u} \cap {I_v}$는 사용자 $u$와 사용자 $v$ 모두에게 평가된 아이템 집합, $r_{ui}$와 ${r_{vi}}$는 사용자 $u$와 사용자 $v$가 아이템 $i$에 매긴 평점을 이진 임계화한 평점(1 또는 0)입니다.

4.5.1.3 아이템 확장 자카드 유사도

아이템 확장 자카드 유사도는 두 아이템을 모두 평가한 사용자 집합의 평점간 유사도를 계산합니다. 임의의 아이템 $i$와 $j$의 확장 자카드 유사도는 다음과 같이 정의됩니다.

$$ \begin{flalign} \notag \mathrm{sim} _{ExtendedJaccard} (i,j) & = \frac{{\sum\nolimits_{u \in {U_i} \cap {U_j}} {{r_ {ui}}{r_{uj}}} }}{{\sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{ui}^2} + \sum\nolimits_{u \in {U_i} \cap {U_j}} {r_ {uj}^2} - \sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{ui}{r_{uj}}} }} \end{flalign} $$

여기에서, ${U_i} \cap {U_j}$는 아이템 $i$와 아이템 $j$를 모두 평가한 사용자 집합, $r_{ui}$와 ${r_{uj}}$는 사용자 $u$가 아이템 $i$와 아이템 $j$에 매긴 평점을 이진 임계화한 평점(1 또는 0)입니다.

4.5.2 직접 계산해보기

이제부터 예제 데이터셋을 사용하여 앞서 살펴본 수식으로 직접 계산해 볼 것입니다. 다음 표는 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

예제 데이터셋의 평점 데이터

사용자/아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ 0.5 5 1 3 3.5 5 2.5
$u_2$ 3 2 3.5 2 4 4 1
$u_3$ 3.5 1 3.5 4 1 3.5
$u_4$ 3 5 0.5 3.5 3.5 4.5
$u_5$ 3 4 2.5 4

4.5.2.1 사용자 확장 자카드 유사도

사용자 확장 자카드 유사도는 평점 데이터로 다음 수식을 사용하여 계산해 볼 것입니다.

  • 확장 자카드 계수
  • 자카드 계수
  • 단순 일치 계수

여기에서는 이진 속성 데이터의 유사도를 계산하기 위하여 원본 평점을 임곗값을 3으로 이진 임계화합니다. 다음 표는 이진화된 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

이진 임계화 평점 데이터

사용자/아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ 0 1 0 1 1 1 0
$u_2$ 1 0 1 0 1 1 0
$u_3$ 1 0 1 1 0 1
$u_4$ 1 1 0 1 1 1
$u_5$ 1 1 0 1

예를 들어 사용자 $u_4$와 사용자 $u_5$의 유사도를 확장 자카드 유사도를 사용하여 계산해 봅니다. 다음 표는 사용자 $u_4$와 사용자 $u_5$의 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

사용자 $u_4$와 사용자 $u_5$의 평점 데이터

사용자/아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_4$ 1 1 0 0 1 0 1 1
$u_5$ 0 1 1 0 0 1 0 0

Tip:

여기에서는 사용자 $u_4$와 사용자 $u_5$ 중 어느 한쪽만 평가한 아이템 {$i_1$, $i_3$, $i_4$, $i_7$, $i_8$, $i_9$}에 대하여 평가하지 않은 사용자의 평점을 부정적인 선호 또는 무응답을 나타내는 0으로 대체(Zero Imputation)합니다.

먼저 확장 자카드 계수를 사용하여 사용자 유사도를 계산해 봅니다.

두 사용자의 내적은 $1$이고 사용자 $u_4$의 노름은 $\sqrt {5}$, 사용자 $u_5$의 노름은$\sqrt {3}$입니다. 두 사용자의 유사도는 내적을 사용자 $u_4$와 사용자 $u_5$의 노름의 제곱을 더하고 내적을 뺀 값으로 나눈 $0.1428$이 됩니다.

$$ \begin{flalign} {\mathrm{sim} _{ExtendedJaccard}}(u_4,u_5) & = \frac{1}{(\sqrt{5})^2 + (\sqrt{3})^2 - 1} \\ & = \frac{1}{7} \\ & \approx 0.1428 \end{flalign} $$

이번에는 이진 데이터 분할표 $M$을 사용하여 자카드 계수를 구해봅니다.

여기에서 사용자 $u_4$와 사용자 $u_5$가 공통으로 평가한 아이템 {$i_1$, $i_2$, $i_3$, $i_4$, $i_6$, $i_7$, $i_8$, $i_9$}에 대한 각 사용자의 평점은 {1, 1, 0, 0, 1, 0, 1, 1}와 {0, 1, 1, 0, 0, 1, 0, 0}입니다. 사용자 $u_4$와 사용자 $u_5$의 평점 간의 ${M_{11}}$, ${M_{01}}$, ${M_{10}}$, ${M_{00}}$의 빈도를 측정해보면 ${M_{11}} = 1$, ${M_{01}} = 2$, ${M_{10}} = 4$, ${M_{00}} = 1$입니다. 두 사용자의 유사도는 긍정 일치인 ${M_{11}}$의 빈도를 전체 빈도의 합인 ${M_{11}} + {M_{01}} + {M_{10}}$으로 나눈 $0.1428$이 됩니다.

$$ \begin{flalign} {\mathrm{sim} _{jaccard}}(u_4,u_5) & = \frac{1}{1 + 2 + 4} \\ & = \frac{1}{7} \\ & \approx 0.1428 \end{flalign} $$

참고로, 단순 일치 계수는 자카드 계수와 달리 부정 일치인 ${M_{00}}$을 포함하여 계산한 $0.25$가 됩니다.

$$ \begin{flalign} {\mathrm{sim} _{smc}}(u_4,u_5) & = \frac {1 + 1} {1 + 2 + 4 + 1} \\ & = \frac{2}{8} \\ & = 0.25 \end{flalign} $$

다음 표는 직접 계산한 결괏값을 나타낸 것입니다.

계산 결과

내적 사용자 $u_4$의 노름 사용자 $u_5$의 노름 ${M_{11}}$ ${M_{01}}$ ${M_{10}}$ ${M_{00}}$ 유사도(자카드) 유사도(단순 일치 계수)
1 $\sqrt {5}$ $\sqrt {3}$ 1 2 4 1 0.1428 0.25

사용자 확장 자카드 유사도와 사용자 단순 일치 계수 유사도를 모두 계산해 봅니다. 다음 표는 사용자 유사도 데이터를 사용자(LHS)는 행, 사용자 (RHS)는 열로 나타낸 것입니다.

사용자 확장 자카드 유사도 데이터

사용자(RHS) 사용자(LHS) $u_1$ $u_2$ $u_3$ $u_4$ $u_5$
$u_1$ 1 0.1428571 0.3333333 0.5 0.4
$u_2$ 0.1428571 1 0.1428571 0.125 0.4
$u_3$ 0.3333333 0.1428571 1 0.2857143 0.1666667
$u_4$ 0.5 0.125 0.2857143 1 0.1428571
$u_5$ 0.4 0.4 0.1666667 0.1428571 1

사용자 단순 일치 계수 유사도 데이터

사용자(RHS) 사용자(LHS) $u_1$ $u_2$ $u_3$ $u_4$ $u_5$
$u_1$ 1 0.3333333 0.5555556 0.6666667 0.5714286
$u_2$ 0.3333333 1 0.3333333 0.3 0.625
$u_3$ 0.5555556 0.3333333 1 0.375 0.2857143
$u_4$ 0.6666667 0.3 0.375 1 0.25
$u_5$ 0.5714286 0.625 0.2857143 0.25 1

다음 표는 사용자 $u_5$의 사용자 확장 자카드 유사도와 사용자 단순 일치 계수 유사도를 유사도가 높은 순으로 비교하여 나타낸 것입니다.

사용자 $u_5$의 사용자 가중 자카드 유사도 비교

순위 확장 자카드 단순 일치 계수
사용자 유사도 사용자 유사도
1 $u_5$ 1 $u_5$ 1
2 $u_1$ 0.4 $u_2$ 0.625
3 $u_2$ 0.4 $u_1$ 0.5714286
4 $u_3$ 0.1666 $u_3$ 0.2857143
5 $u_4$ 0.1428 $u_4$ 0.25

사용자 확장 자카드 유사도와 사용자 단순 일치 계수 유사도의 유사도 순위가 2번째, 3번째에서 서로 다른 결과가 나오는 것을 확인할 수 있습니다.

4.5.2.2 아이템 확장 자카드 유사도

아이템 확장 자카드 유사도는 평점 데이터로 다음 수식을 사용하여 계산해 볼 것입니다.

  • 확장 자카드 계수
  • 자카드 계수
  • 단순 일치 계수

여기에서는 이진 속성 데이터의 유사도를 계산하기 위하여 원본 평점을 임곗값을 3으로 이진 임계화합니다. 다음 표는 이진화된 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

[이진 임계화 평점 데이터]

사용자/아이템 $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$u_1$ 0 1 0 1 1 1 0
$u_2$ 1 0 1 0 1 1 0
$u_3$ 1 0 1 1 0 1
$u_4$ 1 1 0 1 1 1
$u_5$ 1 1 0 1

예를 들어 아이템 $i_3$과 아이템 $i_1$의 유사도를 확장 자카드 유사도를 사용하여 계산해 봅니다. 다음 표는 아이템 $i_3$과 아이템 $i_1$의 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

아이템 $i_3$과 아이템 $i_1$의 평점 데이터

사용자 아이템 $u_1$ $u_2$ $u_3$ $u_4$ $u_5$
$i_3$ 0 1 0 0 1
$i_1$ 0 1 0 1 0

Tip:

여기에서는 아이템 $i_3$과 아이템 $i_1$의 중 어느 한쪽만 평가한 사용자 ($u_3$, $u_4$, $u_5$)에 대하여 평가하지 않은 아이템의 평점을 부정적인 선호 또는 무응답을 나타내는 0으로 대체(Zero Imputation)합니다.

먼저 확장 자카드 계수를 사용하여 아이템 유사도를 계산해 봅니다.

두 아이템의 내적은 $1$이고 아이템 $i_3$의 노름은 $\sqrt {2}$, 아이템 $i_1$의 노름은 $\sqrt {2}$입니다. 두 사용자의 아이템의 내적을 아이템 $i_3$과 아이템 $i_1$의 노름의 제곱을 더하고 내적을 뺀 값으로 나눈 $0.3333$이 됩니다.

$$ \begin{flalign} {\mathrm{sim} _{ExtendedJaccard}}(i_3,i_1) & = \frac{1}{(\sqrt{2})^2 + (\sqrt{2})^2 - 1} \\ & = \frac{1}{3} \\ & \approx 0.3333 \end{flalign} $$

이번에는 이진 데이터 분할표 $M$을 사용하여 자카드 계수를 구해봅니다.

여기에서 아이템 $i_3$과 아이템 $i_1$을 공통으로 평가한 사용자 {$u_1$, $u_2$, $u_3$, $u_4$, $u_5$}에 대한 각 아이템의 평점은 {0, 1, 0, 0, 1}와 {0, 1, 0, 1, 0}입니다. 아이템 $i_3$과 아이템 $i_1$의 평점 간의 ${M_{11}}$, ${M_{01}}$, ${M_{10}}$, ${M_{00}}$의 빈도를 측정해보면 ${M_{11}} = 1$, ${M_{01}} = 1$, ${M_{10}} = 1$, ${M_{00}} = 2$입니다. 두 아이템의 유사도는 긍정 일치인 ${M_{11}}$의 빈도를 전체 빈도의 합인 ${M_{11}} + {M_{01}} + {M_{10}}$으로 나눈 $0.3333$이 됩니다.

$$ \begin{flalign} {\mathrm{sim} _{jaccard}}(i_3,i_1) & = \frac{1}{1 + 1 + 1} \\ & = \frac{1}{3} \\ & \approx 0.3333 \end{flalign} $$

참고로, 단순 일치 계수는 자카드 계수와 달리 부정 일치인 ${M_{00}}$을 포함하여 계산한 $0.6$이 됩니다.

$$ \begin{flalign} {\mathrm{sim} _{smc}}(i_3,i_1) & = \frac{1 + 2}{1 + 1 + 1 + 2} \\ & = \frac{3}{5} \\ & = 0.6 \end{flalign} $$

다음 표는 직접 계산한 결괏값을 나타낸 것입니다.

계산 결과

내적 아이템 $i_3$의 노름 아이템 $i_1$의 노름 ${M_{11}}$ ${M_{01}}$ ${M_{10}}$ ${M_{00}}$ 유사도 (자카드) 유사도 (단순 일치 계수)
1 2 2 1 1 1 2 0.3333 0.6

아이템 확장 자카드 유사도와 아이템 단순 일치 계수 유사도를 모두 계산해 봅니다. 다음 표는 아이템 유사도 데이터를 아이템 (LHS)는 행, 아이템 (RHS)는 열로 나타낸 것입니다.

아이템 확장 자카드 유사도 데이터

아이템(RHS) 아이템(LHS) $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$i_1$ 1 0.2 0.3333333 0 0.3333333 0.3333333 0.25 0.5 0.25 0
$i_2$ 0.2 1 0.2 0.25 0.2 0.5 0.4 0.25 0.75 0
$i_3$ 0.3333333 0.2 1 0 0.3333333 0 0.6666667 0 0 0
$i_4$ 0 0.25 0 1 0.5 0 0 0 0.3333333 0
$i_5$ 0.3333333 0.2 0.3333333 0.5 1 0 0.25 0 0.25 0
$i_6$ 0.3333333 0.5 0 0 0 1 0.25 0.5 0.6666667 0
$i_7$ 0.25 0.4 0.6666667 0 0.25 0.25 1 0 0.2 0
$i_8$ 0.5 0.25 0 0 0 0.5 0 1 0.3333333 0
$i_9$ 0.25 0.75 0 0.3333333 0.25 0.6666667 0.2 0.3333333 1 0
$i_{10}$ 0 0 0 0 0 0 0 0 0 1

사용자 단순 일치 계수 유사도 데이터

아이템(RHS) 아이템(LHS) $i_1$ $i_2$ $i_3$ $i_4$ $i_5$ $i_6$ $i_7$ $i_8$ $i_9$ $i_{10}$
$i_1$ 1 0.2 0.6 0.25 0.5 0.6 0.25 0.6666667 0.25 0.3333333
$i_2$ 0.2 1 0.2 0.4 0.2 0.6 0.4 0.4 0.8 0.2
$i_3$ 0.6 0.2 1 0.4 0.5 0.2 0.75 0.4 0 0.5
$i_4$ 0.25 0.4 0.4 1 0.6666667 0.4 0.2 0.3333333 0.5 0.75
$i_5$ 0.5 0.2 0.5 0.6666667 1 0.2 0.25 0 0.25 0.3333333
$i_6$ 0.6 0.6 0.2 0.4 0.2 1 0.4 0.75 0.75 0.6
$i_7$ 0.25 0.4 0.75 0.2 0.25 0.4 1 0 0.2 0
$i_8$ 0.6666667 0.4 0.4 0.3333333 0 0.75 0 1 0.3333333 0.6666667
$i_9$ 0.25 0.8 0 0.5 0.25 0.75 0.2 0.3333333 1 0.25
$i_{10}$ 0.3333333 0.2 0.5 0.75 0.3333333 0.6 0 0.6666667 0.25 1

다음 표는 아이템 $i_3$의 아이템 확장 자카드 유사도와 아이템 단순 일치 계수 유사도를 유사도가 높은 순으로 비교하여 나타낸 것입니다.

아이템 $i_3$의 아이템 가중 자카드 유사도 비교

순위 확장 자카드 단순 일치 계수
사용자 유사도 사용자 유사도
1 $i_3$ 1 $i_3$ 1
2 $i_7$ 0.6666667 $i_7$ 0.75
3 $i_1$ 0.3333333 $i_1$ 0.6
4 $i_5$ 0.3333333 $i_5$ 0.5
5 $i_2$ 0.2 $i_{10}$ 0.5
6 $i_4$ 0 $i_4$ 0.4
7 $i_6$ 0 $i_8$ 0.4
8 $i_8$ 0 $i_2$ 0.2
9 $i_9$ 0 $i_6$ 0.2
10 $i_{10}$ 0 $i_9$ 0

아이템 확장 자카드 유사도와 아이템 단순 일치 계수 유사도의 유사도 순위가 5번째, 7번째, 8번째, 9번째, 10번째에서 서로 다른 결과가 나오는 것을 확인할 수 있습니다.

4.5.3 예제 코드 실행해보기

앞서 "직접 계산하기"에서는 예제 데이터셋의 평점 데이터를 사용하여 계산해 보았습니다. 이제부터는 평점 데이터 파일과 예제 코드를 사용하여 "직접 계산하기"의 계산 결과에 대해 한번 더 확인해 볼 것입니다.

"직접 계산하기"의 결과

구분 평점 정규화 결측값 처리 좌변 우변 유사도 설명
사용자 유사도 이진 임계화 0 대체 $u_4$ $u_5$ 0.1428 두 사용자 모두에게 평가된 아이템 집합의 평점간 유사도
아이템 유사도 이진 임계화 0 대체 $i_3$ $i_1$ 0.3333 두 아이템을 모두 평가한 사용자 집합의 평점간 유사도

4.5.3.1 구현 클래스 살펴보기

먼저 예제 코드에서 사용하는 평균 중심화가 구현된 ExtendedJaccardSimilarityMeasurer 클래스를 살펴봅니다. ExtendedJaccardSimilarityMeasurer 클래스는 Apache Spark ML 패키지의 추상 클래스인 Transformer 클래스를 상속받아 평점 데이터를 평균 중심화된 평점 데이터로 변환하는 transform 메서드를 구현한 클래스입니다.

다음 그림은 UML 클래스 다이어그램 표기법을 사용하여 ExtendedJaccardSimilarityMeasurer클래스를 클래스 다이어그램으로 나타낸 것입니다.

Download

[UML 클래스 다이어그램]

ExtendedJaccardSimilarityMeasurer 클래스는 평균 중심화를 위해 필요한 매개변수의 설정이나 기본값 변경이 필요한 경우에는 필요에 따라 다음 코드와 같이 빌더 패턴을 사용하여 인스턴스를 생성할 수 있습니다.

ExtendedJaccardSimilarityMeasurer measurer =
    new ExtendedJaccardSimilarityMeasurer()
        .setGroup(Group.USER)
        .setGroupCol("user")
        .setImputeZero(true)
        .setIds("u4", "u5")
        .setVerbose(true)
        .setUserCol("user")
        .setItemCol("item")
        .setRatingCol("rating")
        .setOutputCol("similarity");

ExtendedJaccardSimilarityMeasurer 클래스의 인스턴스에 설정 가능한 매개변수는 다음과 같습니다.

주요 매개변수

매개변수 유형 필수여부 기본값 설명
group Enum Group.USER 유사도 계산 기준을 Group 열거형 유형으로 설정(Group.USER: 사용자, Group.ITEM: 아이템)
groupCol String criterion 유사도 계산 기준을 문자열로 설정(“user”: 사용자, “item”:아이템).
imputeZero true 쌍대 열의 어느 한쪽 값이 결측인 경우의 결측치 처리(true: 0 대체, false: 쌍대 열 제외)
ids - 유사도 계산 대상 ID(LHS) 지정(미지정시 전체 대상)
verbose boolean false 처리과정에 대한 정보를 출력할 것인지 여부 체크(기본값: false).
userCol String user 평점 데이터의 사용자 컬럼명(기본값: “user”)
itemCol String item 평점 데이터의 아이템 컬럼명(기본값: “item”)
ratingCol String rating 평점 데이터의 평점 컬럼명(기본값: “rating”)
outputCol String “similarity” 출력 컬럼명(기본값: “similarity”)으로 정규화된 평점

생성된 ExtendedJaccardSimilarityMeasurer 인스턴스는 RatingSimilarityMeasurer클래스에 구현된 transform 메서드를 사용하여 평점 데이터를 입력받아 평점을 평균 중심화된 평점으로 변환할 수 있습니다.

Dataset<Row> similarityDS = measurer.transform(ratingDS);

4.5.3.2 예제 코드 살펴보기

여기에서는 "직접 계산하기"의 계산 결과를 확인하기 위해 JUnit으로 작성된 예제 클래스의 소스 코드를 살펴봅니다. 다음은 r4tings-recommender 라이브러리에 포함된 코사인 유사도 계산을 위한 구현 클래스인 ExtendedJaccardSimilarityMeasurer 클래스를 이용하여 "직접 계산하기"의 계산 결과를 확인하기 위한 ExtendedJaccardSimilarityTest 클래스의 extendedJaccardSimilarityExamples는 테스트 메서드입니다.

ExtendedJaccardSimilarityTest.java

소스 코드에서 볼 수 있듯이 대부분 코드는 테스트를 처리하기 위한 것이지만 기본 흐름은 매우 단순합니다. 먼저 ❶ 매개변수를 바꿔가면서 실행하고 결과를 확인하기 위한 CSV 형식의 인자 목록을 설정합니다( 23행~26행). 반복 실행되는 extendedJaccardSimilarityExamples 메서드에서는 테스트 인자들을 매개변수로 받습니다.

다음으로 ❷ Parquet 유형의 평점 데이터를 읽어 들이고(34행) ❸ 이진 임계화로 평점을 이진화합니다(36행). 다음으로 ❹ ExtendedJaccardSimilarityMeasurer 클래스의 인스턴스를 생성하고(38행~39행) ❺ 평점 데이터를 전달하여 유사도를 계산합니다 (41행). 마지막으로 ❻ "직접 계산하기"에서 계산해 본 결과에 해당하는 기댓값(Expected)과 예제 코드의 실행 결과인 실제 값(Actual)의 소수 자릿수 7자리까지 비교합니다(57행).

4.5.3.3 실행 결과 확인하기

여기에서는 앞서 살펴본 테스트 클래스인 ExtendedJaccardSimilarityTest클래스의 테스트 메서드인 extendedJaccardSimilarityExamples 실행 결과를 살펴봅니다. 다음과 같이 명령줄 인터페이스(CLI, Command line interface)에서 빌드 도구인 Gradle Wrapper로 ExtendedJaccardSimilarityTest클래스의 테스트 메서드인 extendedJaccardSimilarityExamples를 실행해 봅니다.

./gradlew :recommender-examples:test --tests com.r4tings.recommender.examples.ch04.binary.ExtendedJaccardSimilarityTest.extendedJaccardSimilarityExamples

테스트 메서드가 실행되면 직접 계산하기에서 다룬 결과를 확인하기 위해 설정한 테스트 인자 목록을 테스트 메서드의 매개변수에 대입해가며 반복 실행되어 결과가 출력됩니다.

다음은 반복 실행 테스트를 위한 테스트 인자 목록입니다

테스트 인자 목록

구분 데이터 경로 평점 정규화 기준 상세출력 좌변(LHS) 우변(RHS) 유사도
정규화 방법 임곗값
사용자 확장자카드 유사도 dataset/r4tings/ratings.parquet BINARY_THRESHOLDING 3 USER true $u_4$ $u_5$ 0.1428
아이템 확장자카드 유사도 ITEM $i_3$ $i_1$ 0.3333

예제 코드의 실행 결과는 다음과 같습니다.

예제 코드 실행 결과더보기

이진 임계화된 원본 평점을 사용한 ❶ 사용자 확장 자카드 유사도 계산과 ❷ 아이템 확장 자카드 유사도 계산에 대한 테스트 케이스가 성공적으로 종료(PASSED)되었음을 확인할 수 있습니다. 또한, 실행 결과는 "직접 계산하기"에서 계산해 본 내용을 쉽게 확인하기 위해 처리 과정에서 파생된 상세 출력 정보도 함께 보여주고 있습니다.

4.5.3.4 R 패키지로 확인해보기

다음은 R 패키지를 이용하여 "직접 계산하기"의 계산 결과를 확인하기 위해 작성된 R 스크립트입니다.

ExtendedJaccardSimilarity.R

이 R 스크립트는 코사인 유사도 계산을 위한 recommenderlab 패키지의 similarity함수를 실행하고 결과를 확인하기 위한 방법을 설명합니다. 소스 코드에서 볼 수 있듯이 기본 흐름은 매우 단순합니다. 먼저 ❶ data.table 패키지의 fread 함수를 이용하여 CSV 유형의 평점 데이터를 읽어 들이고 (14행) ❷ recommenderlab 패키지에서 사용하는 realRatingMatrix 유형으로 변환하여 읽어 들인 평점 데이터를 출력합니다(27행~29행).

다음으로 ❸ 원본 평점을 이진화합니다(36행). ❹ 이진화된 평점을 사용한 자카드 유사도와 단순 일치 계수로 사용자 유사도 계산(46행과 53행)과 ❹ 이진화된 평점을 사용한 자카드 유사도와 단순 일치 계수로 아이템 유사도 계산(64행과 71행) 결과를 matrix 유형으로 변환하여 출력합니다.

R 스크립트의 실행 결과는 다음과 같습니다.

R 스크립트 실행 결과더보기

이 실행 결과에서 볼 수 있듯이 이진화된 평점을 사용한 자카드 유사도와 단순 일치 계수 ❶ 자카드 유사도와 ❷ 단순 일치 계수를 사용한 사용자 유사도 계산과 ❸ 자카드 유사도와 ❹ 단순 일치 계수를 사용한 아이템 유사도 계산 결과를 확인할 수 있습니다. 또한, 실행 결과가 "직접 계산하기"의 계산 결과와 같음을 확인할 수 있습니다.

한글:5147 영어:6964 숫자:2353

추천 시스템: 워크북

Comments

Do you have a problem, want to share feedback, or discuss further ideas? Feel free to leave a comment here! Please follow Rust's code of conduct. This comment thread directly maps to a discussion on GitHub, so you can also comment there if you prefer.

Instead of authenticating the giscus application, you can also comment directly on GitHub.