협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.
이번에 만드는 것
아마존에 자주 나오는 「이 상품을 샀던 사람은 이런 상품도 사고 있습니다」기능을 만들어 보자.
요소 기술 및 구현 방법
일반적으로 추천 기능(추천 기능)이라고 하는 기능. 추천의 실장 방법은 크게 2개 「협조 필터링」과 「콘텐츠 베이스 필터링」.
콘텐츠 베이스 필터링은, 예를 들면 상기 예의 「노인과 바다(헤밍웨이)」의 추천 상품을 콘텐츠 베이스로 실장하는 경우는, 사전에 상품에 속성의 태그를 친다. 예를 들어 작자라는 속성으로 태그를 치면 같은 헤밍웨이가 기록한 책을 추천으로 표시한다.
협력 필터링은 이 상품을 구입한 다른 사람이 구입한 상품을 추천으로 표시한다.
이번에는 '협조 필터링'을 구현한다.
redis와 파이썬을 사용합니다.
redis는 KVS
redis의 SortedSet을 이용한다.
redis 설치 절차
MacPorts : htp : // bg. 가다랭이. tv/2010/03/s rt_레아 s. HTML
HomeBrew : ぃ tp // m / ms / 3d2 A 2fc683 Ae 19302071
redis를 사용하는 이유
추천 상품을 매번 계산하는 것은 계산량의 관점에서 현실적이지 않고, 사전에 계산해 꺼내기 쉬운 형태로 기록해 두는 것이 필요했기 때문입니다. (꺼내기 쉽게 기록 할 수 있으면 Redis 이외를 이용해도 문제 없다)
SortedSet이란?
데이터를 넣으면 자동으로 (redis 측) 재정렬 목록
협력 필터링 구현
상품 X에 대한 각 상품의 유사도를 값으로서 취득할 수 있으면 실장할 수 있다
유사도 계산식
여러가지 있지만, Jaccard 지수(자카르 시스우)를 사용하는 것이 일반적.
아래의 샘플 데이터라면 상품 A의 계산식은 1÷5가 된다.
1은 상품 X와 상품 A를 모두 구입한 고객이 1명이라는 것. 즉 제품 집합
5는 상품 X와 상품 A 중 하나를 구입 한 고객의 총 수. 즉 일본집
이번 이용하는 샘플 데이터
구현
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
def jaccard(e1, e2):
"""
ジャッカード指数を計算する
:param e1: list of int
:param e2: list of int
:rtype: float
"""
set_e1 = set(e1)
set_e2 = set(e2)
return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))
def get_key(k):
return 'JACCARD:PRODUCT:{}'.format(k)
# 商品Xを購入した顧客IDが1,3,5ということ
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]
# 商品データ
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}
# redis
import redis
r = redis.Redis(host='localhost', port=6379, db=10)
# ジャッカード指数を計算して商品毎にredisのSortedSetに記録する
for key in products:
base_customers = products[key]
for key2 in products:
if key == key2:
continue
target_customers = products[key2]
# ジャッカード指数を計算
j = jaccard(base_customers, target_customers)
# redisのSortedSetに記録する
r.zadd(get_key(key), key2, j)
# 例1 商品Xを買った人はこんな商品も買っています。
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']
# 例2 商品Eを買った人はこんな商品も買っています。
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']
redis에 들어간 값을 보자.
검산해 보자
상품 X를 구입한 사람에게는 상품 B, D, A를 추천하고 있습니다.
검산하면 각각 0.5, 0.33, 0.2의 유사도이므로 적절하게 추천되고있는 것 같네요.
이 방법의 문제점
고객수와 상품수가 늘어나면 계산량이 폭발하여 죽는다
해결 방법
전치 인덱스 만들기 Amazon
h tp // w w. cs. 우 md. 에즈 / ~ 사미 r / 498 / 아마 젠 - 코멘 다치 온 s. pdf
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
일반적으로 추천 기능(추천 기능)이라고 하는 기능. 추천의 실장 방법은 크게 2개 「협조 필터링」과 「콘텐츠 베이스 필터링」.
콘텐츠 베이스 필터링은, 예를 들면 상기 예의 「노인과 바다(헤밍웨이)」의 추천 상품을 콘텐츠 베이스로 실장하는 경우는, 사전에 상품에 속성의 태그를 친다. 예를 들어 작자라는 속성으로 태그를 치면 같은 헤밍웨이가 기록한 책을 추천으로 표시한다.
협력 필터링은 이 상품을 구입한 다른 사람이 구입한 상품을 추천으로 표시한다.
이번에는 '협조 필터링'을 구현한다.
redis와 파이썬을 사용합니다.
redis는 KVS
redis의 SortedSet을 이용한다.
redis 설치 절차
MacPorts : htp : // bg. 가다랭이. tv/2010/03/s rt_레아 s. HTML
HomeBrew : ぃ tp // m / ms / 3d2 A 2fc683 Ae 19302071
redis를 사용하는 이유
추천 상품을 매번 계산하는 것은 계산량의 관점에서 현실적이지 않고, 사전에 계산해 꺼내기 쉬운 형태로 기록해 두는 것이 필요했기 때문입니다. (꺼내기 쉽게 기록 할 수 있으면 Redis 이외를 이용해도 문제 없다)
SortedSet이란?
데이터를 넣으면 자동으로 (redis 측) 재정렬 목록
협력 필터링 구현
상품 X에 대한 각 상품의 유사도를 값으로서 취득할 수 있으면 실장할 수 있다
유사도 계산식
여러가지 있지만, Jaccard 지수(자카르 시스우)를 사용하는 것이 일반적.
아래의 샘플 데이터라면 상품 A의 계산식은 1÷5가 된다.
1은 상품 X와 상품 A를 모두 구입한 고객이 1명이라는 것. 즉 제품 집합
5는 상품 X와 상품 A 중 하나를 구입 한 고객의 총 수. 즉 일본집
이번 이용하는 샘플 데이터
구현
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
def jaccard(e1, e2):
"""
ジャッカード指数を計算する
:param e1: list of int
:param e2: list of int
:rtype: float
"""
set_e1 = set(e1)
set_e2 = set(e2)
return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))
def get_key(k):
return 'JACCARD:PRODUCT:{}'.format(k)
# 商品Xを購入した顧客IDが1,3,5ということ
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]
# 商品データ
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}
# redis
import redis
r = redis.Redis(host='localhost', port=6379, db=10)
# ジャッカード指数を計算して商品毎にredisのSortedSetに記録する
for key in products:
base_customers = products[key]
for key2 in products:
if key == key2:
continue
target_customers = products[key2]
# ジャッカード指数を計算
j = jaccard(base_customers, target_customers)
# redisのSortedSetに記録する
r.zadd(get_key(key), key2, j)
# 例1 商品Xを買った人はこんな商品も買っています。
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']
# 例2 商品Eを買った人はこんな商品も買っています。
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']
redis에 들어간 값을 보자.
검산해 보자
상품 X를 구입한 사람에게는 상품 B, D, A를 추천하고 있습니다.
검산하면 각각 0.5, 0.33, 0.2의 유사도이므로 적절하게 추천되고있는 것 같네요.
이 방법의 문제점
고객수와 상품수가 늘어나면 계산량이 폭발하여 죽는다
해결 방법
전치 인덱스 만들기 Amazon
h tp // w w. cs. 우 md. 에즈 / ~ 사미 r / 498 / 아마 젠 - 코멘 다치 온 s. pdf
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
상품 X에 대한 각 상품의 유사도를 값으로서 취득할 수 있으면 실장할 수 있다
유사도 계산식
여러가지 있지만, Jaccard 지수(자카르 시스우)를 사용하는 것이 일반적.
아래의 샘플 데이터라면 상품 A의 계산식은 1÷5가 된다.
1은 상품 X와 상품 A를 모두 구입한 고객이 1명이라는 것. 즉 제품 집합
5는 상품 X와 상품 A 중 하나를 구입 한 고객의 총 수. 즉 일본집
이번 이용하는 샘플 데이터
구현
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
def jaccard(e1, e2):
"""
ジャッカード指数を計算する
:param e1: list of int
:param e2: list of int
:rtype: float
"""
set_e1 = set(e1)
set_e2 = set(e2)
return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))
def get_key(k):
return 'JACCARD:PRODUCT:{}'.format(k)
# 商品Xを購入した顧客IDが1,3,5ということ
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]
# 商品データ
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}
# redis
import redis
r = redis.Redis(host='localhost', port=6379, db=10)
# ジャッカード指数を計算して商品毎にredisのSortedSetに記録する
for key in products:
base_customers = products[key]
for key2 in products:
if key == key2:
continue
target_customers = products[key2]
# ジャッカード指数を計算
j = jaccard(base_customers, target_customers)
# redisのSortedSetに記録する
r.zadd(get_key(key), key2, j)
# 例1 商品Xを買った人はこんな商品も買っています。
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']
# 例2 商品Eを買った人はこんな商品も買っています。
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']
redis에 들어간 값을 보자.
검산해 보자
상품 X를 구입한 사람에게는 상품 B, D, A를 추천하고 있습니다.
검산하면 각각 0.5, 0.33, 0.2의 유사도이므로 적절하게 추천되고있는 것 같네요.
이 방법의 문제점
고객수와 상품수가 늘어나면 계산량이 폭발하여 죽는다
해결 방법
전치 인덱스 만들기 Amazon
h tp // w w. cs. 우 md. 에즈 / ~ 사미 r / 498 / 아마 젠 - 코멘 다치 온 s. pdf
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
구현
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
def jaccard(e1, e2):
"""
ジャッカード指数を計算する
:param e1: list of int
:param e2: list of int
:rtype: float
"""
set_e1 = set(e1)
set_e2 = set(e2)
return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))
def get_key(k):
return 'JACCARD:PRODUCT:{}'.format(k)
# 商品Xを購入した顧客IDが1,3,5ということ
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]
# 商品データ
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}
# redis
import redis
r = redis.Redis(host='localhost', port=6379, db=10)
# ジャッカード指数を計算して商品毎にredisのSortedSetに記録する
for key in products:
base_customers = products[key]
for key2 in products:
if key == key2:
continue
target_customers = products[key2]
# ジャッカード指数を計算
j = jaccard(base_customers, target_customers)
# redisのSortedSetに記録する
r.zadd(get_key(key), key2, j)
# 例1 商品Xを買った人はこんな商品も買っています。
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']
# 例2 商品Eを買った人はこんな商品も買っています。
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']
redis에 들어간 값을 보자.
검산해 보자
상품 X를 구입한 사람에게는 상품 B, D, A를 추천하고 있습니다.
검산하면 각각 0.5, 0.33, 0.2의 유사도이므로 적절하게 추천되고있는 것 같네요.
이 방법의 문제점
고객수와 상품수가 늘어나면 계산량이 폭발하여 죽는다
해결 방법
전치 인덱스 만들기 Amazon
h tp // w w. cs. 우 md. 에즈 / ~ 사미 r / 498 / 아마 젠 - 코멘 다치 온 s. pdf
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import unicode_literals
def jaccard(e1, e2):
"""
ジャッカード指数を計算する
:param e1: list of int
:param e2: list of int
:rtype: float
"""
set_e1 = set(e1)
set_e2 = set(e2)
return float(len(set_e1 & set_e2)) / float(len(set_e1 | set_e2))
def get_key(k):
return 'JACCARD:PRODUCT:{}'.format(k)
# 商品Xを購入した顧客IDが1,3,5ということ
product_x = [1, 3, 5]
product_a = [2, 4, 5]
product_b = [1, 2, 3]
product_c = [2, 3, 4, 7]
product_d = [3]
product_e = [4, 6, 7]
# 商品データ
products = {
'X': product_x,
'A': product_a,
'B': product_b,
'C': product_c,
'D': product_d,
'E': product_e,
}
# redis
import redis
r = redis.Redis(host='localhost', port=6379, db=10)
# ジャッカード指数を計算して商品毎にredisのSortedSetに記録する
for key in products:
base_customers = products[key]
for key2 in products:
if key == key2:
continue
target_customers = products[key2]
# ジャッカード指数を計算
j = jaccard(base_customers, target_customers)
# redisのSortedSetに記録する
r.zadd(get_key(key), key2, j)
# 例1 商品Xを買った人はこんな商品も買っています。
print r.zrevrange(get_key('X'), 0, 2)
# > ['B', 'D', 'A']
# 例2 商品Eを買った人はこんな商品も買っています。
print r.zrevrange(get_key('E'), 0, 2)
# > ['C', 'A', 'X']
검산해 보자
상품 X를 구입한 사람에게는 상품 B, D, A를 추천하고 있습니다.
검산하면 각각 0.5, 0.33, 0.2의 유사도이므로 적절하게 추천되고있는 것 같네요.
이 방법의 문제점
고객수와 상품수가 늘어나면 계산량이 폭발하여 죽는다
해결 방법
전치 인덱스 만들기 Amazon
h tp // w w. cs. 우 md. 에즈 / ~ 사미 r / 498 / 아마 젠 - 코멘 다치 온 s. pdf
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
고객수와 상품수가 늘어나면 계산량이 폭발하여 죽는다
해결 방법
전치 인덱스 만들기 Amazon
h tp // w w. cs. 우 md. 에즈 / ~ 사미 r / 498 / 아마 젠 - 코멘 다치 온 s. pdf
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다
https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념
(Collection and Share based on the CC Protocol.)
Reference
이 문제에 관하여(협력 필터링 (추천)을 redis와 파이썬으로 구현했습니다.), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/haminiku/items/cdbf8eb488e0cf6a62fe텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)