- 簽證留學 |
- 筆譯 |
- 口譯
- 求職 |
- 日/韓語 |
- 德語
另一個常用的距離計算方法就是余弦相似度(cosine similarity),其計算的是兩個向量夾角的余弦值。如果夾角為90度,則相似度為0;如果兩個向量的方向相同,則相似度為1.0。同皮爾遜相關系數(shù)一樣,余弦相似度的取值范圍也在-1到+1之間,因此我們也將它歸一化到0到1之間。計算余弦相似度值,我們采用的兩個向量A和B夾角的余弦相似度的定義如下:
其中,||A||、||B||表示向量A、B的2范數(shù),你可以定義向量的任一范數(shù),但是如果不指定范數(shù)階數(shù),則都假設為2范數(shù)。向量[4,2,2]的2范數(shù)為:
同樣,NumPy的線性代數(shù)工具箱中提供了范數(shù)的計算方法linalg.norm()。
接下來我們將上述各種相似度的計算方法寫成Python中的函數(shù)。打開svdRec.py文件并加人下列代碼。
程序清單1 相似度計算
程序中的3個函數(shù)就是上面提到的幾種相似度的計算方法。為了便于理解,NumPy的線性代數(shù)工具箱linalg被作為1a導人,函數(shù)中假定inA和inB都是列向量。perasSim()函數(shù)會檢查是否存在3個或更多的點。如果不存在,該函數(shù)返回1.0,這是因為此時兩個向量完全相關。
下面我們對上述函數(shù)進行嘗試。在保存好文件svdRec.py之后,在Python提示符下輸入如下命令:
>>> reload(svdRec)
<module 'gvdRec' from 'svdRec.pyc'>
>>> myMat=mat (svdRec.loadExData())
>>> svdRec.ecludSim(myMat[:,0],myMat[:,4])
0.12973190755680383
>>> svdRec.ecludSim(myMat [:,0],myMat[:,0])
1.0
歐氏距離看上去還行,那么接下來試試余弦相似度:
>>> svdRec.cosSim (myMat [:,0],myMat [:,4]]
0.5
>>> svdRec.cosSim(myMat [:,0],myMat [:,0])
1.0000000000000002
余弦相似度似乎也行,就再試試皮爾遜相關系數(shù):
>>> svdRec.pearsSim(myMat [:,0],myMat [:,4])
0.20596538173840329>>> svdRec.pearsSim(myMat[:,0],myMat[:,0])
1.0
上面的相似度計算都是假設數(shù)據(jù)采用了列向量方式進行表示。如果利用上述函數(shù)來計算兩個行向量的相似度就會遇到問題(我們很容易對上述函數(shù)進行修改以計算行向量之間的相似度)。這里采用列向量的表示方法,暗示著我們將利用基于物品的相似度計算方法。后面我們會闡述其中的原因。
2. 基于物品的相似度還是基于用戶的相似度?
我們計算了兩個餐館菜肴之間的距離,這稱為基于物品(item-based)的相似度。另一種計算用戶距離的方法則稱為基于用戶(user-based)的相似度。回到圖2,行與行之間比較的是基于用戶的相似度,列與列之間比較的則是基于物品的相似度。到底使用哪一種相似度呢?這取決于用戶或物品的數(shù)目。基于物品相似度計算的時間會隨物品數(shù)量的增加而增加,基于用戶的相似度計算的時間則會隨用戶數(shù)量的增加而增加。如果我們有一個商店,那么最多會有幾千件商品。假如,最大的商店大概有100 000件商品。而在Netflix大賽中,則會有480000個用戶和17700部電影。如果用戶的數(shù)目很多,那么我們可能傾向于使用基于物品相似度的計算方法。
對于大部分產品導向的推薦引擎而言,用戶的數(shù)量往往大于物品的數(shù)量,即購買商品的用戶數(shù)會多于出售的商品種類。
3. 推薦引擎的評價
如何對推薦引擎進行評價呢?此時,我們既沒有預測的目標值,也沒有用戶來調查他們對預測的滿意程度。這里我們就可以采用前面多次使用的交叉測試的方法。具體的做法就是,我們將某些已知的評分值去掉,然后對它們進行預測,最后計算預測值和真實值之間的差異。
通常用于推薦引擎評價的指標是稱為最小均方根誤差(Root Mean Squared Error,RMSE)的指標,它首先計算均方誤差的平均值然后取其平方根。如果評級在1星到5星這個范圍內,而我們得到的RMSE為1.0,那么就意味著我們的預測值和用戶給出的真實評價相差了一個星級。
責任編輯:admin