2015년 4월 6일 월요일

Recommander System

Recommander System


  1. Collaborative Filtering
    x가 피쳐 백터
    \Theta가 유저별 liner regression 파라미터 백터라고 할때
    x^{(1)},\dots,x^{(n_{m})}을 주면 \Theta^{(1)},\dots,\Theta^{(n_{u})} 을 구할수있다.
    \min\limits_{\Theta^{(1)},...,\Theta^{(n_{u})}}\frac{1}{2}\sum_{j=1}^{n_{u}}\sum_{i:r(i,j)=1}((\Theta^{(j)})^{T}x^{(i)} - y^{(i,j)})^2 + \frac{\lambda }{2}\sum_{j=1}^{n_{u}}\sum_{k=1}^{n}(\Theta^{(j)}_{k})^2
    반대로 \Theta^{(1)},\dots,\Theta^{(n_{u})} 을 주면 x^{(1)},\dots,x^{(n_{m})} 을 구할수있다.
    \min\limits_{x^{(1)},...,x^{(n_{m})}}\frac{1}{2}\sum_{i=1}^{n_{m}}\sum_{j:r(i,j)=1}((\Theta^{(j)})^{T}x^{(i)} - y^{(i,j)})^2 + \frac{\lambda }{2}\sum_{i=1}^{n_{m}}\sum_{k=1}^{n}(x^{(j)}_{k})^2
    결국 닭이 먼저냐 달걀이 먼저냐 라는 생각이 든다. 하지만 우리는 유저가 각 영화에 점수를 매긴 값을 가지고 있다 어떻게 보면 x 와 세타는 유저별 영화평점에서 파생된 점수 들이라는 관점에서 볼수있다.
    그렇다면 세타와 x를 랜덤벨류로 주고 gradient descendent를 돌린다면? 둘다 구할수 있다 여기서 우리는 아래의 cost function 을 얻을수 있다
    J(x^{(1)},...,x^{(n_{m})},\Theta^{(1)},\dots,\Theta^{(n_{u})}) = \frac{1}{2}\sum_{(i,j):r(i,j)=1}((\Theta^{(j)})^{T}x^{(i)} - y^{(i,j)})^2 + \frac{\lambda }{2}\sum_{i=1}^{n_{m}}\sum_{k=1}^{n}(x^{(j)}_{k})^2 + \frac{\lambda }{2}\sum_{j=1}^{n_{u}}\sum_{k=1}^{n}(\Theta^{(j)}_{k})^2
    위의 펑션을 cost funciton으로 하고 아래의 코스트 펑션의 미분 식 으로 파라미터 값을 동시에 갱신하면 된다.
    \frac{\partial J}{\partial x^{(i)}_{k}} = \sum_{j:r(i,j)=1}((\Theta^{(j)})^{T}x^{(i)} - y^{(i,j)})\Theta^{(j)}_{k}  + \lambda x^{(i)}_{k}
    \frac{\partial J}{\partial \Theta^{(j)}_{k}} = \sum_{i:r(i,j)=1}((\Theta^{(j)})^{T}x^{(i)} - y^{(i,j)})x^{(i)}_{k}  + \lambda \Theta^{(j)}_{k}
    이렇게 우리는 피쳐백터 x 와 각 유저별 파라미터 벡터를 얻을수 있기 때문에 해당 유저가 평점을 매기지 않은 점수도 예측할수 있게 된다.
    하지만 위의 식에서 평점을 0~5 라고 할때 평점을 매기지 않은 점수를 0으로 가정해서 알고리즘을 적용하면 문제가 발생할 요지가 있다.
    유저가 평가를 안했으면 0점이 아니라 평균 점수를 주는게 맞기 때문이다.
    그래서 우리는 평점을 nomaliztion 해서 사용할경우 좀더 좋은 결과를 얻을수있다.