首页 > 技术文章 > 【推荐算法】基于用户协同过滤算法

wanghong1994 2020-12-04 10:13 原文

"""
    ORM外部调用的配置:
"""
import numpy as np
import math
import os

def orm_standby():
    os.environ.setdefault("DJANGO_SETTINGS_MODULE", "TravelRecommend.settings")  # manage.py文件中有同样的环境配置
    import django
    django.setup()

def make(data,n):
    # 二值化处理 n为长度
    rea_data = np.zeros(n,dtype=np.int)
    # 将所选号码填充为1
    rea_data[data] =  1
    return rea_data

# 这里传进去的已经是二值化数据
def calculation(mine,other):
    # 分子
    fenzi = 0
    for x in range(len(mine)):
        fenzi = fenzi +  mine[x] * other[x]

    # 分母 第一部分
    fenmu1 = 0
    for x in range(len(mine)):
        fenmu1 = fenmu1 +  mine[x] * mine[x]
    # 给分母 第一部分 开平方
    fenmu1 = math.sqrt(fenmu1)
    # print("分母1开根号", fenmu1)

    # 分母 第二部分
    fenmu2 = 0
    for x in range(len(other)):
        fenmu2 = fenmu2 + other[x] * other[x]
    # 给分母 第二部分 开平方
    fenmu2 = math.sqrt(fenmu2)
    # print("分母2开根号", fenmu2)


    # 计算权重
    cos_th = fenzi / (fenmu1*fenmu2)
    # print("********************************推荐符合度",cos_th)

    return cos_th


if __name__ == '__main__':
    orm_standby()
    from database import models

    username = "123"
    # 推荐用户
    user_id = models.UserInfo.objects.get(username=username).pk
    # 当前用户收藏数组
    user_collect_list = []
    user_collect_obj = models.Collect.objects.filter(user_id=user_id).values("scenic_spot_id")
    for collect_id in user_collect_obj:
        user_collect_list.append(collect_id.get("scenic_spot_id"))

    # 创建排序组
    sort_user_pk_list = []
    # 其他用户的收藏数组
    collect_list_all = []
    user_all = models.UserInfo.objects.values("pk").all()
    for user_obj in user_all:
        if user_obj.get("pk") != user_id:
            sort_user_pk_list.append(user_obj.get("pk"))
            collect_list_obj_other =  models.Collect.objects.filter(user_id=user_obj.get("pk")).values("scenic_spot_id")
            other_collect_list = []
            for collect_id in collect_list_obj_other:
                other_collect_list.append(collect_id.get("scenic_spot_id"))
            collect_list_all.append(other_collect_list)

    # 获取最后一个PK     spots_last[0].get("pk")
    spots_last = models.ScenicSpot.objects.all().order_by("-id").values("pk")
    # 计算二值化
    user_binaryzation_list = make(user_collect_list, int(spots_last[0].get("pk")))
    # 计算最推荐值
    list_res = []
    for data in collect_list_all:
        list_res.append(calculation(user_binaryzation_list, make(data, int(spots_last[0].get("pk")))))

    max_index  = list_res.index(max(list_res))
    # 筛选出最匹配的用户
    print(sort_user_pk_list[max_index])

 

   # 这里做协同过滤
    uname = request.COOKIES.get('uname', '')
# 取到当前用户ID user_id_ds
= UserInfo.objects.get(uname=uname).pk # 当前用户浏览数组 user_look_list = [] user_look_obj = GoodsBrowser.objects.filter(user_id=user_id_ds).values("good_id") for good_id in user_look_obj: user_look_list.append(good_id.get("good_id")) # 创建排序组 sort_user_pk_list = [] # 其他用户的浏览数组 look_list_all = [] user_all = UserInfo.objects.values("pk").all() for user_obj in user_all: if user_obj.get("pk") != user_id_ds: sort_user_pk_list.append(user_obj.get("pk")) look_list_obj_other = GoodsBrowser.objects.filter(user_id=user_obj.get("pk")).values("good_id") other_look_list = [] for look_id in look_list_obj_other: other_look_list.append(look_id.get("good_id")) look_list_all.append(other_look_list) # print("其他用户的数组",look_list_all) # 获取商品最后一个PK 作为总数 good_count = GoodsInfo.objects.all().order_by("-id").values("pk") print("good_count",int(good_count[0].get("pk"))) # 计算二值化 user_binaryzation_list = make(user_look_list,int(good_count[0].get("pk"))) # 计算最推荐值 list_res = [] for data in look_list_all: list_res.append(calculation(user_binaryzation_list, make(data, int(good_count[0].get("pk"))))) max_index = list_res.index(max(list_res)) # 筛选出最匹配的用户 res_user_id = sort_user_pk_list[max_index]

   # 取出改匹配值的用户 取出它的浏览商品 goods_id_set
= GoodsBrowser.objects.filter(user_id=res_user_id).values("good_id")[0:2] try: news =[] for good_ids in goods_id_set: res = GoodsInfo.objects.get(pk=good_ids.get("good_id")) news.append(res) except: news = goods.gtype.goodsinfo_set.order_by('-id')[0:2]

 

推荐阅读