강의

멘토링

로드맵

Inflearn brand logo image

인프런 커뮤니티 질문&답변

박종성님의 프로필 이미지
박종성

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

TMDB5000 데이터 세트를 이용한 콘텐츠기반 필터링 구현 실습 - 02

TMDB5000 데이터 세트를 이용한 콘텐츠기반 필터링 구현 실습 - 02 강의내용 질문입니다

작성

·

68

·

수정됨

0

안녕하세요

168. TMDB5000 데이터 세트를 이용한 콘텐츠기반 필터링 구현 실습 - 02

강의에서

9:50 부분을 보면
find_sim_movie() 함수가 있습니다

강의 동영상에서는 The Godfather 와
유사도가 높은 순으로 결과가 나왔는데
The Godfather 가 유사도가 가장 높아야 되는데
The Godfatehr 가 아니고 다른 영화가
유사도가 가장 높은 것으로 나옵니다
왜 이런 결과가 나오는지 설명 부탁드립니다

답변 2

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

첫번째 나오는 find_sim_movie() 함수가 약간 소스코드가 잘못된 측면이 있습니다. 원래는 자기 자신은 언제나 유사도가 1이기 때문에 자기 자신을 제외한 코사인 유사도 행렬에서 그 다음 높은 값을 찾아야 하는데, 해당 소스 코드가 생략이 되어 있습니다. 그런데 이 코드가 생략되었음에도 The Godfather와 가장 유사한 영화가 자기 자신이 아닌 다른 영화를 찾아 주는 결과가 될 수 있는데, 이런 경우는 해당 유사도가 1과 컴퓨터 계산적으로 동일한 0.999999999 와 같은 값일 때 이 경우 1로 동일하게 간주해서 argsort() 시에 해당 인덱스를 가장 높은 값으로 추출해 줄 수 있습니다.

그래서 강의 영상에 마지막 쯤에 보시면 find_sim_movie() 함수가 재 정의 되어 있습니다. 여기서는 기준영화 index를 제외하는 것으로 소스코드가 제대로 적용됩니다.

# 기준 영화 index는 제외

similar_indexes = similar_indexes[similar_indexes != title_index]

재 정의된 find_sim_movie() 함수가 바르게 작성된 함수로 생각해 주시면 될 것 같습니다.

감사합니다.

박종성님의 프로필 이미지
박종성
질문자

자세한 설명 감사드립니다.
재정의된 find_sim_movie() 함수에서는
자기 자신이 제외되고 나옵니다.
그런데,
similar_indexes = similar_indexes[similar_indexes != title_index]
이 부분을 주석처리하고 실행하면 자기 자신도 나와야 되는 것 아닌지요?
이 부분을 주석처리하고 실행하면 자기 자신도 나오는 영화가 있는가 하면
자기 자신은 제외하고 나오는 영화도 있습니다.
결과가 이렇게 나오는 것은 무슨 이유 때문에 그런 건지요?

권 철민님의 프로필 이미지
권 철민
지식공유자

similar_indexes = similar_indexes[similar_indexes != title_index]
이 부분을 주석처리하고 실행하면 맨 처음 정의된 find_sim_movie() 함수 인데, 이전 답변에서도 말씀드렸듯이 자기 자신은 1, 다른 코사인 유사도가 0.9999999.... 가 되면 두개를 동일하게 1로 간주하여서 1등이 2개가 되어서, 이 중에 한개를 임의 선택하면서 자기 자신이 나올때도 있고, 그렇지 않을때도 있습니다.

 

박종성님의 프로필 이미지
박종성
질문자

답변 감사드립니다.

"두 개를 동일하게 1로 간주하여서 1등이 2개가 되어서, 이 중에 한 개를 임의 선택하면서 자기 자신이 나올 때도 있고, 그렇지 않을 때도 있습니다"

라고 하셨는데요, 자기 자신이 나오지 않는다는 것은
아예 목록 전체에서 나오지 않게 된다는 의미로 이해하면 되는지요.

 

 

권 철민님의 프로필 이미지
권 철민
지식공유자

자기 자신이 나오지 않는다는 것은
아예 목록 전체에서 나오지 않게 된다는 의미로 이해하면 되는지요.

=> 아뇨, 그런건 아닙니다만 아무래도 genre를 기준으로 count vectorizer 적용하다보니 cosine similarity가 동일한 영화가 상당히 많이 나와서, 헷갈리실 수 있을 것 같습니다.

예를 들어 The Godfather는 코사인 유사도가 1.0 인게 26개가 있습니다. 아래 코드로 확인해 보시면 됩니다. The Godfather는 index id가 3337 입니다.

genre_sim_temp = genre_sim[3337]

print(genre_sim_temp[genre_sim_temp >= 0.9999999].shape)

그러다 보니 def find_sim_movie(df, sorted_ind, title_name, top_n=10) 에서 top_n이 10개 일때 자신이 포함될 수도 있고 포함되지 않을 수도 있는 결과가 나오는 군요.

0

안녕하세요, 인프런 AI 인턴입니다. 박종성님.

귀하의 질문에 대해 이해를 돕기 위해 설명드리겠습니다. find_sim_movie() 함수 내부에서 사용되는 similar_indexes = similar_indexes[similar_indexes != title_index] 이 부분은 기준 영화를 제외하고 유사한 영화를 찾기 위해 사용되는 코드는 맞습니다.

주석처리를 했음에도 불구하고, 기준 영화가 결과에 나타나지 않는다면 몇 가지 가능성을 고려해볼 수 있습니다. 예를 들어, 해당 영화의 유사도 계산에서 0으로 되어 더 이상 결과 리스트에 포함되지 않았거나, 또는 다른 내부 로직에서 자동으로 제거되는 경우입니다.

하지만, 일반적으로 주석 처리 시 기준 영화가 출력 목록에 나타나는 것이 맞습니다. 따라서 코드 전반적인 로직에서 오타나 다른 문제가 있는지 꼼꼼히 점검해 볼 필요가 있습니다.

유사한 질문에 대한 답변을 링크해드릴 테니 참고해 주세요: 컨텐츠 기반 필터링 실습 마지막 코드 질문

저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.

박종성님의 프로필 이미지
박종성
질문자

현재 답변은 봇으로 달아놓으신 것 같습니다.
9:50 부분에서 find_sim_movie() 함수에는
similar_indexes = similar_indexes[similar_indexes != title_index]
이 부분이 없습니다

이 부분은 마지막에 나옵니다.
엉뚱한 답변이 달렸습니다

질문 내용은 다음과 같습니다.
강의 동영상에서는 The Godfather 와
유사도가 높은 순으로 결과가 나왔는데
The Godfather 가 유사도가 가장 높아야 되는데
The Godfatehr 가 아니고 다른 영화가
유사도가 가장 높은 것으로 나옵니다
왜 이런 결과가 나오는지 설명 부탁드립니다

봇이 아니라 담당 강사님으로부터 답변을 받고 싶습니다

 

 

권 철민님의 프로필 이미지
권 철민
지식공유자

인프런 AI 답변은 제가 생성하는 것이 아니라 인프런에서 자동으로 생성하는 답변입니다. 인프런 AI 답변이 달려 있어도, 늘 제가 답변을 드립니다. 인프런 AI 답변은 즉각적으로 유용할 수 있는 답변을 드리기 위해서 인프런에서 잘 만든 서비스이오니 보조 수단으로 생각해 주십시요.

박종성님의 프로필 이미지
박종성

작성한 질문수

질문하기