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