Recommendation 기본 알고리즘
이해하기 쉽고, 장황하지 않은 자료를 기반으로 강의를 진행합니다.
잔재미코딩 소식 공유
좀더 제약없이, IT 컨텐츠를 공유하고자, 자체 온라인 강의 사이트와 유투브 채널을
오픈하였습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
응원해주시면, 곧 좋은 컨텐츠를 만들어서 공유하겠습니다
● 잔재미코딩 유투브 오픈
[구독해보기]
2. Recommendation 기본 알고리즘¶
2.1. Popularity, High Rated Based (가장 단순함)¶
- 가장 쉽게 인기도, 즉 높은 평점을 갖는 item을 추천 가능
- 모두에게 동일한 item이 추천 됨
In [1]:
ratings={
'Dave':{'달콤한인생':5,'범죄도시':3,'샤인':3},
'David':{'달콤한인생':5,'범죄도시':1,'샤인':4},
'Alex':{'달콤한인생':0,'범죄도시':4,'샤인':5},
'Andy':{'달콤한인생':2,'범죄도시':1,'샤인':5}
}
- 영화중 가장 평점이 높은 순으로 추천해주면 됨
평점이 가장 높은 두 영화 출력하기
In [2]:
movie_dict = dict()
for rating in ratings:
for movie in ratings[rating].keys():
if movie not in movie_dict:
movie_dict[movie] = ratings[rating][movie]
else:
movie_dict[movie] = (movie_dict[movie] + ratings[rating][movie])
for movie in ratings[rating].keys():
movie_dict[movie] = movie_dict[movie] / 4
import operator
sorted_x = sorted(movie_dict.items(), key=operator.itemgetter(1), reverse=True)
print(sorted_x[:2])
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
2.2. Collaborative Filtering¶
- 데이터 구성 : 사용자가 입력한 선호도(평점)를 사용하여 사용자-항목 선호도(평점) 행렬을 만든다.
- 유사도 계산 : 1 단계에서 만들어진 행렬을 사용하여 사용자들 간의 유사도를 계산한다.
- 예측 값 계산 및 추천 목록 생성 : 사용자들 간의 유사도를 바탕으로 모든 항목에 대해 예측 값을 계산하고 높은 예측 값을 갖는 상위 N개의 추천 목록을 생성한다.
1. 데이터 구성¶
In [3]:
ratings={
'Dave':{'달콤한인생':5,'범죄도시':3,'샤인':3},
'David':{'달콤한인생':2,'범죄도시':1,'샤인':4},
'Alex':{'범죄도시':4,'샤인':5},
'Andy':{'달콤한인생':2,'범죄도시':1,'샤인':5}
}
In [4]:
ratings.get('Dave')
Out[4]:
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
In [5]:
ratings.get('Dave').get('샤인')
Out[5]:
2. 유사도를 구해보자 (피타고라스 공식을 통한 거리 계산)¶
In [6]:
import math
def sim(i, j):
return math.sqrt(pow(i,2)+pow(j,2))
In [7]:
var1 = ratings['Alex']['범죄도시'] - ratings['Andy']['범죄도시']
In [8]:
var1
Out[8]:
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
퀄러티가 다른 온라인 강의로 차근차근 익혀보세요
In [9]:
var2 = ratings['Alex']['샤인'] - ratings['Andy']['샤인']
In [10]:
var2
Out[10]:
In [11]:
sim(var1,var2)
Out[11]:
Alex가 평가한 범죄도시, 샤인을 모두 평가한 사용자와 모두 거리 구하기 (유사도 구하기)¶
In [12]:
for i in ratings:
if i!='Alex':
num1 = ratings.get('Alex').get('범죄도시') - ratings.get(i).get('범죄도시')
num2 = ratings.get('Alex').get('샤인') - ratings.get(i).get('샤인')
print(i," : ", sim(num1,num2))
본 자료와 같이 IT 기술을 잘 정리하여, 온라인 강의로 제공하고 있습니다
체계적으로 전문가 레벨까지 익힐 수 있도록 온라인 강의 로드맵을 제공합니다
정규화를 통해 유사도 범위를 0과 1사이로 가두고, 1에 가까울 수록 유사도가 높게 변경하기¶
In [13]:
for i in ratings:
if i!='Alex':
num1 = ratings.get('Alex').get('범죄도시') - ratings.get(i).get('범죄도시')
num2 = ratings.get('Alex').get('샤인') - ratings.get(i).get('샤인')
print(i," : ", 1 / ( 1 + sim(num1,num2) ) )
Dave가 평가한 범죄도시와 샤인 모두 평가한 사용자와의 거리를 구해서, 가장 Dave와 유사한 사용자 구하기
In [14]:
for i in ratings:
if i!='Dave':
num1 = ratings.get('Dave').get('범죄도시') - ratings.get(i).get('범죄도시')
num2 = ratings.get('Dave').get('샤인') - ratings.get(i).get('샤인')
print(i," : ", 1 / ( 1 + sim(num1,num2) ) )