推荐算法 - 皮尔逊函数

推荐算法 - 皮尔逊函数


公式:



# 数据 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


python
<< EOF
import  bsddb
from  math  import   *
db 
=  bsddb.hashopen( ' user-items.db ' , ' c ' )

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( ' ; ' ) :
        v
= v.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()

EOF





#  测试使用
python << EOF
import  bsddb
db 
=  bsddb.hashopen( ' user-items.db ' , ' c ' )
print  db[ ' 1 ' ]
EOF

25      30604      1.0

print  um1[ ' 468 ' ],um1[ ' 471 ' ]
2.0   1.0
(Pdb) 
print  um2[ ' 468 ' ],um2[ ' 471 ' ]
2.0   1.0






如果对大家对 推荐有一些了解,数据能到 用户与用户关系(分值化) ,是能干很多事情了。
比如:
  1. 首先得到某用户相近度最高的几位活跃用户,看这几位用户在看什么,听什么 然后推荐出去

扩展:
  把初始值 反过来  item  user  score ,然后统计出 item 和 item 之间的关系 。
  当 消费某一产品 ,马上推荐出 其他的相近的产品 (時时推荐)

 



整理 www.blogjava.net/Good-Game

你可能感兴趣的:(推荐算法 - 皮尔逊函数)