欢迎访问宙启技术站
智能推送

使用Python和Haskell构建的推荐系统案例

发布时间:2023-12-09 06:02:38

推荐系统是一种用于预测用户对商品或服务的偏好的技术,它可以根据用户的历史行为和偏好向用户推荐相关的商品。在本文中,我将介绍两个使用Python和Haskell构建的推荐系统案例,并提供使用例子。

1. Python推荐系统案例:基于协同过滤的电影推荐系统

协同过滤是一种常用的推荐系统算法,它通过分析用户的历史行为和与其他用户的共同偏好来预测用户的喜好。以下是一个使用Python构建的基于协同过滤的电影推荐系统案例:

import pandas as pd
from surprise import Reader, Dataset, KNNBasic

# 加载电影评分数据集
ratings_df = pd.read_csv('ratings.csv')

# 创建Surprise的数据集
reader = Reader(rating_scale=(1, 5))
data = Dataset.load_from_df(ratings_df[['userId', 'movieId', 'rating']], reader)

# 构建协同过滤算法模型
sim_options = {'name': 'cosine', 'user_based': False}
model = KNNBasic(sim_options=sim_options)

# 训练模型
trainset = data.build_full_trainset()
model.fit(trainset)

# 为用户1推荐电影
user_id = 1
user_movies = ratings_df[ratings_df['userId'] == user_id]['movieId'].unique()
predictions = []
for movie_id in ratings_df['movieId'].unique():
    if movie_id not in user_movies:
        raw_prediction = model.predict(user_id, movie_id)
        predictions.append((movie_id, raw_prediction.est))
recommendations = sorted(predictions, key=lambda x: x[1], reverse=True)[:5]

# 打印推荐结果
print('Top 5 recommended movies for user {}:
'.format(user_id))
for movie_id, rating in recommendations:
    print('Movie {}: predicted rating = {}'.format(movie_id, rating))

在这个例子中,首先加载电影评分数据集,然后使用Surprise库创建Surprise的数据集。接下来,构建协同过滤算法模型,并训练模型。最后,为指定用户推荐电影,并打印推荐结果。

2. Haskell推荐系统案例:基于内容过滤的音乐推荐系统

内容过滤是另一种常用的推荐系统算法,它通过分析商品或服务的特征来推荐相似的商品。以下是一个使用Haskell构建的基于内容过滤的音乐推荐系统案例:

import Data.List (maximumBy)
import Data.Ord (comparing)

type Song = (String, String, [String])
type User = (String, [Song])

-- 计算两首歌曲之间的相似度
similarity :: Song -> Song -> Double
similarity (_, _, genres1) (_, _, genres2) =
  fromIntegral (length commonGenres) / fromIntegral (length unionGenres)
  where
    commonGenres = genres1 intersect genres2
    unionGenres = nub (genres1 ++ genres2)

-- 为用户推荐歌曲
recommend :: [User] -> User -> Song
recommend users user =
  maximumBy (comparing (similarity song)) otherSongs
  where
    (_, song, _) = head (snd user)
    otherUsers = filter (\u -> fst u /= fst user) users
    otherSongs = map (\(_, song', _) -> song') (concatMap snd otherUsers)

-- 测试数据
users :: [User]
users =
  [ ("User1", [("Song1", "Artist1", ["Genre1", "Genre2", "Genre3"])]),
    ("User2", [("Song2", "Artist2", ["Genre1", "Genre2", "Genre4"])]),
    ("User3", [("Song3", "Artist3", ["Genre1", "Genre2", "Genre5"])])
  ]

-- 测试推荐系统
main :: IO ()
main = do
  let user = ("User4", [("Song4", "Artist4", ["Genre1", "Genre2", "Genre6"])])
      recommendedSong = recommend users user
  putStrLn ("Recommended song: " ++ fst recommendedSong)

在这个例子中,首先定义了歌曲和用户的数据类型。然后,实现了计算两首歌曲之间相似度的函数和为用户推荐歌曲的函数。最后,提供了一个测试数据集和测试推荐系统的例子。

以上是使用Python和Haskell构建的两个推荐系统案例,并提供了相应的使用例子。这些案例可以帮助你理解如何使用Python和Haskell构建推荐系统,并为用户提供个性化的推荐。通过这些案例的学习和实践,你可以进一步探索和改进推荐系统算法,以满足不同场景下的需求。