인기도 기반 추천

JISU LIM·2023년 4월 9일

Recommended System

목록 보기
2/6
post-thumbnail

인기도 기반 추천

인기도 기반 추천이란

  • 말 그대로 가장 인기있는 아이템을 추천하는 추천 시스템의 가장 단순한 형태 중 하나이다.
  • 인기도의 척도는 조회수, 평균 평점, 리뷰 개수, 좋아요, 싫어요 수 등으로 정의할 수 있다.

스코어 만들기

  • 조회수가 가장 많은 아이템을 추천하는 방법이다.
  • 뉴스 추천 등에서처럼 다른 유저들도 많은 관심을 가지고 있는 핫한 이슈를 보고싶어 한다.

Highly Rated

  • 평균 평점이 가장 높은 아이템을 추천하는 방법이다.
  • 맛집 추천 등에서처럼 평점이 높은 맛집일수록 맛있는 음식을 제공한는 레스토랑으로 기대된다.

Most Polular based Score

Score Formula

score=f(popularity,age)score = f(popularity, age)

  • 가장 많이 조회된 뉴스 중 추천 or 좋아요가 가장 많은 게시글을 추천한다.
  • score=(upvotedownvote)time_elasped=pageviewstime_elaspedscore = (upvote-downvote) - time\_elasped = pageviews - time\_elasped
    • 단점 : pageview가 더 빠르게 늘어난다면 많은 시간이 흘러도 같은 글이 계속 Top Rank에 보일 것이다.

Hacker News Formula

score=pageviews1(age+2)gravityscore = {\frac {pageviews-1}{(age+2)^{gravity}}}

  • 시간이 지날수록 age가 점점 증가하므로 score는 작아진다.
  • 시간에 따라 줄어드는 score를 어느정도 조정하기 위해 gravity(1.8)라는 상수를 사용한다.

Reddit Formula

score=log10(upsdowns)+sign(upsdowns)seconds45000score = \log_{10}\left(ups-downs\right)+{\frac {sign(ups-downs)*seconds} {45000}}

  • 첫 번째 term은 polularity를 나타내며, 두 번째 term은 포스팅이 게시된 절대 시간을 나타낸다.
    • 즉, 나중에 게시된 포스팅일수록 절대시간이 크기 때문에 더 높은 score를 가지게 된다.
  • 첫 번째 vote에 대해서 가장 높은 가치를 부여하며, vote가 늘어날 수록 score의 증가 폭이 작아진다.
    • 즉, 오래된 포스팅일수록 상대적으로 많은 vote가 있어야 높은 score를 가지게 된다.

Highly Rated based Score

Score Formula

score=f(rating,# of ratings)score = f(rating, \#\ of\ ratings)

  • 가장 높은 평점을 받은 영화 혹은 맛집을 추천한다.

Steam Rating Formula

  • 평균 rating을 사용하며, 전체 reivew의 개수에 따라 rating을 보정하는 방식이다.

avg_rating=# of positive reviews# of reviewsavg\_rating = {\frac {\#\ of\ positive\ reviews} {\#\ of\ reviews}}

score=avg_rating(avg_rating0.5)2log(# of reviews)score = avg\_rating -(avg\_rating-0.5)*2^{-\log(\#\ of\ reviews)}

  • reivew의 개수가 아주 많을 경우 score는 평균 rating과 유사해진다.

Steam Rating Formula → Movie Rating

  • 영화 평점은 positive, negative가 아닌 1.0부터 5.0의 rating을 사용한다.
    • 따라서 Steam Rating Formula의 보정 수치 0.5 대신 중앙 값인 3.0을 사용한다.
    • 3.0 대신에 모든 평점 데이터의 평균 값을 사용해도 된다.

avg_rating=sum(rating)# of reviewsavg\_rating = {\frac {sum(rating)} {\#\ of\ reviews}}

scores=avg_rating(avg_rating3.0)2log(# of reviews)scores = avg\_rating - (avg\_rating-3.0)*2^{-\log(\#\ of\ reviews)}

def get_steam_rating(
    movie_statistics: pd.DataFrame
) -> None:
    movie_statistics['steam_rating'] = movie_statistics['avg_rating'] - (movie_statistics['avg_rating'] - 2.5) \
    * np.power(2, -np.log10(movie_statistics['num_users']))
profile
Grow Exponentially

0개의 댓글