公式:
# 数据 elt 清洗后(txt)
# 一般 user 和 item 分值化
# 比如 用户下载,收藏,试听 某item 等等
user items score
.
# 结果输出 (bdb)
# user item1:score1,item2:score2,item3:score3![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
.
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
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
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 之间的关系 。
![](https://i-blog.csdnimg.cn/blog_migrate/b7fea650a5123623a4e629ab4cb473a4.jpeg)
# 数据 elt 清洗后(txt)
# 一般 user 和 item 分值化
# 比如 用户下载,收藏,试听 某item 等等
user items score
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
# 结果输出 (bdb)
# user item1:score1,item2:score2,item3:score3
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
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
![](https://i-blog.csdnimg.cn/blog_migrate/9b8a8a44dd1c74ae49c20a7cd451974e.gif)
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 之间的关系 。
当 消费某一产品 ,马上推荐出 其他的相近的产品 (時时推荐)
本文转自博客园刘凯毅的博客,原文链接:推荐算法 - 皮尔逊函数,如需转载请自行联系原博主。