일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- brew 권한
- image restoration
- Readme image
- tcp
- rust
- cs231n
- 머신러닝
- 커널생성
- react-cookie
- 커널제거
- 자바스크립트 비동기
- computer vision
- 딥러닝
- 컴퓨터 보안 키분배
- 파이썬
- pagerank
- recommender
- feynman's restaurant
- Hits
- 협업필터링
- 러스트
- 페이지랭크
- 인페인팅
- 메세지인증코드
- 인공지능
- 키분배 알고리즘
- Git
- 프라미스
- 파인만의 식당문제
- 비동기 프로그래밍
- Today
- Total
Worth spreading
Matrix Factorization _ Part 2 본문
이 글은 Nicolas hug씨의
Understanding mtrix factorization
을 한글로 번역한 글입니다.
오역이나 잘못 설명된 부분을 발견하신 분은 댓글로 알려주시면 감사하겠습니다.
SVD of a (dense) rating matrix
Part2를 시작하기 전 지난시간 했던 것들을 짧게 복습해보자.
1) 행렬 R에 대한 PCA를 통해 typical user의 정보를 얻을 수 있다. 이 typical user는 original user와 같은 크기의 벡터이다. (creepy/typical guy 예제와 같은 맥락) 그리고 typical user가 벡터이기 때문에 우리는 typical user들을 열(column)으로 갖는 행렬을 정의할 수 있다. 이 행렬을 U라고 부르자.
2) R^T에 대한 PCA를 통해서는 typical movie의 정보를 얻을 수 있다. typical movie도 마찬가지로 벡터이며 위와 같이 typical movie를 열로 갖는 행렬을 만들어 이를 M이라고 부르자.
The matrix factorization
그럼 이제 SVD에 대해서 살펴보자. SVD를 한마디로 표현하면 R과 R^T에 대한 PCA다. SVD는 R을 가지고 위의 U와 M을 동시에 구하는 것이라고 할 수 있다. 즉 SVD를 통해 typical user와 typical movie를 한번에 구할 수 있다. R을 3개의 행렬로 factorizing해서 U와 M를 구해주는 것이다. 이를 matrix factorization이라고 부르며 다음과 같이 표현한다.
즉, SVD는 R를 입력받아 다음과 같은 M,Σ 그리고 U를 반환하는 알고리즘이다.
* R은 MΣU^T 와 같다
* M의 열들은 R의 column들로 분해될 수 있다.(지난 시간에 살펴본 것)
* U의 열들은 R의 row들로 분해될 수 있다.
* M과 U의 열들은 각각 직교한다.(orthogonal하다) 이걸 먼저 말하지 않았는데 PCA의 값들은 언제가 orthogonal하다. 이건 PCA(그리고SVD)에서 정말 중요한 성질이다. 하지만 우리 추천시스템에선 크게 상관하지 않을 것이다. (뒤에서 더 살펴볼 것이다) (역자 : PCA에 더 자세한 정보는 여기를 참조)
* Σ는 대각행렬이다.(뒤에서 더 살펴볼 것이다)
위 특성들을 종합해서 다음과 같이 말할 수 있다: M의 열들은 R의 열공간(column space)를 가로지르는 직교기저벡터(an orthogonal basis)이며 U의 열들은 R의 행공간(row space)를 가로르는 직교기저벡터이다. 이 구문이 잘 와닿았으면 좋겠다. 개인적으로 난 그냥 creepy guy나 typical potatoes같은 애들의 이야기를 하는 게 좋다.
The model behind SVD
우리가 rating matrix R의 SVD를 계산하고 이용하는 것은 rating(점수)를 구체적이고 의미를 가질 수 있도록 모델링하는 것으로 볼 수 있다. 모델링이라는 의미를 좀 살펴보자.
위에서 Σ를 얘기할 때 그냥 대각행렬이라고 간단히 소개했는데 행렬에 대각행렬은 곱하는 연산은 행렬을 scaling한다는 의미로 해석할 수 있다. 때문에 Σ를 제외하고 이야기해도 크게 문제가 되지 않는다. 따라서 위의 R을 다음과 같이 다시 표현할 것이다.
자 이제 이 식을 이용해 item(i)에 대한 user(u)의 점수를 살펴보자. r_(ui)로 표현할 것이다.
행렬곱의 정의에 따라 r_(ui) 값은 M의 행인 p_u(user에 대한 정보)와 와 U^T의 열인 q_i(item에 대한 정보)의 곱(내적)의 결과라고 할 수 있다.
'•'은 dot product(내적)을 뜻한다. 자 이제 우리가 전에 user와 item을 표현했던 것을 떠올려보자.
위에서 설명한 벡터 p_u와 q_i는 우리가 latent factor에게 부여한 값들과 일치한다.(Well, the values of the vectors
벡터 p_u는 user의 각 latent factor에 대한 선호도(기여도)를 나타낸다. 이와 동일하게 벡터 q_i는 item의 각 latent factor에 대한 기여도를 나타낸다. Alice는 (10%,10%,50%, ...)으로 나타나 있는데 이를 해석하자면 alice는 액션과 코미디보다 로맨스를 더 좋아한다. Bob은 다른 것보다 액션을 선호한다. 그리고 영화 타이타닉은 로맨스에 가깝다고 할 수 있다.
우리가 R의 SVD를 이용할 때, 어떤 item i에 대한 어떤 user u의 점수를 다음과 같이 모델링한다고 할 수 있다.
달리 말하면 어떤 user u가 어떤 item i을 선호한다고 하면 r_(ui)는 큰 값을 가질 것이다.
반대로, i가 u를 좋아하지 않는다면(the coefficient don't match well), r_(ui)는 작은 값을 가질 것이다.
우리 예제의 경우 alice의 titanic에 대한 점수는 높지만 bob의 경우는 낮다. 이는 그가 로맨스에 대한 점수가 낮기 때문이라고 볼 수 있다. 하지만 토이스토리에 대한 그의 점수는 alice의 경우보다 크다.
자 이정도면 SVD를 추천시스템에 적용하기 위해 필요한 지식을 어느정도 습득했다고 볼 수 있다.
그 전에 우린 R이 dense matrix라고 가정할 것이다. 실제론 sparse하지만 이걸 dense하게 만드는 것이 우리 목표니까.
다음 part에서 보자!
관련 글
- Understanding matrix factorization for recommendation (part4)
- Understanding matrix factorization for recommendation (part3)
- Understanding matrix factorization for recommendation (part1)
'ABCD > Data mining' 카테고리의 다른 글
Basic Collaborative-Filtering (0) | 2018.07.21 |
---|---|
Feynman's restaurant problem (0) | 2018.06.26 |
Pagerank(페이지랭크) (0) | 2018.06.16 |
Matrix Factorization _ Part3 (0) | 2018.06.03 |
Matrix Factorization _ Part 1 (0) | 2018.06.02 |