天天看點

推薦算法 - 皮爾遜函數

公式:

推薦算法 - 皮爾遜函數

#資料 elt 清洗後(txt)

# 一般 user 和 item 分值化 

# 比如 使用者下載下傳,收藏,試聽 某item 等等

user    items    score

推薦算法 - 皮爾遜函數

.

# 結果輸出 (bdb)

# user    item1:score1,item2:score2,item3:score3

推薦算法 - 皮爾遜函數
推薦算法 - 皮爾遜函數

python<<EOF

import bsddb

db = bsddb.hashopen('user-items.db','c')

for row in open('user-item-sc.txt'):

    row=row.split('\n')[0]

    dr = row.split(':')

    if not db.has_key(dr[0]) : db[dr[0]]=dr[1]+':'+dr[2]

    else : db[dr[0]]=db[dr[0]]+';'+dr[1]+':'+dr[2]

db.close()

EOF

# 結果輸出 (txt)

# user    user     score

推薦算法 - 皮爾遜函數

from math import *

def ps(u1,u2):

    um1={}

    for v in db[u1].split(';') :

        v=v.split(':')

        um1[v[0]]=float(v[1])

    um2={}

    si=[]

    for v in db[u2].split(';') :

        um2[v[0]]=float(v[1])

        if um1.has_key( v[0] ) : si.append(v[0])

    n = len(si)

    if n ==0.0 :return None

    sum1=sum( [um1[it] for it in si] )

    sum2=sum( [um2[it] for it in si] )

    sum1Sq=sum([ pow(um1[it],2) for it in si])

    sum2Sq=sum([ pow(um2[it],2) for it in si])

    pSum = sum( [ um1[it]*um2[it] for it in si ] )

    num = pSum - (sum1*sum2/n)

    den = sqrt( (sum1Sq-pow(sum1,2)/n )*( sum2Sq-pow(sum2,2)/n ) )

    if den==0.0 : return None

    return num/den

fc = open('user-user-sc.txt','w')

for i in xrange(1,43381):

    for j in xrange(i+1,43381):

        sc = ps(str(i),str(j))  

        if not sc == None: print >>fc, "%s\t%s\t%s" %(i,j,sc)      

fc.close()

# 測試使用

print db['1']

25    30604    1.0

print um1['468'],um1['471']

2.0 1.0

(Pdb) print um2['468'],um2['471']

如果對大家對 推薦有一些了解,資料能到 使用者與使用者關系(分值化) ,是能幹很多事情了。

比如:

  1. 首先得到某使用者相近度最高的幾位活躍使用者,看這幾位使用者在看什麼,聽什麼 然後推薦出去 

擴充:

  把初始值 反過來  item  user  score ,然後統計出 item 和 item 之間的關系 。

  當 消費某一産品 ,馬上推薦出 其他的相近的産品 (時時推薦)

繼續閱讀