如何轻松实现个性化推荐系统

简介: 这里采用的是.net的一个引用NReco.Recommender.dll,这是一个国外电影网站推荐系统衍生而来的,有兴趣的可以到他们的官网看看。以图书商城为例 MVC构造行为数据首先需要对数据库进行设计,增加一张用户的行为数据表,记录用户访问网站的行为,例如商城的一般记录浏览的商品和购买过的商品,根据你的业务逻辑进行设计。

这里采用的是.net的一个引用NReco.Recommender.dll,这是一个国外电影网站推荐系统衍生而来的,有兴趣的可以到他们的官网看看。

以图书商城为例 MVC

构造行为数据

首先需要对数据库进行设计,增加一张用户的行为数据表,记录用户访问网站的行为,例如商城的一般记录浏览的商品和购买过的商品,根据你的业务逻辑进行设计。

20161225094403.png

构造评分数据

需要对商品的进行评分,一般采用5分制,可以根据你的业务逻辑进行设计。

20161225094219.png

生成评分离线数据

 public class IndexJobRatings : IJob
    {
        Irecommend_ratingBLL ratingbll = new BLL.recommend_ratingBLL();
        ISettingsBLL setingsbll = new BLL.SettingsBLL();
        #region IJob 成员
        /// <summary>
        /// 定时处理任务都要放在这个方法
        /// </summary>
        /// <param name="context"></param>
        public void Execute(JobExecutionContext context)
        {
            var list = ratingbll.LoadEntities(c => true).ToList();
            StringBuilder sb = new StringBuilder();
            foreach (var item in list)
            {
                //需要过滤 取平均值
                sb.Append(item.userID   "\t"   item.bookID   "\t"   item.stars   "\t"   WebCommon.DateTimeToUnixTimestamp(Convert.ToDateTime(item.addTime))   "\r\n");
            }
            var logmodel = setingsbll.LoadEntities(c=>c.id==16).FirstOrDefault();
            if (logmodel != null && logmodel.value == "true")
            {
                System.IO.File.WriteAllText(WebCommon.MapPath("/data/ratings.dat"), sb.ToString());//写入文件  
                logmodel.value = "false";
                setingsbll.UpdateEntity(logmodel);
            }
            else
            {
                System.IO.File.WriteAllText(WebCommon.MapPath("/data/ratings1.dat"), sb.ToString());//写入文件
                logmodel.value = "true";
                setingsbll.UpdateEntity(logmodel);
            }
        }

        #endregion
    }

本人使用时间进度插件定时执行改任务,更新数据提高数据的准确率。

添加引用

直接在NuGet管理中添加即可,搜索NReco.Recommender

实现推荐

/// <summary>
        /// 推荐
        /// </summary>
        /// <param name="pageIndex">当前页</param>
        /// <param name="pageSize">页容量</param>
        /// <param name="showCount">显示数量</param>
        /// <returns></returns>
        public List<Books> RecommendBooks(int pageIndex, int pageSize, int showCount)
        {
            #region 推荐
            List<Books> books = null;
            if (Session["user"] != null)
            {
                Users user = Session["user"] as Users;

                #region 构建用户行为数组
                var loglist = logbll.LoadEntities(c => c.userID == user.Id).ToList();
                StringBuilder sb = new StringBuilder();
                if (loglist.Count > 0)
                {
                    sb.Append("[");
                    int j = 0;
                    foreach (var item in loglist)
                    {
                        j  ;
                        sb.Append(item.itemID.ToString());
                        if (j != loglist.Count)
                        {
                            sb.Append(",");
                        }
                    }
                    sb.Append("]");
                }
                #endregion

                if (string.IsNullOrEmpty(sb.ToString()))
                {
                    //冷启动
                    books = booksbll.LoadEntities(c => true).OrderByDescending(c => c.rating).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                }
                else
                {
                    var filmIds = (new JavaScriptSerializer()).Deserialize<long[]>(sb.ToString());

                    var logmodel = settingbll.LoadEntities(c => c.id == 16).FirstOrDefault();
                    string path = "";
                    if (logmodel != null && logmodel.value == "true")
                    {
                        path = "data/ratings1.dat";
                    }
                    else
                    {
                        path = "data/ratings.dat";
                    }

                    var pathToDataFile =
                            Path.Combine(System.Web.HttpRuntime.AppDomainAppPath, path);

                    if (dataModel == null)
                    {
                        dataModel = new FileDataModel(pathToDataFile, false, FileDataModel.DEFAULT_MIN_RELOAD_INTERVAL_MS, false);
                    }

                    var plusAnonymModel = new PlusAnonymousUserDataModel(dataModel);
                    var prefArr = new GenericUserPreferenceArray(filmIds.Length);
                    prefArr.SetUserID(0, PlusAnonymousUserDataModel.TEMP_USER_ID);
                    for (int i = 0; i < filmIds.Length; i  )
                    {
                        prefArr.SetItemID(i, filmIds[i]);
                        prefArr.SetValue(i, 5); // lets assume max rating
                    }
                    plusAnonymModel.SetTempPrefs(prefArr);

                    var similarity = new LogLikelihoodSimilarity(plusAnonymModel);
                    var neighborhood = new NearestNUserNeighborhood(15, similarity, plusAnonymModel);
                    var recommender = new GenericUserBasedRecommender(plusAnonymModel, neighborhood, similarity);
                    var recommendedItems = recommender.Recommend(PlusAnonymousUserDataModel.TEMP_USER_ID, showCount, null);
                    List<Books> newbooks = new List<Books>();
                    foreach (var item in recommendedItems)
                    {
                        int bid = Convert.ToInt32(item.GetItemID());
                        newbooks.Add(booksbll.LoadEntities(c => c.Id == bid).FirstOrDefault());
                    }

                    books = newbooks.Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
                }
            }
            else //不推荐
            {
                books = booksbll.LoadEntities(c => true).OrderByDescending(c => c.rating).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList();
            }
            #endregion

            return books.Count() <= 0 ? booksbll.LoadEntities(c => true).OrderByDescending(c => c.rating).Skip((pageIndex - 1) * pageSize).Take(pageSize).ToList() : books;
        }

当然直接这样会有冷启动问题,就是用户没有登录的情况和用户还没有行为数据的情况,本人采用热门商品的推荐。你也可以根据你的业务逻辑进行设计。


这只是本人的简单实现方案,还需要不断的完善,欢迎提出意见或建议,感谢您的阅读。

目录
相关文章
|
4月前
|
机器学习/深度学习 搜索推荐 算法
基于机器学习的用户行为分析与个性化推荐系统
传统的用户行为分析和推荐系统常常受限于规则的刻板和模型的简单,无法准确捕捉用户的个性化需求。本文基于机器学习技术,探讨了一种更加灵活、精准的用户行为分析与个性化推荐系统设计方法,通过深度学习模型结合大数据分析,实现了对用户行为的更细致把握和更个性化的推荐服务。
|
4月前
|
搜索推荐 UED
产品服务个性化定制
产品服务个性化定制
83 2
|
20天前
|
机器学习/深度学习 数据采集 搜索推荐
打造个性化新闻推荐系统
【8月更文挑战第31天】在这个信息爆炸的时代,个性化新闻推荐系统成为了连接用户与海量资讯的桥梁。本文将引导你通过Python编程语言和机器学习技术,搭建一个简单的新闻推荐模型。我们将从数据预处理开始,逐步深入到模型的训练与评估,最终实现一个能够根据用户兴趣推荐新闻的系统。无论你是编程新手还是有一定基础的学习者,这篇文章都将为你打开一扇通往智能推荐世界的大门。
|
1月前
|
机器学习/深度学习 人工智能 搜索推荐
|
2月前
|
机器学习/深度学习 搜索推荐 算法
智能推荐系统:个性化体验的背后
【7月更文第18天】在互联网的汪洋大海中,智能推荐系统就像一位贴心的向导,总能在浩瀚的信息中找到你最感兴趣的那一部分。它在电商平台上让你轻松发现心仪商品,在视频平台上为你连播下一集你欲罢不能的剧集。这背后的秘密,就是那些神奇的智能推荐算法。今天,咱们就来扒一扒电商、视频平台中的智能推荐系统,看看它是如何为你我打造出个性化的数字体验的。
109 0
|
4月前
|
SQL 分布式计算 分布式数据库
【推荐系统】系统相关配置
【推荐系统】系统相关配置
32 1
|
4月前
|
搜索推荐 算法 前端开发
基于用户特征的个性化网络小说推荐系统的设计与实现
基于用户特征的个性化网络小说推荐系统的设计与实现
186 0
|
机器学习/深度学习 数据采集 算法
精准用户画像!商城用户分群2.0!⛵
客户分群(客户细分)对于绘制用户画像、构建个性化推广、产品和服务策略,都非常重要。本文讲解此过程中,多种机器学习聚类算法的建模流程与评估模式。
902 2
精准用户画像!商城用户分群2.0!⛵
|
机器学习/深度学习 数据采集 算法
精准营销!用机器学习完成客户分群!⛵
客户分群对于精准营销的意义重大,而机器学习可以优化这一过程。本文会详细拆解实现过程:数据收集、创建RFM表、探索数据&数据变换、应用聚类做用户分群、解释结果。
946 1
精准营销!用机器学习完成客户分群!⛵