机器学习入门--协同过滤算法[推荐算法]-基于物品的相似度(python)

接上一篇

转自:https://blog.csdn.net/u012995888/article/details/79077681

原文用java实现,想看详细介绍的请跳原文

链接:https://blog.csdn.net/u012995888/article/details/79077681

数据格式可以自行修改,用其它方式存储更方便

直接上代码(基于物品的协同过滤)

#!/usr/bin/env python3
# -*- coding: utf-8 -*-
'''
@Time    : 2018/9/17 9:32
@Author  : Negen
@Site    : 
@File    : recommend3.py
@Software: PyCharm
'''
import numpy as np
users = ["小明", "小花", "小美", "小张", "小李"]
movies = ["电影1", "电影2", "电影3", "电影4", "电影5", "电影6", "电影7"]
allUserMovieStarList=[
            [1, 1, 1, 0, 1, 0, 0],
            [0, 1, 1, 0, 0, 1, 0],
            [1, 0, 1, 1, 1, 1, 1],
            [1, 1, 1, 1, 1, 0, 0],
            [1, 1, 0, 1, 0, 1, 1]]


def converRow2Col():
    """
    行转列
    :return:
    """
    return np.array(allUserMovieStarList).transpose().tolist()


def cal_two_mv_sim(movie1Stars: list, movie2Stars:list):
    """
    欧式距离计算两个电影之间的相似度
    :param movie1Stars:
    :param movie2Stars:
    :return:
    """
    return np.sqrt(((np.array(movie1Stars) - np.array(movie2Stars)) ** 2).sum())

def cal_all_mv_sim():
    """
    计算所有电影之间的相似度
    :return:
    """
    resDic = {}
    tempList = converRow2Col()
    for i in range(0, len(tempList)):
        for j in range(i+1, len(tempList)):
            resDic[str(i) + '-' + str(j)] = cal_two_mv_sim(tempList[i], tempList[j])
    return resDic


def calrecommendMoive(username: str) -> list:
    """
    计算待推荐的电影
    :return:list
    """
    temp = {}
    movies_sim_dic = cal_all_mv_sim()
    userindex = users.index(username)
    target_user_movie_list = allUserMovieStarList[userindex]
    for i in range(0, len(target_user_movie_list)):
        for j in range(i+1, len(target_user_movie_list)):
            if target_user_movie_list[i] == 1 and target_user_movie_list[j] == 0 and\
                (movies_sim_dic.get(str(i) + '-' + str(j)) != None or\
                 movies_sim_dic.get(str(j) + '-' + str(i)) != None):
                sim = movies_sim_dic.get(str(i) + '-' + str(j)) if(movies_sim_dic.get(str(i) + '-' + str(j)) != None) else movies_sim_dic.get(str(j) + '-' + str(i))
                temp[j] = sim
            elif target_user_movie_list[i] == 0 and target_user_movie_list[j] == 1 and \
                    (movies_sim_dic.get(str(i) + '-' + str(j)) != None or \
                     movies_sim_dic.get(str(j) + '-' + str(i)) != None):
                sim = movies_sim_dic.get(str(i) + '-' + str(j)) if (
                            movies_sim_dic.get(str(i) + '-' + str(j)) != None) else movies_sim_dic.get(
                    str(j) + '-' + str(i))
                temp[i] = sim
    temp = sorted(temp.items(), key=lambda d:d[1])
    print("待推荐列表:",temp)
    recommendlist = [movies[i] for i,v in temp]
    print("待推荐列表:", recommendlist)
    return recommendlist
print(cal_all_mv_sim())

calrecommendMoive("小李")
calrecommendMoive("小明")

运行结果

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值