推荐算法 - 皮尔逊函数

简介:
公式:



# 数据 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 之间的关系 。

  当 消费某一产品 ,马上推荐出 其他的相近的产品 (時时推荐)

本文转自博客园刘凯毅的博客,原文链接:推荐算法 - 皮尔逊函数,如需转载请自行联系原博主。

目录
相关文章
|
网络安全 Docker 容器
内网穿透访问你家里的树莓派
你有一个自己的外网服务器,然后捏你又买了一个树莓派放家里吃灰,有一天,你觉得不能让你的树莓派吃灰,你想上班的时候用你的树莓派在家里编译arm用的镜像程序。于是,便有了本篇文章~~~如何通过内网穿透访问你家里的树莓派。(注:仅用于测试,闹着玩,千万别上生产,上生产需要自己进行改造用户权限以及审计功能,这部分就不贴出来了) 使用的工具:docker,rtty,rttys
522 0
内网穿透访问你家里的树莓派
|
弹性计算 数据安全/隐私保护
阿里云域名注册+服务器购买+备案教程
备案前准备: 注册账号——备案前您需要拥有一个阿里云账号(支付宝账户可直接登录) 域名准备——备案前需完成域名注册及实名认证 服务器准备——购买阿里云大陆境内服务器,或获取服务器的备案服务号 备案负责人手机下载“阿里云”APP
阿里云域名注册+服务器购买+备案教程
|
缓存 运维 前端开发
|
人工智能 监控 算法
消控宝点亮智慧消防
2021年9月3日,北京弹力科技有限公司宣布成为阿里云IoT智慧消防领域的行业合伙人,一起打造城市消防领域的数字化解决方案。
688 17
消控宝点亮智慧消防
|
IDE API 开发工具
Visual Studio编辑器还原项目NuGet提示某 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”
Visual Studio编辑器还原项目NuGet提示某 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”
559 0
Visual Studio编辑器还原项目NuGet提示某 NuGet 程序包还原失败:找不到“xxx”版本的程序包“xxx”
|
传感器 Ubuntu API
ESP32-C3入门教程 基础篇(五、RMT应用 — 控制SK6812全彩RGB 灯)
测试第五课,本来是准备测试一下PWM驱动 SK6812 RGB灯, 但是研究了一段时间,发现在ESP32-C3 有更好而且现成的方式 实现 SK6812 的控制, 使用PWM也不是不可以,只是对于初学者,需要多花好多时间, 所以本文还是先以ESP32-C3内置的 RMT 进行 SK6812 的控制,毕竟有现成的示例
1862 0
ESP32-C3入门教程 基础篇(五、RMT应用 — 控制SK6812全彩RGB 灯)
号段生成器和号码生成器
海豚号码生成器,是一个在电脑上常用的办公软件。但是有些对电脑不太会操作的朋友们还是不太明白它的操作方法。它具有多种手机号码生成功能、号码导入手机通讯录和对号码进行综合整理的功能。具体说有这七种功能:手机号码随机生成功能、手机豹子号靓号生成功能、自定义手机号段生成功能、手机号码批量导入手机通讯录功能、杂乱文本中提取手机号码功能、手机号码打印前排版功能、手机号码综合整理功能。 下面我详细讲解七大功能之一的手机豹子号靓号生成的操作方法,以便帮到更多不太会操作电脑软件的朋友们。 手机豹子号靓号生成的操作步骤: 第一步:选择省份城市,可以单选某个城市,也可以打勾选择其中几个你想要的城市,也可以点“全选”
号段生成器和号码生成器
|
存储 数据可视化 小程序
Python 制作一副扑克牌,有趣的案例!
之前在 《流畅的 Python 》中看到一个例子比较有趣,所以整理一下通过本文分享给大家, 该案例是通过 Python 类属性创建一幅除去 大王、小王之后的 52 张扑克牌,并实现随机抽牌、排序、洗牌等功能;
Python 制作一副扑克牌,有趣的案例!
|
机器学习/深度学习 算法 Java
GAN对抗网络入门教程
A Beginner's Guide to Generative Adversarial Networks (GANs) https://skymind.ai/wiki/generative-adversarial-network-gan
617 0
GAN对抗网络入门教程