4.3 피어슨 상관계수와 유사도

피어슨 상관계수(Pearson Correlation Coefficient)는 두 변수 간의 내적(Inner Product)으로 두 변수의 벡터들이 서로 얼마나 같은 방향으로 움직이고 있느냐는 선형적인 관계의 정도인 상관관계(Correlation)를 나타냅니다. 통계학에서 보통 상관계수라고 하면 피어슨 상관계수를 의미합니다.

상관관계는 한 변수가 다른 변수에 주는 영향력의 정도를 나타낼 뿐 두 변수 간의 인과관계를 설명하는 것은 아닙니다. 상관관계는 두 벡터가 함께 변하는 정도를 나타내는 공분산 값을 각각의 벡터가 변하는 정도(데이터가 퍼져 있는 상태)를 나타내는 표준편차를 곱한 후 나눠서 구합니다. 상관관계는 -1에서 +1 사이의 값으로, 0보다 크면 양(+)의 상관관계, 0보다 작으면 음(-)의 상관관계, 0이면 무상관관계라고 합니다.

상관관계가 0인 무상관관계도 선형적 관계가 아니라는 것일 뿐 관련성은 존재할 수 있습니다. 평점 데이터의 피어슨 상관계수를 사용하는 유사도 계산은 두 사용자 모두에게 평가된 아이템 집합의 평점 간의 유사도를 계산하는 사용자-사용자 유사도(이하 사용자 유사도)와 두 아이템 모두 평가한 사용자 집합의 평점 간의 유사도를 계산하는 아이템-아이템 유사도(이하 아이템 유사도) 계산의 두 가지 방법을 살펴봅니다.

4.3.1 수식 살펴보기

여기에서는 피어슨 상관계수로 유사도 계산을 위한 수식을 먼저 살펴보고, 사용자-사용자 간 피어슨 유사도 계산과 아이템-아이템 피어슨 유사도 계산에 대한 수식을 살펴봅니다.

4.3.1.1 피어슨 상관계수와 유사도

피어슨 상관계수는 두 벡터의 선형 관계가 얼마나 강한지를 계산합니다. 임의의 벡터 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$간의 피어슨 상관계수의 정의식은 다음과 같이 정의됩니다.

$$ \begin{flalign} pearson({{\bf{x}}_a},{{\bf{x}}_b}) & = \frac{{\mathrm{cov}({{\bf{x}}_a},{{\bf{x}}_b})}}{{{\sigma _{{\bf{x}}_a}}{\sigma _{{\bf{x}}_b}}}} \\ & = \frac{{\frac{{\sum\nolimits_i^n {({a_i} - {\mu _a})({b_i} - {\mu _b})} }}{{n - 1}}}}{{\sqrt {\frac{{\sum\nolimits_1^n {{{({a_i} - {\mu _a})}^2}} }}{{n - 1}}} \sqrt {\frac{{\sum\nolimits_1^n {{{({b_i} - {\mu _b})}^2}} }}{{n - 1}}} }} \\ & = \frac{{\sum\nolimits_1^n {({a_i} - {\mu _a})({b_i} - {\mu _b})} }}{{\sqrt {\sum\nolimits_1^n {{{({a_i} - {\mu _a})}^2}} } \sqrt {\sum\nolimits_1^n {{{({b_i} - {\mu _b})}^2}} } }} \end{flalign} $$

여기에서 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$는 벡터인 ${{\bf{x}}_a} = ({a_1},{a_2}, \cdots ,{a_n})$와 ${{\bf{x}}_b} = ({b_1},{b_2}, \cdots ,{b_n})$이고, $\mathrm{cov}({{\bf{x}}_a},{{\bf{x}}_b})$은 ${{\bf{x}}_a}$가 변할 때 ${{\bf{x}}_b}$가 변하는 정도를 나타내는 표본 공분산(Covariance), ${\sigma _{{\bf{x}}_a}}$와 ${\sigma _{{\bf{x}}_b}}$는 표본 표준 편차입니다.

Note:

분산, 표준편차, 공분산을 계산할 때는 데이터가 모 집단인지 표본 집단인지에 따라 모집단인 경우에는 편차제곱합(sum of square)을 $n$으로 나누고 표본 집단인 경우에는 $n-1$로 나눕니다. 수식에서 보는 바와 같이 계산화는 과정에서 모 집단인지 표본 집단인지와 관계없이 계산 과정에서 상쇄되어 계산 결과에는 변화가 없습니다. 여기에서는 분산, 표준편차, 공분산을 모두 표본 집단($n-1$)으로 계산합니다.

또한, 다음과 같이 피어슨 상관계수의 계산식을 사용하여 더 간단하게 계산할 수 있습니다.

$$ \begin{flalign} pearson({{\bf{x}}_a},{{\bf{x}}_b}) & = \frac{{\sum {{a_i}{b_i}} - \frac{{\sum {{a_i}} \sum {{b_i}} }}{n}}}{{\sqrt {\sum {a_i^2 - } \frac{{{{(\sum {{a_i}} )}^2}}}{n}} \sqrt {\sum {b_i^2 - } \frac{{{{(\sum {{b_i}} )}^2}}}{n}} }} \\ & = \frac{{n\sum {{a_i}{b_i}} - \sum {{a_i}} \sum {{b_i}} }}{{\sqrt {n\sum {a_i^2 - } {{(\sum {{a_i}} )}^2}} \sqrt {n\sum {b_i^2 - } {{(\sum {{b_i}} )}^2}} }} \end{flalign} $$

두 벡터 ${{\bf{x}}_a}$와 ${{\bf{x}}_b}$간의 피어슨 유사도는 다음과 같이 정의됩니다.

$$ \begin{flalign} \mathrm{sim} _{pearson} ({{\bf{x}}_a},{{\bf{x}}_b}) & = \left\{ \begin{array}{l} \frac{1}{{1 + (1 - pearson({{\bf{x}}_a},{{\bf{x}}_b}))}}{\rm{ \ if \ }}pearson({{\bf{x}}_a},{{\bf{x}}_b}) > 0 \\ 0 \ {\rm{ otherwise}} \end{array} \right. \end{flalign} $$

여기에서 $pearson({{\bf{x}}_a},{{\bf{x}}_b})$는 두 벡터 간의 피어슨 상관계수로 0보다 큰 값(양의 상관관계)입니다.

Tip:

여기에서의 피어슨 유사도 계산은 0보다 작은 음(-)의 상관관계는 유사도 계산에서 사용하지 않습니다.

이 식에서 보는 바와 같이 음이 아닌 유사도를 구하기 위해 $pearson({{\bf{x}}_a},{{\bf{x}}_b})$가 양의 상관관계인 경우에는 $1 - pearson({{\bf{x}}_a},{{\bf{x}}_b})$과 같이 1에서 상관계수 값을 빼서 비유사도를 구한 다음 1을 더하고 역수를 취하여 0과 1 사이의 유사도를 구합니다. $pearson({{\bf{x}}_a},{{\bf{x}}_b})$가 음의 상관관계이거나 무상관관계인 경우에는 유사도는 0입니다.

4.3.1.2 사용자 피어슨 유사도

사용자 피어슨 유사도는 두 사용자 모두에게 평가된 아이템 집합의 평점간 유사도를 계산합니다. 임의의 사용자 $u$와 사용자 $v$의 피어슨 상관계수의 정의식은 다음과 같이 정의됩니다.

$$ \begin{flalign} pearson(u,v) = \frac{{\sum\nolimits_{i \in {I_u} \cap {I_v}} {(r_{ui} - {\mu _u})({r_{vi}} - {\mu _v})} }}{{\sqrt {\sum\nolimits_{i \in {I_u} \cap {I_v}} {{{(r_{ui} - {\mu _u})}^2}} } \sqrt {\sum\nolimits_{i \in {I_u} \cap {I_v}} {{{({r_{vi}} - {\mu _v})}^2}} } }} \end{flalign} $$

여기에서, ${I_u} \cap {I_v}$는 사용자 $u$와 사용자 $v$ 모두에게 평가된 아이템 집합, $r_{ui}$와 ${r_{vi}}$는 사용자 $u$와 사용자 $v$가 아이템 $i$에 매긴 평점, ${\mu _u}$은 사용자 $u$에게 평가된 아이템 집합 ${I_u}$의 평점 평균, ${\mu _v}$는 사용자 $v$ 에게 평가된 아이템 집합 ${I_v}$의 평점 평균입니다.

임의의 사용자 $u$와 사용자 $v$의 피어슨 상관계수의 계산식은 다음과 같이 정의됩니다.

$$ \begin{flalign} pearson(u,v) = \frac{{n\sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{ui}{r_{vi}} - \sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{ui}} \sum\nolimits_{i \in {I_u} \cap {I_v}} {{r_{vi}}} } }}{{\sqrt {n\sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{ui}^2 - {{(\sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{ui}} )}^2}} } \sqrt {n\sum\nolimits_{i \in {I_u} \cap {I_v}} {r_{vi}^2 - {{(\sum\nolimits_{i \in {I_u} \cap {I_v}} {{r_{vi}}} )}^2}} } }} \end{flalign} $$

여기에서 $n$은 아이템 집합 ${I_u} \cap {I_v}$의 원소 개수, $r_{ui}$와 ${r_{vi}}$는 사용자 $u$와 사용자 $v$가 아이템 $i$에 매긴 평점입니다. 임의의 사용자 $u$와 사용자 $v$의 사용자 피어슨 유사도는 다음과 같이 정의됩니다.

$$ \begin{flalign} {\mathrm{sim} _{pearson} (u,v)} & = \left\{ \begin{array}{l} \frac{1}{{1 + (1 - pearson(u,v))}}{\rm{ if \ }}pearson(u,v) > 0 \\ 0 \ {\rm{ otherwise}} \end{array} \right. \end{flalign} $$

여기에서 $pearson(u,v)$는 사용자 $u$와 사용자 $v$의 피어슨 상관계수입니다.

4.3.1.3 아이템 피어슨 유사도

아이템 피어슨 유사도는 두 아이템을 모두 평가한 사용자 집합의 평점간 유사도를 계산합니다. 임의의 아이템 $i$와 아이템 $j$의 피어슨 상관계수의 정의식은 다음과 같이 정의됩니다.

$$ \begin{flalign} pearson(i,j) & = \frac{{\sum\nolimits_{u \in {U_i} \cap {U_j}} {(r_{ui} - {\mu _i})({r_{uj}} - {\mu _j})} }}{{\sqrt {\sum\nolimits_{u \in {U_i} \cap {U_j}} {{{(r_{ui} - {\mu _i})}^2}} } \sqrt {\sum\nolimits_{u \in {U_i} \cap {U_j}} {{{({r_{uj}} - {\mu _j})}^2}} } }} \end{flalign} $$

여기에서 ${U_i} \cap {U_j}$는 아이템 $i$와 $j$를 모두 평가한 사용자 평점 집합, $r_{ui}$와 ${r_{uj}}$는 사용자 $u$가 아이템 $i$와 아이템 $j$에 매긴 평점, ${\mu _i}$은 아이템 $i$를 평가한 사용자 집합 ${U_i}$의 평점 평균, ${\mu_j}$는 아이템 $i$를 평가한 사용자 ${U_j}$집합의 평점 평균입니다. 임의의 아이템 $i$와 아이템 $j$의 피어슨 상관계수의 계산식은 다음과 같이 정의됩니다.

$$ \begin{flalign} pearson(i,j) = \frac{{n\sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{ui}{r_{uj}} - \sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{ui}} \sum\nolimits_{u \in {U_i} \cap {U_j}} {{r_{uj}}} } }}{{\sqrt {n\sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{ui}^2 - {{(\sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{ui}} )}^2}} } \sqrt {n\sum\nolimits_{u \in {U_i} \cap {U_j}} {r_{uj}^2 - {{(\sum\nolimits_{u \in {U_i} \cap {U_j}} {{r_{uj}}} )}^2}} } }} \end{flalign} $$

임의의 아이템 $i$와 아이템 $j$의 아이템 피어슨 유사도는 다음과 같이 정의됩니다.

$$ \begin{flalign} {\mathrm{sim} _{pearson} (i,j)} & = \left\{ \begin{array}{l} \frac{1}{{1 + (1 - pearson(i,j))}}{\rm{ if \ }}pearson(i,j) > 0 \\ 0 \ {\rm{ otherwise}} \end{array} \right. \end{flalign} $$

여기에서 $pearson(i,j)$는 아이템 $i$와 아이템 $j$의 피어슨 상관계수입니다.

4.3.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.3.2.1 사용자 피어슨 유사도

사용자 피어슨 유사도는 평점 데이터로 다음 수식을 사용하여 계산해 볼 것입니다.

  • 피어슨 상관계수(정의식)
  • 피어슨 상관계수(계산식)

다음 표는 평점 데이터를 사용자는 행, 아이템은 열로 나타낸 것입니다.

평점 데이터

사용자/아이템 $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

예를 들어 사용자 $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$ 3 5 0.5 3.5 3.5 4.5
$u_5$ 3 4 2.5 4

여기에서 사용자 $u_4$와 사용자 $u_5$가 공통으로 평가한 아이템 {$i_2$, $i_6$}에 대한 각 사용자의 평점은 {5, 3.5}와 {3, 2.5}, 평점 평균은 4.25와 2.75입니다.

피어슨 상관계수(정의식)

피어슨 상관계수의 정의식으로 두 사용자의 피어슨 상관계수를 구해봅니다

두 사용자의 공분산은 $0.375$, 사용자 $u_4$의 표본 분산과 표준편차는 $1.125$$1.06066$, 사용자 $u_5$의 표본 분산과 표준편차는 $0.125$$0.353553$입니다. 두 사용자의 피어슨 상관계수는 공분산을 사용자 $u_4$와 사용자 $u_5$의 표준편차를 곱한 값으로 나눈 $1$이 됩니다.

$$ \begin{flalign} pearson(u_4,u_5) & = \frac{{0.375}}{{\sqrt {1.125} \times \sqrt {0.125}}} \\ & = \frac{{0.375}}{1.06066 \times 0.353553} \\ & \approx 1 \end{flalign} $$

피어슨 상관계수(계산식)

이번에는 좀더 간단하게 계산식으로 두 사용자의 피어슨 상관계수를 구해봅니다

$$ \begin{flalign} pearson(u_4,u_5) & = \frac{{0.75}}{{\sqrt {2.25} \times \sqrt {0.25}}} \\ & = 1 \end{flalign} $$

피어슨 상관계수의 계산식으로 계산 결과가 정의식과 같음을 확인할 수 있습니다.

피어슨 유사도

두 사용자의 피어슨 상관계수는 1로 양의 상관관계입니다. 따라서 다음과 같이 유사도를 계산할 수 있습니다.

$$ \begin{flalign} {\mathrm{sim} _{pearson} (u_4,u_5)} = \frac{1}{{1 + (1 - 1)}} = 1 \end{flalign} $$

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

계산 결과

공분산 사용자 $u_4$의 표본 분산 사용자 $u_4$의 표준편차 사용자 $u_5$의 표본 분산 사용자 $u_5$의 표준편차 피어슨 상관계수 유사도
0.375 1.125 1.06066 0.125 0.353553 1 1

같은 방법으로 사용자 피어슨 유사도를 모두 계산해 봅니다. 다음 표는 사용자 피어슨 유사도 데이터를 사용자(LHS)는 행, 사용자 (RHS)는 열로 나타낸 것입니다.

[사용자 피어슨 유사도 데이터]

사용자(RHS) 사용자(LHS) $u_1$ $u_2$ $u_3$ $u_4$ $u_5$
$u_1$ 1 0.5 0.9128536 0.9435943 0.5
$u_2$ 0.5 1 0.5 0.5165338 0.971558
$u_3$ 0.9128536 0.5 1 0.5 0.5
$u_4$ 0.9435943 0.5165338 0.5 1 1
$u_5$ 0.5 0.971558 0.5 1 1

4.3.2.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

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

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

사용자 아이템 $u_1$ $u_2$ $u_3$ $u_4$ $u_5$
$i_3$ 1 3.5 1 4
$i_1$ 0.5 3 3

여기에서 아이템 $i_3$과 아이템 $i_1$을 공통으로 평가한 사용자 {$u_1$, $u_2$}에 대한 각 아이템의 평점은 {1, 3.5}와 {0.5, 3}, 평점 평균은 2.25와 1.75입니다.

피어슨 상관계수(정의식)

피어슨 상관계수의 정의식으로 두 아이템의 피어슨 상관계수를 구해봅니다

두 아이템의 공분산은 $3.125$, 아이템 $i_3$의 표본 분산과 표준편차는 $3.125$$1.7677$이고 아이템 $i_1$의 표본 분산과 표준편차는 $3.125$$1.7677$입니다. 두 아이템의 피어슨 상관계수는 피어슨 상관계수는 공분산을 아이템 $i_3$과 아이템 $i_1$의 표준편차를 곱한 값으로 나눈 $1$이 됩니다.

$$ \begin{flalign} pearson(i_3,i_1) & = \frac{{3.125}}{{\sqrt {3.125} \times \sqrt {3.125}}} \\ & = \frac{{3.125}}{1.7677 \times 1.7677} \\ & \approx 1 \end{flalign} $$

피어슨 상관계수(계산식)

이번에는 좀더 간단하게 계산식으로 두 아이템의 피어슨 상관계수를 구해봅니다.

$$ \begin{flalign} pearson(i_3,i_1) & = \frac{{6.25}}{{\sqrt {6.25} \times \sqrt {6.25}}} \\ & = 1 \end{flalign} $$

피어슨 상관계수의 계산식으로 계산 결과가 정의식과 같음을 확인할 수 있습니다.

피어슨 유사도

두 아이템의 피어슨 상관계수는 1로 양의 상관관계입니다. 따라서 다음과 같이 유사도를 계산할 수 있습니다.

$$ \begin{flalign} {\mathrm{sim} _{pearson} (i_3,i_1)} = \frac{1}{{1 + (1 - 1)}} = 1 \end{flalign} $$

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

계산 결과

공분산 아이템 $i_3$의 표본 분산 아이템 $i_3$의 표준편차 아이템 $i_1$의 표본 분산 아이템 $i_1$의 표준편차 피어슨 상관계수 유사도
3.125 3.125 1.7677 3.125 1.7677 1 1

같은 방법으로 아이템 피어슨 유사도를 모두 계산해 봅니다. 다음 표는 아이템 피어슨 유사도 데이터를 아이템 (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.5 1 NaN 0 1 1 0 0.5 0.5
$i_2$ 0.5 1 0.5 0.5 NaN 0.7539392 0.5 0 0.9477875 1
$i_3$ 1 0.5 1 0.5 NaN 0.580501 0.9879755 NaN NaN 0.5
$i_4$ NaN 0.5 0.5 1 NaN 0.5 0 0 0.5 0
$i_5$ 0 NaN NaN NaN 1 0 0 NaN 0 0
$i_6$ 1 0.7539392 0.580501 0.5 0 1 0.5 0 0.881854 0
$i_7$ 1 0.5 0.9879755 0 0 0.5 1 NaN 0 0.5
$i_8$ 0 0 NaN 0 NaN 0 NaN 1 0 NaN
$i_9$ 0.5 0.9477875 NaN 0.5 0 0.881854 0 0 1 0
$i_{10}$ 0.5 1 0.5 0 0 0 0.5 NaN 0 1

NaN에 대한 설명 추가 필요 -> R코드 실행 결과에도 recommenderlab과 비교 설명 필요

4.3.3 예제 코드 실행해보기

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

"직접 계산하기"의 결과

구분 평점 정규화 결측값 처리 좌변 우변 유사도 설명
사용자 유사도 없음 쌍대 열 제외 $u_4$ $u_5$ 1 두 사용자 모두에게 평가된 아이템 집합의 평점간 유사도
아이템 유사도 없음 쌍대 열 제외 $i_3$ $i_1$ 1 두 아이템을 모두 평가한 사용자 집합의 평점간 유사도

4.3.3.1 구현 클래스 살펴보기

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

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

Download

[UML 클래스 다이어그램]

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

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

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

주요 매개변수

매개변수 유형 필수여부 기본값 설명
group Enum Group.USER 유사도 계산 기준을 Group 열거형 유형으로 설정(Group.USER: 사용자, Group.ITEM: 아이템)
groupCol String criterion 유사도 계산 기준을 문자열로 설정(“user”: 사용자, “item”:아이템).
imputeZero 쌍대 열의 어느 한쪽 값이 결측인 경우의 결측치 처리(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”)으로 정규화된 평점

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

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

4.3.3.2 예제 코드 살펴보기

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

PearsonSimilarityTest.java

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

다음으로 ❷ Parquet 유형의 평점 데이터를 읽어 들이고(38행) ❸ 평점 정규화가 필요한 경우에 평점을 정규화합니다(40행~42행). 다음으로 ❹ PearsonSimilarityMeasurer 클래스의 인스턴스를 생성하고(44행~48행) ❺ 평점 데이터를 전달하여 유사도를 계산합니다 (50행). 마지막으로 ❻ "직접 계산하기"에서 계산해 본 결과에 해당하는 기댓값(Expected)과 예제 코드의 실행 결과인 실제 값(Actual)의 소수 자릿수 7자리까지 비교합니다(66행).

4.3.3.3 실행 결과 확인하기

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

./gradlew :recommender-examples:test --tests com.r4tings.recommender.examples.ch04.PearsonSimilarityTest.pearsonSimilarityExamples

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

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

테스트 인자 목록

구분 데이터 경로 기준 상세출력 좌변(LHS) 우변(RHS) 유사도
사용자 피어슨 유사도 dataset/r4tings/ratings.parquet USER true $u_4$ $u_5$ 1
아이템 피어슨 유사도 ITEM true $i_3$ $i_1$ 1
```

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

예제 코드 실행 결과더보기

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

4.3.3.4 R 패키지로 확인해보기

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

PearsonSimilarity.R

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

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

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

이 실행 결과에서 볼 수 있듯이 ❶ 원본 평점을 사용한 사용자 피어슨 유사도 계산과 ❷ 원본 평점을 사용한 아이템 피어슨 유사도 계산 결과를 확인할 수 있습니다. 또한, 실행 결과가 "직접 계산하기"의 계산 결과와 같음을 확인할 수 있습니다.

한글:4729 영어:5986 숫자:1956

추천 시스템: 워크북

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.