2022. 3. 2. 22:10ㆍ프로젝트/KFood
우리 서비스에서 외국인에게 음식 사진을 받으면 YOLO로 detect(classification) 해서 무슨 한국음식인지 알려주고,
그것이 외국인의 입맛에 잘 맞을지 설문 및 간단한 추천을 해주는 서비스를 추가로 하려고 한다.
추천 알고리즘
- 음식마다 각각 선호도를 나타낼 수 있는 피쳐 (Contents Based 필터링)
- 음식에 대한 정보들 라벨링하는거 필요
- 사용자들이 어떤 선택을 했느냐에 따라 사용자 정보 기반으로 추천 - 불가능 (Collaborated Based 필터링)
- 음식들에 대한 점수
- 데이터 구축 필수
- 한 사람이 하는 것 - 그 사람이 객관적이라고 생각하여 진행 가능
- 어떠한 사람이 보더라도 일관적이 될 수 있게 항목을 정해야 함.
- 어떠한 특징들을 내세울 것인지..
- 항목이 현재 4개 (신맛, 매운맛, 짠맛, 기름진맛)
- 4개에 대해서 객관적이라고 생각하고 진행
- 데이터가 구축되고 난 후 어떤 식으로 진행할 지 정해야겠다.
- 하루(잠깐) 데이터 분석 후 적합한 방식을 찾아가는 방식으로 진행하자.
- Contents Based Filtering이라고 검색해서 알아봐라.
-----------------------------------------------------------------------------------------------------------------------------
추천 시스템 : 사용자의 취향을 파악하고, 그에 맞는 상품을 추천.
-> 내가 몰랐던 취향도 추천해준다.(유튜브 알고리즘.. 넷플릭스 추천)
추천 시스템 종류
1. Contents Based Filtering
2. Collaborative Filtering - 메모리기반 Memory based / 잠재 요인 Latent factor
넷플릭스 같은 경우 Collaborative를 사용(사용자가 많으니) .. 요즘은 Collaborative Filtering을 사용하는 추세
------------------------------------------------------------------------------------------------------------------------
콘텐츠 기반 필터링(Contents Based Filtering)
사용자가 특정 아이템을 선호하는 경우 그 아이템과 비슷한 콘텐츠를 가진 다른 아이템을 추천
예를 들어 A가 Movie A에 높은 평점을 줬는데 그게 액션이고, 영화감독 이름이 '이수진'이면 '이수진'감독의 다른 액션영화를 추천해주는 것.. 요즘은 잘 안 쓴다.
협업 필터링(Collaborative Filtering)
최근접 이웃 기반(Nearest Neighbor based Collaborative filtering) 방법과 잠재요인(Latent factor based Collaborative filtering) 방법이 있다.
* 최근접 이웃 기반 Nearest Neighbor based Collaborative filtering
보통 사람들은 남이 구매한 리뷰, 평점같은 걸 본 다음 내가 제품을 산다. 위의 콘텐츠 기반 같은 경우는 내가 직접 경험해보고 그에 따라 비슷한 애들을 추천해주는 것이라면, 최근접 이웃기반은 남이 한 걸 보고도 추천을 받을 수 있다.
협업 필터링은 사용자가 여태까지 매긴 평점, 상품 구매 이력 등 행동양식(user behavior)를 기반으로 추천해준다.
그 중에서도 최근접 이웃 기반은 사용자-item 행렬에서 사용자가 아직 평가하지 않은 아이템을 예측하는 것이 목표이다.
Nearest Neighbor 기반 협업 필터링에서는 사용자-item 행렬이 있어야 한다. 이 때 col은 item이며, row는 유저가 되어야 한다.
그런데 이러한 방법은 공간낭비가 된다. 데이터가 sparse하기 떄문이다. (빈 부분이 많다) 그리고 실제로 수많은 동영상(유튜브의 경우), 마트식재료 등 너무 빈 칸이 많을 것이다.
따라서 Nearset Neighbor 기반 협업 필터링은 또 두가지로 나뉜다.
- 사용자 기반: 비슷한 고객들이 ~한 item을 소비했다.
- 아이템 기반: ~한 item을 소비한 고객들이 다음과 같은 상품도 구매했다.
- 사용자 기반 협업 필터링(User based Collaborative filtering)
- 아이템 기반 협업 필터링(Item based Collaborative filtering)
일반적으로 User based보다는 Item based가 정확도가 더 높다고 한다.(비슷한 상품을 좋아한다고 취향이 비슷한 건 아니기 때문에)
따라서 Nearest Neighbor 기반 협업 필터링을 쓸 때는 Item based를 많이 쓴다고 한다.
* 잠재요인 협업 필터링
- 행렬 분해를 기반으로 사용한다. 대규모 다차원 행렬을 SVD와 같은 차원 감소 기법으로 분해하는 과정에서 잠재요인을 찾아내서 뽑아내는 방법이다.
- 저장 공간 절약한다는 큰 장점이 있다.
- 사용자-아이템 행렬을 -> '사용자-장르' + '장르-아이템' 이 두개로 분해한다.
저 값을 이용해서 사용자가 평가하지 않은 콘텐츠의 점수를 예측하여, 높으면 추천해준다!
출처
https://lsjsj92.tistory.com/564?category=853217
-----------------------------------------------------------------------------------------------------------------------------------
파이썬으로 contents based filtering (비슷한 상품 추천) 참고할 블로그
https://lsjsj92.tistory.com/565
----------------------------------------------------------------------------------------------------------------------------------
+
맛 데이터가 있으면 거리구하기나 cosine 유사도로 맛에 대한 점수들을 벡터공간에 임베딩해서
사용자의 입맛과 음식리스트간의 거리를 구해서 가까운 음식 Top3를 뽑아준다.
-> 코사인 유사도로 구한다. 두 벡터가 비슷할 수록 1값이 나오고 반대방향일수록 -1?이 나온다!
코사인유사도 처리는 다음 포스팅에서 계속!