推薦系統:根據使用者的歷史行為,挖掘出使用者的喜好,為使用者推薦與其喜好相符的商品或資訊。推薦系統的任務是將資訊和使用者連線,幫助使用者找到感興趣的資訊,讓有價值的資訊能觸達潛在的使用者。
推薦問題描述:核心問題是為使用者推薦與其興趣相似度比較高的商品。用一函式f(x)計算候選商品與使用者之間的相似度。為**出函式f(x),可用到的歷史資料有:使用者的歷史行為資料,與該使用者有關的其他使用者資訊,商品之間的相似性,文字的描述等。
f : c x s -> r
注:集合c表示所有使用者,集合s表示所有商品,函式f表示商品到使用者之間的有效性的效用函式,r是乙個針對所有使用者的排序的集合,對於每乙個使用者c∈c,希望從s中選擇出s∈s,使得f的值最大。
推薦的常用演算法:協同過濾的推薦,基於內容的推薦,基於關聯規則的推薦,基於效用的推薦,基於知識的推薦,組合推薦。
2.1、協同過濾演算法概述
協同過濾演算法(collaborative filtering, cf)是最基本的推薦演算法,
可分為:
(1)、基於使用者的協同過濾演算法(user-based):通過相似使用者進行推薦,比較計算使用者的相似性,越相似兩者品味相近。
(2)、基於項的協同過濾演算法(item-based):通過相似項推薦,比較計算項與項之間的相似性,為使用者推薦與其打過分的項相似的項。
2.2、相似度的度量方法
1、歐式距離:歐幾里得空間中兩點間「普通」(即直線)距離。
2、皮爾森相關係數:若特徵之間數量級相差過大,對歐式距離的影響比較大,就不能很好的判斷。皮爾森相關係數對量級不敏感,它是兩個向量之間的協方差和標準差之商。其取值在-1與+1之間,若r>0,表明兩個變數是正相關;若r<0,表明兩個變數是負相關。r 的絕對值越大表明相關性越強。具體形式是:
3、余弦相似度:是文字相似度度量使用較多的乙個方法,計算兩個向量的夾角余弦值來評估他們的相似度。對於兩個向量x和y,其對應形式如下:
注意:通過計算相似度可得到相似度矩陣,相似度矩陣是乙個對稱矩陣。
2.3、基於協同過濾的推薦演算法
1、基於使用者的協同過濾演算法
解釋:為使用者推薦和他興趣相似的其他使用者喜歡的物品。利用使用者間的相似度,為使用者u沒有打分的項i打分。
使用者商品矩陣:不同使用者,不同商品,元素為使用者對商品的打分,可能有的使用者沒有對某些商品打分,沒打分的為0。
使用者相似度矩陣:通過使用者商品矩陣和相似性度量計算使用者之間的相似度,是乙個對稱矩陣,對角線全是0。
商品打分:利用使用者間的相似度,為使用者u沒有打分的項i打分:其中n(i)表示對商品打過分的使用者的集合,其中的使用者用v代表,wu,v是使用者u和使用者v之間的相似度,rv,i表示的是使用者v對商品i的打分。打分結果按降序排序並返回。
2、基於項的協同過濾演算法
與前者不同的是:它計算的是商品相似度矩陣。i(u)表示的是使用者u打過分的商品的集合,wi.j表示商品i和j之間的相似度,rj,u表示的是使用者u對商品j的打分。將打分降序排序。
3.1、準備,preparing.py
匯入使用者商品資料,形成使用者-商品矩陣,定義相似性度量和相似度矩陣,首先初始化相似度矩陣,然後計算相似度進行填充。
import numpy as np
def load_data(file_path):#匯入資料
f = open(file_path)
data =
for line in f.readlines():
lines = line.strip().split("\t")
tmp =
for x in lines:
if x != "-":
else:
f.close()
return np.mat(data)
def cos_sim(x, y):#余弦相似度
numerator = x * y.t
denominator = np.sqrt(x * x.t) * np.sqrt(y * y.t)
return (numerator / denominator)[0, 0]
def similarity(data):#相似度矩陣
m = np.shape(data)[0]
w = np.mat(np.zeros((m, m)))
for i in range(m):
for j in range(i, m):
if j != i:
w[i, j] = cos_sim(data[i,], data[j,])
w[j, i] = w[i, j]
else:
w[i, j] = 0
return w
3.2、基於使用者的協同過濾演算法推薦在這裡給出基於使用者的協同過濾演算法的**,基於商品的協同過濾演算法的**類似,但需要注意的一點是,將使用者商品矩陣轉置成商品使用者矩陣 data = data.t,方便計算。
import numpy as np
from preparing import load_data, similarity
def user_based_recommend(data, w, user): # 基於使用者相似性為使用者user推薦商品
m, n = np.shape(data)
interaction = data[user,]
not_inter =
for i in range(n):
if interaction[0, i] == 0:
predict = {}
for x in not_inter:
item = np.copy(data[:, x])
for i in range(m):
if item[i, 0] != 0:
if x not in predict:
predict[x] = w[user, i] * item[i, 0]
else:
predict[x] = predict[x] + w[user, i] * item[i, 0]
return sorted(predict.items(), key=lambda d: d[1], reverse=true)
def top_k(predict, k): # 為使用者推薦前k個商品
top_recom =
len_result = len(predict)
if k >= len_result:
top_recom = predict
else:
for i in range(k):
return top_recom
if __name__ == "__main__":
# 1、匯入使用者商品資料
print("------------ 1. load data ------------")
data = load_data("data.txt")
# 2、計算使用者之間的相似性
print("------------ 2. calculate similarity between users -------------")
w = similarity(data)
# 3、利用使用者之間的相似性進行推薦
print("------------ 3. predict ------------")
predict = user_based_recommend(data, w, 0)
# 4、進行top-k推薦
print("------------ 4. top_k recommendation ------------")
top_recom = top_k(predict, 2)
print(top_recom)
協同過濾推薦演算法 推薦演算法 基於協同過濾CF
前邊我們已經介紹了推薦演算法裡的基於內容的推薦演算法cb,今天我們來介紹一下基於協同的推薦演算法collaboration filtering cf 協同過濾是乙個利用群體智慧型的乙個演算法,舉乙個簡單的例子,如果放假了你想去北京玩幾天,但是不知道北京都有哪些好玩的,你會怎麼做?你可能會上網查一下的...
基於協同過濾演算法的推薦
基於協同過濾演算法的推薦 本實驗選用資料為真實電商脫敏資料,僅用於學習,請勿商用 資料探勘的乙個經典案例就是尿布與啤酒的例子。尿布與啤酒看似毫不相關的兩種產品,但是當超市將兩種產品放到相鄰貨架銷售的時候,會大大提高兩者銷量。很多時候看似不相關的兩種產品,卻會存在這某種神秘的隱含關係,獲取這種關係將會...
協同過濾推薦演算法 協同過濾推薦演算法總結
推薦演算法具有非常多的應用場景和商業價值,因此對推薦演算法值得好好研究。推薦演算法種類很多,但是目前應用最廣泛的應該是協同過濾類別的推薦演算法,本文就對協同過濾類別的推薦演算法做乙個概括總結,後續也會對一些典型的協同過濾推薦演算法做原理總結。推薦演算法概述 1 基於內容的推薦 這一類一般依賴於自然語...