상관 계수, 코사인 유사도의 관계
상관 계수, 코사인 유사도의 관계
상관 계수와 코사인 유사도의 차이와 유사성에 대해 정량적으로 쓰여진 사이트가 별로 없었기 때문에 조사 견해를 메모로 남긴다.
데이터 정의
이번에 취급하는 데이터를 다음과 같이 정의한다.
(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)
또는 위의 2D 데이터를 nD 데이터로 간주합니다.
\begin{align}
\boldsymbol{x} &= (x_1,x_2,\cdots,x_n)\top \\
\boldsymbol{y} &= (y_1,y_2,\cdots,y_n)\top
\end{align}
라고 표현하기로 한다.
상관 계수
상관 계수는 다음과 같이 정의된다.
\begin{align}
Corr(\boldsymbol{x},\boldsymbol{y}) &= \frac{(\boldsymbol{x} - \bar{\boldsymbol{x}})\top(\boldsymbol{y} - \bar{\boldsymbol{y}})}{\sqrt{(\boldsymbol{x} - \bar{\boldsymbol{x}})\top(\boldsymbol{x} - \bar{\boldsymbol{x}})}{\sqrt{(\boldsymbol{y} - \bar{\boldsymbol{y}})\top(\boldsymbol{y} - \bar{\boldsymbol{y}})}}}
\end{align}
주)
\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i\\
\bar{y} = \frac{1}{n}\sum_{i=1}^{n} y_i\\
\bar{\boldsymbol{x}} = (\bar{x},\bar{x},\cdots,\bar{x})\top\\
\bar{\boldsymbol{y}} = (\bar{y},\bar{y},\cdots,\bar{y})\top
로 정의한다.
코사인 유사도와 비교하기 위해 벡터의 내적으로 작성했지만,
\begin{align}
Corr(\boldsymbol{x},\boldsymbol{y}) &= \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^n (x_i - \bar{x})^2}\sqrt{\sum_{i=1}^n (y_i - \bar{y})^2}}
\end{align}
라고 표현할 수도 있다.
코사인 유사도
코사인 유사도는 다음과 같이 정의된다.
\begin{align}
Cossim(\boldsymbol{x},\boldsymbol{y}) &= \frac{\boldsymbol{x}\top\boldsymbol{y}}{\sqrt{\boldsymbol{x}\top\boldsymbol{x}}{\sqrt{\boldsymbol{y}\top\boldsymbol{y}}}}
\end{align}
또한, 다음과 같이 표현할 수도 있다.
\begin{align}
Cossim(\boldsymbol{x},\boldsymbol{y}) &= \frac{\sum_{i=1}^n x_i y_i}{\sqrt{\sum_{i=1}^n x_i^2} \sqrt{\sum_{i=1}^n y_i^2}}
\end{align}
차이와 유사성
조사했을 때에 깨달은 상관계수와 코사인 유사도의 차이를 언급한다.
차이①
import numpy as np
np.random.seed(0)
x = np.random.rand(100)
y = np.random.rand(100)
상기와 같이, 0.0 이상, 1.0 미만의 균일 분포로부터 100개의 데이터를 얻은 것을 $x, y$로 한다.
상관 계수는 0 당이 될 것으로 예상된다.
다음과 같이 상관 계수를 계산한다.
np.corrcoef(x, y)[0][1]
결과는 -0.06610711104791324로 돌아온다.
한편, 코사인 유사도는 다음과 같이 정의할 수 있으며, 계산하면
def cossim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
cossim(x,y)
결과는 0.7402807972603874로 돌아온다.
이것은 데이터가 모두 양의 값이기 때문에 난수를 발생시켰음에도 불구하고 높은 (무엇을 사용하여 높다고 하는지는 두고) 유사도를 얻어 버린다.
cossim(x-np.mean(x),y-np.mean(y))
그러나, 상기와 같이 평균값으로 당겨 주면, 상관 계수와 같은 결과가 되는 것은 전술한 식을 보면 분명하고,
결과는 -0.06610711104791324로 돌아온다.
차이 ②
방금전은 100차원으로 생각했지만, 다음은 2차원으로 생각하기로 한다.
import numpy as np
np.random.seed(0)
x = np.random.rand(2)
y = np.random.rand(2)
상관 계수는
np.corrcoef(x, y)[0][1]
계산하면 -1을 반환합니다.
기본 상관 계수를 2차원으로 계산하면 평균값을 뺀 변환에 의해 제2 사분면, 제4 사분면으로 점이 변환되므로 -1 or 1 밖에 얻을 수 없다. (주 : 원점으로 변환되면 분모가 0이므로 nan을 반환합니다)
한편 코사인 유사도는
cossim(x,y)
결과는 0.9836164444783699를 반환합니다.
유사성
데이터의 평균이 대략 0이고 차원이 높은 경우 상관 계수와 코사인 유사도는 유사한 관계를 나타낸다.
상관 계수와 차원
마지막으로 차원이 오르면 상관 계수가 어떻게 변하는지 언급합니다.
변수는 독립적이며 표준 정규 분포를 따릅니다.
여기서, 2,5,10,100,1000차원의 상관 계수를 100000회 반복함으로써 히스토그램을 생성하였다.
import numpy as np
import matplotlib.pyplot as plt
def get_coef_array(count, dim):
coef = []
for i in range(count):
vec_1 = np.random.randn(dim)
vec_2 = np.random.randn(dim)
coef.append(np.corrcoef(vec_1, vec_2)[0][1])
return np.array(coef)
dim_lst = [2,5,10,100,1000]
count = 100000
fig, axs = plt.subplots(len(dim_lst),figsize=(8, 8))
fig.suptitle('Correlation coefficient histogram')
for i, dim in enumerate(dim_lst):
coef = get_coef_array(count, dim)
axs[i].hist(coef,range=(-1, 1),bins=100)
plt.tight_layout()
plt.show()
결과는 위 그림과 같으며,
차원이 높을수록(데이터 수가 많을수록) 상관 계수가 낮게 산출될 확률이 높아진다.
또, 상관 계수의 검정 통계량은 통계 웹 26-3. 상관 계수에 의하면, $n$를 샘플 사이즈, $r$를 상관 계수로 한 경우 이하와 같이 나타낼 수 있는 것 같다.
\begin{align}
t &= \frac{\left|r\right|\sqrt{n-2}}
{\sqrt{1-r^{2}}}
\end{align}
그 외에도 상관 계수의 유의 검정을 실시하고 싶은 경우는 permutation test를 실시하는 방법도 있다.
마지막으로
상관 계수의 p 값을 상기에서 얻을 수 있다는 이유가 이제 몰라서 향후 조사해 나가고 싶다.
실수가 있으면 지적 부탁드립니다.
참고
Qiita【Python NumPy】코사인 유사도를 구하는 방법
Qiita 상관 계수와 코사인 유사도
cos 유사도 차원의 저주
통계 웹 26-3. 상관 계수
Reference
이 문제에 관하여(상관 계수, 코사인 유사도의 관계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/yu__/items/28dec5db0acb528e4dcd
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
(x_1,y_1),(x_2,y_2),\cdots,(x_n,y_n)
\begin{align}
\boldsymbol{x} &= (x_1,x_2,\cdots,x_n)\top \\
\boldsymbol{y} &= (y_1,y_2,\cdots,y_n)\top
\end{align}
\begin{align}
Corr(\boldsymbol{x},\boldsymbol{y}) &= \frac{(\boldsymbol{x} - \bar{\boldsymbol{x}})\top(\boldsymbol{y} - \bar{\boldsymbol{y}})}{\sqrt{(\boldsymbol{x} - \bar{\boldsymbol{x}})\top(\boldsymbol{x} - \bar{\boldsymbol{x}})}{\sqrt{(\boldsymbol{y} - \bar{\boldsymbol{y}})\top(\boldsymbol{y} - \bar{\boldsymbol{y}})}}}
\end{align}
\bar{x} = \frac{1}{n}\sum_{i=1}^{n} x_i\\
\bar{y} = \frac{1}{n}\sum_{i=1}^{n} y_i\\
\bar{\boldsymbol{x}} = (\bar{x},\bar{x},\cdots,\bar{x})\top\\
\bar{\boldsymbol{y}} = (\bar{y},\bar{y},\cdots,\bar{y})\top
\begin{align}
Corr(\boldsymbol{x},\boldsymbol{y}) &= \frac{\sum_{i=1}^n (x_i - \bar{x})(y_i - \bar{y})}{\sqrt{\sum_{i=1}^n (x_i - \bar{x})^2}\sqrt{\sum_{i=1}^n (y_i - \bar{y})^2}}
\end{align}
\begin{align}
Cossim(\boldsymbol{x},\boldsymbol{y}) &= \frac{\boldsymbol{x}\top\boldsymbol{y}}{\sqrt{\boldsymbol{x}\top\boldsymbol{x}}{\sqrt{\boldsymbol{y}\top\boldsymbol{y}}}}
\end{align}
\begin{align}
Cossim(\boldsymbol{x},\boldsymbol{y}) &= \frac{\sum_{i=1}^n x_i y_i}{\sqrt{\sum_{i=1}^n x_i^2} \sqrt{\sum_{i=1}^n y_i^2}}
\end{align}
import numpy as np
np.random.seed(0)
x = np.random.rand(100)
y = np.random.rand(100)
np.corrcoef(x, y)[0][1]
def cossim(v1, v2):
return np.dot(v1, v2) / (np.linalg.norm(v1) * np.linalg.norm(v2))
cossim(x,y)
cossim(x-np.mean(x),y-np.mean(y))
import numpy as np
np.random.seed(0)
x = np.random.rand(2)
y = np.random.rand(2)
np.corrcoef(x, y)[0][1]
cossim(x,y)
import numpy as np
import matplotlib.pyplot as plt
def get_coef_array(count, dim):
coef = []
for i in range(count):
vec_1 = np.random.randn(dim)
vec_2 = np.random.randn(dim)
coef.append(np.corrcoef(vec_1, vec_2)[0][1])
return np.array(coef)
dim_lst = [2,5,10,100,1000]
count = 100000
fig, axs = plt.subplots(len(dim_lst),figsize=(8, 8))
fig.suptitle('Correlation coefficient histogram')
for i, dim in enumerate(dim_lst):
coef = get_coef_array(count, dim)
axs[i].hist(coef,range=(-1, 1),bins=100)
plt.tight_layout()
plt.show()
\begin{align}
t &= \frac{\left|r\right|\sqrt{n-2}}
{\sqrt{1-r^{2}}}
\end{align}
Reference
이 문제에 관하여(상관 계수, 코사인 유사도의 관계), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/yu__/items/28dec5db0acb528e4dcd텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)