predictionIO E-Commerce Recommendation 买了又买-物相似

  1. 原来的算法模型中,没有考虑买了又买的物品,对于钢材行业,用户的需求是一致的,经常买了又买,所以增加此功能
 a 模型训练中增加如下代码
 
        //buy item for users
        JavaPairRDD<String, String> buyItemForUser = data.getBuyEvents().mapToPair(new PairFunction<UserItemEvent, Tuple2<String, String>, Integer>() {
            @Override
            public Tuple2<Tuple2<String, String>, Integer> call(UserItemEvent buyEvent) throws Exception {
                return  new Tuple2<>(new Tuple2<>(buyEvent.getUser(), buyEvent.getItem()), 1);
            }
        }).mapToPair(new PairFunction<Tuple2<Tuple2<String, String>, Integer>, String, Integer>() {
            @Override
            public Tuple2<String, Integer> call(Tuple2<Tuple2<String, String>, Integer> element) throws Exception {
                return new Tuple2<>(element._1()._1()+":::"+element._1()._2(), element._2());
            }
        }).reduceByKey(new Function2<Integer, Integer, Integer>() {
            @Override
            public Integer call(Integer integer, Integer integer2) throws Exception {
                return integer + integer2;
            }
        }).mapToPair(new PairFunction<Tuple2<String, Integer>, String, String>() {
            @Override
            public Tuple2<String, String> call(Tuple2<String, Integer> element) throws Exception {
                String temp[]=element._1().split(":::");
                if(temp.length==2){
                    return new Tuple2<>(temp[0], temp[1]);
                }            
                return new Tuple2<>("", "");              
            }
        });
        
        b 增加预测算法
            private List<ItemScore> buyItemForUser(Model model, Query query){
        logger.info("start to add buy item for the user");
        final JavaRDD<ItemScore> matchedUser = model.getUserBuyItem().filter(new Function<Tuple2<String, String>, Boolean>() {
            @Override
            public Boolean call(Tuple2<String, String> userIndex) throws Exception {
                return userIndex._1().equals(query.getUserEntityId());
            }
        }).map(new Function<Tuple2<String,String>,ItemScore>() {
            @Override
            public ItemScore call(Tuple2<String, String> arg0) throws Exception {
                  return new ItemScore(arg0._2(),10);
            }            
        });
        
        return matchedUser.collect();
        
    }
    
    c topItemsForUser 按照你的业务逻辑出来两者的排序规则

基于物的相似性,也是我们期望,加入以下代码

//根据事件查找物品的属性
    private List<Set<String>> getRecentProductCategory(Query query, Model model) {
        try {
            List<Set<String>> result = new ArrayList<>();

            List<Event> events = LJavaEventStore.findByEntity(
                    ap.getAppName(),
                    "user",
                    query.getUserEntityId(),
                    OptionHelper.<String>none(),
                    OptionHelper.some(ap.getSimilarItemEvents()),
                    OptionHelper.some(OptionHelper.some("item")),
                    OptionHelper.<Option<String>>none(),
                    OptionHelper.<DateTime>none(),
                    OptionHelper.<DateTime>none(),
                    OptionHelper.some(10),
                    true,
                    Duration.apply(10, TimeUnit.SECONDS));

            for (final Event event : events) {
                if (event.targetEntityId().isDefined()) {
                    JavaPairRDD<String, Integer> filtered = model.getItemIndex().filter(new Function<Tuple2<String, Integer>, Boolean>() {
                        @Override
                        public Boolean call(Tuple2<String, Integer> element) throws Exception {
                            return element._1().equals(event.targetEntityId().get());
                        }
                    });

                    final String itemIndex = filtered.first()._1();
                    
                    
                    Item item = model.getItems().get(itemIndex);
                    if(item.getCategories()!=null && item.getCategories().size()>0){
                       result.add(item.getCategories());
                    }
                }
            }

            return result;
        } catch (Exception e) {
            logger.error("Error reading recent events for user " + query.getUserEntityId());
            throw new RuntimeException(e.getMessage(), e);
        }
    }
    
    //相似性比较
    private List<ItemScore> similarItemsByCategory(final List<Set<String>> category, Model model, Query query) {
        
        Map<String, Item> items =model.getItems();
        if(items==null || items.size()==0){
            return null;
        }
        
        if(category==null || category.size()==0){
            return null;
        }
        
        JavaRDD<ItemScore> itemScores = model.getItemIndex().map(new Function<Tuple2<String, Integer>, ItemScore>() {
            @Override
            public ItemScore call(Tuple2<String, Integer> idItem) throws Exception {
                String itemid= idItem._1();
                Item item = items.get(itemid);            
                double similarity = 0.0;
                for(int i=0 ; i<category.size(); i++){
                    similarity+=getDistance(category.get(i),item.getCategories());
                }
                logger.info(itemid+"->"+similarity);
                return (new ItemScore(itemid, similarity));
                
            }
        });
        
        itemScores = validScores(itemScores, query.getWhitelist(), query.getBlacklist(), query.getCategories(), model.getItems(), query.getUserEntityId());
        
        return sortAndTake(itemScores, query.getNumber());
        
      /*  List<ItemScore> itemScores=new ArrayList<ItemScore>();
        
        for (Map.Entry<String, Item> entry : items.entrySet()) {
             Item it = entry.getValue();
             double similarity = 0.0;
             for(int i=0 ; i<category.size(); i++){
                 similarity+=getDistance(category.get(i),it.getCategories());
             }
             itemScores.add(new ItemScore(it.getEntityId(), similarity));
        }
        
        
        
        itemScores = validScoresForList(itemScores, query.getWhitelist(), query.getBlacklist(), query.getCategories(), model.getItems(), query.getUserEntityId());
        return sortAndTake(itemScores, query.getNumber());*/
    }
    
    //相似算法,比较简单
    public static int getDistance(Set<String> t, Set<String> s) {  
        if (t==null || t.size()==0 || s==null || s.size()==0 || t.size() != s.size()) {            
            return 0;
        }
        HashSet<String> t_temp=new HashSet<String>(t);//必须转一下
        HashSet<String> s_temp=new HashSet<String>(s);
        t_temp.retainAll(s_temp);
        return t_temp.size();
        
    }
    
    最后按照你的业务逻辑,加入相似的物品。
时间: 2024-08-07 22:25:21

predictionIO E-Commerce Recommendation 买了又买-物相似的相关文章

头疼!中国人最想买和最后买的手机为何不一样

梦想和现实之间,总是存在差距.而这不仅仅表现在人生规划.历程上,甚至反应在各种随处可见的商品上.大到房子.汽车,小到手机.电脑,都无时无刻不在提醒着绝大多数人梦想的遥远和坚持下去的重要性. 近日,来自投资银行摩根士丹利的分析师凯蒂-休伯蒂发布一个报告图表,该图表以网络搜索结果和社交媒体数据为依据,形象.生动地表现出中国人最想拥有的手机品牌.但让人无奈地是,这份"最想买"的手机数据调查,与现实中的手机实际销量有着不小的出入.这是最让手机厂商头疼的--大数据不代表一切,怎么才能精准抓住消费

公司给股票期权,我买还是不买?

关于股票期权的话题,公司给股票期权员工购买,我买还是不买呢? 我们从两个角度来谈吧,先从员工的角度,再从老板的角度. 如果你是员工: 关于期权,其实买不买的判断办法很简单,如果让你纠结和犹豫的话,就坚决不买就行了. 期权和股票这东西,老板给你买,并且认为这是公司给你的恩赐,而你要装着很感激而且还要去争取,这基本上就是扯淡和让人恶心,不鸟他就是了. 如果还要再公司呆上一段时间才走人,就做做表面功夫吧. 坚决不要买,买了就是变相交保证金,自己绑住自己. 如果你在华为.阿里等这些大公司,公司要卖期权和

三句话教你买对房子!买到好房子的都祝福哥三年内赚两个亿!

http://bbs.tianya.cn/post-house-482606-1.shtml 看见很多菜人花了老爸老妈一辈子的钱买了破房,哥心痛呀,做点善事,教你一下,三分钟学会买房,看了此贴买到好房的都给哥祝福一下:三年内赚两个亿! 买房很简单,就三句话,记住就行,对着这几个字去买,百分百对. 三句话总概述为:五无,六有,四基本. 四基本:透,亮,正,静. 五无:立交,工厂,医院,幅射,污柒. 六有:山,水,学校,公园,地铁,商超. 以上几条不可能全达到,但达到越多者房子越好. 再送几句买房要

读书-《第一次买保险就买对》保险我们这样买

在没有读这本书<第一次买保险就买对>之前,我对保险是有些许偏见的.虽说知道保险的意义所在,也自己糊里糊涂的买过保险,但总还是没有对保险有个系统完整的认识,也就更谈不上对自己和家人有个很好的保险规划.只到看了这本书<第一次买保险就买对>,这本由简七理财倾心奉献的保险之良籍,才丰富了我对于保险的认知.就像书中导语所说:“我们都期待一种生活,在这种生活里,每个人安居乐业,相安无事,万事顺心”,可事实上,我们知道,这样的生活并不存在,世界上每分每秒都在发生意外,意外和顺心哪个先来,我们都不

买书?买知识?

书是什么? 书籍只是知识的载体. 想要领会知识,还需要付出额外的时间和精力. 书贵么? 买书的几十元其实不算什么,珍贵的是读书的时间和注意力. 一本书只要有一部分内容有价值,有启发,自己收获了经验,最好还能联系实践.获得成长,那么就值回书价了. 如何做? 珍惜自己的时间,读好书,吸收好书内的知识. 同"爱读书.爱成长"的各位共勉!

技术男,买二手车还是买新车好

过户是必须的: 卖家:未过户的车辆,一旦发生交通事故,责任是归户主的,卖家可能承担责任赔偿. 买家:买的车子不在自己的名下,是没有法律效力的,卖家一旦反悔是有收回权利的. 过户办理需要多久 二手车过户分为本地过户和外地过户. 本地过户:手续齐全时,一天就能办完. p>外地过户:连同提取车辆的各种档案,一般在7个工作日内. 二手车过户费用 各地区过户收费标准不同,根据排量.年份.车型等,收费也相差较大. 杭州地区二手车过户费用基本差不多,在200元--800元之间,其中1.0L以下排量收费200元

课堂练习之求最划算的买法的价格

1.设计思想: 按照比例,由题目可知:2本   便宜5%,3本  便宜10%,4本   便宜20%,5本   便宜25%. 所以1~5本按照每册买一本来买最便宜:6~10本则要看情况计算,6本  按照5册加一本  也就是5*单价*(1-25%)+1*单价:7本则是  5*单价*(1-25%)+2*单价*(1-5%):8本 是4*单价*(1-20%)*2:9本 是4*单价*(1-20%)+5*单价*(1-25%):10本以上整数部分按套买,个数部分则和前面一样. 2,设计代码: //最划算的买法的

为什么股票一买就跌,一卖就涨?终于找到答案了!

投资股市的你是不是经常遇见这样的事呢?看着涨得很好的股,一买入就跌:看着别人的股票长得很好,自己股票就是不涨,好不容易忍痛割爱,但是一卖就涨.如果你经常出现这种情况,本文无疑将对你收益终身. 兵者,国之大事,死生之地,存亡之道,不可不察也. 译文:战争是国家的大事,关系到人民的生死,关系到国家的存亡,不得不认真思考.研究.观察. 股票投资有两种获利方式说法,一种是赚公司经营发展成长的钱,另一个是赚市场博弈的钱.然而在市场交易就会免不了会参与到市场博弈中去. 可能有些人会觉得价值投资就是始终赚公司

摩托车买车学车流水账

济南开启了全城修路.扒路的节奏,几度荣膺全国第一堵的称号,实在实不了开车的堵和电动车的频繁充电,所以有了3月底有了买摩托的冲动,说干就干,有了2到3周的时间搞定选车.买车.上牌等步骤,以下是流水账,供有同样想法的人参考. 一.报名 1. 二轮800元,三轮900元,二轮考出来后不能驾驶三轮车,并且据考过的人说三轮好考,建议报三轮. 并且一般可以让卖车的帮报名. 2. 考试前需要去车管所报名,体检40元钱,去车管所后找穿白衣服的工作人员就行,非常简单,就是走走过场. 3. 考试前不需要去交警大队进