推薦系統(1) 協同過濾基本思想及其實現

2022-08-24 01:45:10 字數 4634 閱讀 6759

前言:由於近期專案上在開發乙個銷售管理系統,裡面涉及到乙個基於使用者的產品給推薦演算法,之前也對推薦系統有比較系統地了解,因此本文及接下來的幾篇文章將詳細推薦系統的思想及其多中實現方法,本篇將主要介紹基於系統過濾的推薦系統及其python實現。

1、協同過濾思想

協同過濾(collabrotive filtering)是商品銷售(尤其是**)常用的推薦方法,分為基於使用者(user-based)和基於商品(item-based)兩種情況,整體思想是在已經有銷售記錄的資料庫中,從使用者購買的歷史商品資料中找到使用者或產品的相似度,然後對使用者做推薦。如果選擇基於使用者的系統過濾,則找到使用者的相似度,對乙個特定的使用者,可以選擇將他最相似的k個使用者所購買的且該使用者未購買的n中商品推薦給他;若是基於商品的推薦,則找到商品之間的相似度,然後對購買了該商品的使用者,推薦其未購買的相似商品中的其他商品,協同過濾的主要思想是聚類(無論是基於使用者還是基於商品)。

2、相似度度量方法

上面提到要計算使用者/商品之間的相似度,那麼怎麼度量兩個使用者/商品之間的相似度呢?在**的文章《漫談:機器學習中距離和相似性度量方法》中,談到了多種度量距離和相似性的方法,在機器學習中,距離和相似性是比較相關的概念,一般來說距離越大,相似性與低,反之相似性越高。在推薦系統的相似度度量中,常常用到以下三種相似度度量:

1)閔可夫斯基距離(minkowski/歐式距離):$$distance(x,y)=\left ( \sum ^\left | x-y_^{} \right | ^\right )}}$$

2)傑卡德相似係數(jaccard):$$j(a,b)=\frac$$

3)余弦相似度:$$\cos \left ( \theta \right )=\fracb}$$

4)pearson相關係數:$$\rho_=\frac\rho }$$

5)相對熵(k-l距離):$$d\left ( p||q \right )=\sum p\left ( x \right )\log \frac=e\log \frac$$

6)hellinger距離:$$d\left ( p||q \right )=\frac}\left ( 1-\int p\left ( x \right )^}q\left ( x \right )^}d \right )$$

3、幾種相似度的python實現

上面列舉了六種相似度度量(並未列舉完所有的相似度度量),各種適合的場景不太一致,但是這些相似度之間又有一定意義上的相關性(如果敢興趣可以推導一下),在這六種相似度中,閔可夫斯基距離、傑卡德相似度、余弦相似度用的頻率較高,下面是這幾種相似度的簡單實現:

import numpy as np

def euclidea_sim(x,y):

assert len(x) == len(y)

dis = np.linalg.norm(x-y)

sim = 1/(1+dis)

return sim

def jaccard_sim(x,y):

assert len(x) == len(y)

x,y = np.array(x).astype(bool),np,array(y).astype(bool)

return sum(x*y)/sum(x+y)

def cosine_sim(x,y):

assert len(x) == len(y)

sum_x_y = np.dot(x,y)

return sum_x_y/np.linalg.norm(x)/np.linalg.norm(y)

# 以上用python簡單地實現了三種相似度,供下面提供推薦使用

上面用python實現了常用的三種相似度度量方法。注意,這裡的余弦相似度的取值範圍為[-1,1],可以通過簡單變化將各種相似度都轉換在[0,1]之間(比如余弦相似度乘以0.5+0.5處理),這裡不做過多處理。下面將從銷售中的記錄資料(如下表),完整地實現乙個簡單的推薦系統(之所以說簡單,是因為沒有過多地考慮業務場景,而且僅僅用最基本的系統過濾方法)。

客戶id

購買日期

產品類別

產品id

購買數量

客戶46

2017/2/15

類別18

產品17

3 客戶118

2017/4/7

類別15

產品71

客戶92017/4/12

類別17

產品115

客戶74

2016/11/27

類別28

產品13

17 客戶248

2017/4/24

類別19

產品15

1 客戶271

2017/4/25

類別6產品20

8 客戶220

2017/4/1

類別20

產品10

5 客戶94

2017/3/23

類別32

產品11

14

import numpy as np

import pandas as pd

#pandas庫清理資料特別方便,因此本次用到該庫

from pandas import dataframe

# 載入資料,資料放在本地磁碟

self_file = "f:\\python_jupyter\\sell_record.csv"

sell_record = pd.read_csv(self_file, sep=',',header=0,encoding='gbk')

# 客戶可能多次購買同一種產品,因此把客戶對產品彙總

sell_pivot = sell_record.pivot_table(values='購買數量',index='客戶id',columns='產品id',aggfunc=sum,fill_value=0)

#先計算相似度矩陣

def sim_mat(sell_group,sim=euclidea_sim):

# 定義乙個全零相似度矩陣

# sim_matrix = np.zeros((sell_group.shape[0],sell_group.shape[0]),dtype=float)

sim_matrix = dataframe(sim_matrix,index=sell_group.index,columns=sell_group.index)

for index in sell_group.index:

for column in sell_group.index:

sim_matrix.ix[index,column] = sim(sell_group.ix[index,:],sell_group.ix[column,:])

return sim_matrix

def recommendation(sim_mat,customer,n_sim_customer,n_product,sell_record):

'''paramer:

sim_mat:相似度矩陣

customer:需要推薦的客戶

n_sim_customer:相似客戶數

n_product:推薦的產品數

sell_record:客戶購買的產品列表,每條資料為乙個行,每列資料為乙個產品統計的客戶產品購買量

'''try:

k_similar = sim_mat.sort_values(customer,axis=0,ascending=false)[:n_sim_customer]

except:

print('該使用者還未購買過我公司產品,可為他推薦熱門產品')

return none

# 找到k個相似使用者購買的所有產品

recom_product = sell_record.ix[k_similar.index,:].astype(bool).sum(axis=0)

recom_product = recom_product[recom_product>0].sort_values(axis=0,ascending=false).index

count_ = 0

recom_list =

# while count_ < n_product:

for i in recom_product:

if sell_record[i][customer] > 0:

continue

else:

count_ += 1

if count_ >= n_product:

return recom_list

return recom_list

# sim_mat[customer].

上面**就是簡單的基於客戶(user-based)推薦系統簡單實現,可以對上面**進行簡單地修改就能直接應用於基於商品(item-based)的推薦。該**未考慮具體業務場景(購買產品度量、相似度選擇、生成推薦商品候選列表對各個商品與該使用者的相似度乘積求和)及執行效率,具體應用時可以對這些方面加以改進。下面是對客戶10做推薦

sim = sim_mat(sell_pivot)
recommendation(sim,"客戶10",20,5,sell_pivot)
['產品11', '產品9', '產品3', '產品4', '產品16']

推薦系統系列5 協同過濾演算法的基本思想

在現今的推薦技術和演算法中,最被大家廣泛認可和採用的就是基於協同過濾的推薦方法。本文將帶你深入了解協同過濾的秘密。下面直接進入正題 1 什麼是協同過濾 協同過濾是利用集體智慧型的乙個典型方法。要理解什麼是協同過濾 collaborative filtering,簡稱 cf 首先想乙個簡單的問題,如果...

推薦系統 協同過濾

這是我學習推薦系統的筆記,主要參考的是51cto的一系列文章和人們郵電出版的 推薦系統實踐 首先說一下什麼是協同過濾。假如某寶要向你推薦一些商品,當然這些商品不是隨隨便便推薦的,推給你了就是引誘你去買,咱能賺到錢。那麼什麼樣的商品你有可能去買呢?系統或演算法怎麼找到這些商品呢?協同過濾就是幹這個的。...

推薦系統 協同過濾演算法

協同過濾,collaborative filtering,簡稱cf,廣泛應用於如今的推薦系統中。通過協同過濾演算法,可以算出兩個相似度 user user相似度矩陣 item item相似度矩陣。為什麼叫做協同過濾?是因為這兩個相似度矩陣是通過對方來計算出來的。舉個栗子 100個使用者同時購買了兩種...