推薦系統實踐 0x03 評測指標

2022-01-19 07:16:16 字數 3515 閱讀 4212

**準確度度量乙個推薦系統或者推薦演算法**使用者行為的能力。這個指標是最重要的推薦系統離線評測指標。**準確度通過在訓練集上建立使用者的行為和興趣模型**使用者在測試集上的行為,並計算**行為和測試集上實際行為的重合度作為**準確度。**準確度有各種不同的研究方向,也就有不同的**準確度指標。

**該使用者在將來看到乙個他沒有評過分的物品時,會給這個物品評多少分。 評分**的**準確度一般通過均方根誤差(rmse)和平均絕對誤差(mae)計算。測試集中物品\(u\)和使用者\(i\),以及使用者\(i\)對物品\(u\)的評分為\(r_\),**的評分為\(\hat_\)。那麼均方根誤差rmse計算為

\[rmse=\frac(r_-\hat_)^2}}

\]平均絕對誤差(mae)公式為

\[mae=\frac|r_-\hat_|}

\]我們用records來記錄使用者、物品、真實評分和**評分,用比較簡單的**來表示rmse為

def rmse(records): 

return math.sqrt(\sum([(rui-pui)*(rui-pui) for u,i,rui,pui in records]) / float(len(records)))

用**表示mae為

def mae(records):

return sum([abs(rui-pui) for u,i,rui,pui in records])/ float(len(records))

值得一提的是,關於rmse和mae這兩個指標的優缺點, netflix認為rmse加大了對**不准的使用者物品評分的懲罰(平方項的懲罰),因而對系統的評測更加苛刻。研究表明,如果評分系統是基於整數建立的(即使用者給的評分都是整數),那麼對**結果取整會降低mae的誤差。

**在提供推薦服務時,一般是給使用者乙個個性化的推薦列表,這種推薦叫做topn推薦。topn推薦的**準確率一般通過準確率(precision)或者召回率(recall)度量。

令r(u)是根據使用者在訓練集上的行為給使用者作出的推薦列表,而t(u)是使用者在測試集上的行為列表。

召回率和精準率的**為:

def precisionrecall(test, n):

hit = 0

n_recall = 0

n_precision = 0

for user, items in test.items():

rank = recommend(user, n)

hit += len(rank & items)

n_recall += len(items)

n_precision += n

return [hit / (1.0 * n_recall), hit / (1.0 * n_precision)]

覆蓋率(coverage)描述乙個推薦系統對物品長尾的發掘能力。覆蓋率有不同的定義方法,最簡單的定義為推薦系統能夠推薦出來的物品佔總物品集合的比例。覆蓋率是乙個內容提供商會關心的指標。乙個好的推薦系統不僅需要有比較高的使用者滿意度,也要有較高的覆蓋率。需要統計推薦列表中不同物品出現次數的分布。如果所有的物品都出現在推薦列表中,且出現的次數差不多,那麼推薦系統發掘長尾的能力就很好。

在資訊理論和經濟學中有兩個著名的指標可以用來定義覆蓋率。 這裡\(p(i)\)是物品\(i\)的流行度除以所有物品流行度之和。可以簡單認為是物品\(i\)出現的概率或者頻率。

物品的流行度指對物品產生過行為的使用者總數。這裡作者竟然放到了後面一章進行解釋。

第乙個是資訊熵:

\[h=-\sum_^p(i)\log p(i)

\]第二個就是基尼指數:

\[g=\frac\sum_^(2j-n-1)p(i_j)

\]用**來寫就是

def giniindex(p):

j=1n = len(p)

g = 0

for item, weight in sorted(p.items(), key=itemgetter(1)):

g += (2 * j - n - 1) * weight

return g / float(n - 1)

基尼係數用來刻畫系統對物品的流行度是否平均,如果物品的流行度很平均,那麼基尼係數就會越小,如果物品流行度相差很大,那麼基尼係數就會很大。基尼係數也是用來刻畫馬太效應的指標,即所謂強者更強,弱者更弱的效應。熱門的物品會更加熱門,冷門的物品也會就會更加冷門。

如果推薦演算法的計算出來的物品流行度的基尼係數要大於原本使用者行為中物品流行度的基尼係數,那麼也就是說推薦演算法具有馬太效應。

為了滿足使用者廣泛的興趣,推薦列表需要能夠覆蓋使用者不同的興 趣領域,即推薦結果需要具有多樣性。如果我們使用\(s(i,j)\)來代表物品\(i\)和物品\(j\)的相似度。那麼使用者\(u\)的推薦列表多樣性定義為

\[diversity=1-\frac}|r(u)||r(u)-1|}

\]這裡稍微說一下我對這個公式的理解,分數線上方是兩兩物品的相似性的總和,分數線下方是從所有物品中任意取兩個的組合數,再用1減去這個相似性的公式就得到了多樣性的公式。

再對所有使用者的推薦列表多樣性取平均就是推薦系統的多樣性。不同的物品相似度度量函式\(s(i,j)\)可以定義不同的多樣性。

用推薦結果的平均流行度度量新穎性比較粗略,因為不同使用者不知道的東西是不同的。因此,要準確地統計新穎性需要做使用者調查。

驚喜度是什麼,又和新穎度有什麼區別呢。新穎度通常存在使用者已知的某些物品和結果,與歷史興趣相關聯,如果推薦結果和使用者的歷史興趣不相似,但卻讓使用者覺得滿意,那麼就可以說推薦結果的驚喜度很高,而推薦的新穎性僅僅取決於使用者是否聽說過這個推薦結果。是一種定性的度量。提高推薦驚喜度需要提高推薦結果的使用者滿意度,同時降低推薦結果和使用者歷史興趣的相似度。目前驚喜度獲得了學術界的部分討論,但是仍然不夠成熟,這裡也就不展開細說。

如果使用者信任推薦系統,那就會增加使用者和推薦系統的互動。在實際的業務場景當中,同樣的推薦結果,以讓使用者信任的方式推薦給使用者就更能讓使用者產生購買慾, 而以類似廣告形式的方法推薦給使用者就可能很難讓使用者產生購買的意願。想要提高使用者對系統的信任度,首先要提高系統的透明度,也就是提供一些推薦解釋、利用好友的一些行為資訊再解釋等等。

推薦系統需要實時地更新推薦列表來滿足使用者新的行為變化。如在購買新的硬體之後能夠立即推薦相應的配件資訊。

能夠將新加入系統的物品推薦給使用者。體現了推薦系統處理物品的冷啟動能力。

健壯性指標衡量了乙個推薦系統抗擊作弊的能力。演算法健壯性的評測主要利用模擬攻擊。首先,給定乙個資料集和乙個演算法,可以用這個演算法給這個資料集中的使用者生成推薦列表。然後,用常用的攻擊方法向資料集中注入雜訊資料,然後利用演算法在注入雜訊後的資料集上再次給使用者生成推薦列表。最後,通過比較攻擊前後推薦列表的相似度評測演算法的健壯性。如果攻擊後的推薦列表相對於攻擊前沒有發生大的變化,就說明演算法比較健壯。

除了選擇健壯性高的推薦演算法外,還有

離線實驗

調查問卷

使用者滿意度x√

o**準確度√√

x覆蓋率√√

√多樣性o√

o新穎性o√

o驚喜度x√

x

招聘程式設計題0x03

python3 coding utf 8 對於乙個有序陣列,我們通常採用二分查詢的方式來定位某一元素,請編寫二分查詢的演算法,在陣列中查詢指定元素。給定乙個整數陣列a及它的大小n,同時給定要查詢的元素val,請返回它在陣列中的位置 從0開始 若不存在該元素,返回 1。若該元素出現多次,請返回第一次出...

0x03 浮點數運算

浮點數不能作位運算和移位運算。浮點數是不精確的。浮點數在運算過程中得不到精確的結果,所以我們比較兩個浮點數大小是否相等的策略是看他們的差的絕對值是不是比乙個特別小的數還要小。整數和浮點數進行運算,整數自動提公升型別為浮點數。double c 1 5.2 1會提公升為1.0 double c 1.0 ...

《演算法競賽高階指南》0x03差分

給定乙個序列,只能對乙個區間加一或者減一,問至少需要多少步使得所有數都變成一致的?有多少種一致序列?利用差分,對乙個區間進行加一或者減一的話,一定是乙個差分 1加上另乙個差分 1。如下 includeusing namespace std typedef unsigned intui typedef...