python协同过滤算法(仅供参考)

# -*- coding: utf-8 -*-
'''
@author: wp
协同过滤
'''

import pandas as pd
import numpy as np

class Xietonggl():
    def __init__(self,df,use_num ):
        self.df = df
        self.use_num = use_num
    
    def guanliandu(self,):
        df_array = np.array(self.df) #将数据矩阵化
        df_array_t = df_array.T  #矩阵转置
        user_guanxi = np.dot(df_array,df_array_t) #用户之间的关联度矩阵
        prod_guanxi = np.dot(df_array_t,df_array) #产品之间的关联度矩阵
        
        df_user = pd.DataFrame(user_guanxi,index = self.df.index,columns = self.df.index)#用户数据框
        df_prod = pd.DataFrame(prod_guanxi,index =self.df.columns,columns = self.df.columns)#产品数据框
        return df_user,df_prod
    def oneself(self,):
        pro = pd.DataFrame(self.df.loc[self.use_num])
        user_old = list(pro[pro[self.use_num] == 1].index) #用户自身使用的产品
        return pro,user_old
        
    def yonghu(self,):
        #找出关系最近的5个用户
        df_user,df_prod = self.guanliandu()
        pro,user_old = self.oneself()
        df_tmp = pd.DataFrame(df_user[self.use_num].sort_values(ascending = False))
        user_jin = list(df_tmp.iloc[1:6,:].index) 
        jin_5 = self.df.loc[user_jin]
        user_no = list(pro[pro[self.use_num] == -1].index)
        user_tt = jin_5[user_no].sum()
        '''
        还可以排序下再取
        '''
        user_zong = list(user_tt[user_tt.values != -5].index)
        return user_zong
        
    def prod(self,):
        #找出每个产品关系最近的一个产品
        df_user,df_prod = self.guanliandu()
        pro,user_old = self.oneself()
        pro_zong = []
        for i in user_old:
            df_p = pd.DataFrame(df_prod[i].sort_values(ascending = False))
            pro_1 = list(df_p.iloc[1:2,:].index)[0]
            pro_zong.append(pro_1)
        return pro_zong
            
    def tuijian(self,):
        user_zong = self.yonghu()
        pro_zong = self.prod()
        tj = user_zong + pro_zong
        item = set(tj)
        ttjj = {}
        for j in item:
            cn = tj.count(j)
            ttjj.update({j:cn})
            
        df_tj = pd.DataFrame(ttjj,index = ['rank']).T
        tuij = df_tj.sort_values(['rank'],ascending=False)
        return  tuij
        
def main():
    tj = Xietonggl(df2,20180110).tuijian()
    print(tj)
    
if __name__ == '__main__':
    main()

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值