美文网首页
Java 接入 ALS & LR 为用户推荐商户

Java 接入 ALS & LR 为用户推荐商户

作者: 乌鲁木齐001号程序员 | 来源:发表于2020-06-16 15:41 被阅读0次

召回(ALS)接入

  • 之前离线召回的数据保存在了 MySQL 中;
  • 直接取出来就行了;
package tech.lixinlei.dianping.recommand;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.List;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import tech.lixinlei.dianping.dal.RecommendModelMapper;
import tech.lixinlei.dianping.model.RecommendModel;

@Service
public class RecommendService{

    @Autowired
    private RecommendModelMapper recommendModelMapper;

    /**
     * 召回数据, 根据 userId 召回 shopIdList
     * @param userId
     * @return
     */
    public List<Integer> recall(Integer userId){
        RecommendModel recommendModel = recommendModelMapper.selectByPrimaryKey(userId);
        if(recommendModel == null){
            recommendModel = recommendModelMapper.selectByPrimaryKey(9999999);
        }
        String[] shopIdArr = recommendModel.getRecommend().split(",");
        List<Integer> shopIdList = new ArrayList<>();
        for(int i = 0; i < shopIdArr.length; i++) {
            shopIdList.add(Integer.valueOf(shopIdArr[i]));
        }
        return shopIdList;
    }

}

排序(LR)接入

package tech.lixinlei.dianping.recommand;

import org.apache.spark.ml.classification.GBTClassificationModel;
import org.apache.spark.ml.classification.LogisticRegressionModel;
import org.apache.spark.ml.linalg.Vector;
import org.apache.spark.ml.linalg.Vectors;
import org.apache.spark.sql.SparkSession;
import org.springframework.stereotype.Service;

import javax.annotation.PostConstruct;
import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.stream.Collectors;

@Service
public class RecommendSortService {

    private SparkSession spark;

    private LogisticRegressionModel lrModel;


    @PostConstruct
    public void init(){
        //加载 LR 模型
        spark = SparkSession.builder().master("local").appName("DianpingApp").getOrCreate();
        lrModel = LogisticRegressionModel.load("file:///home/lixinlei/project/gitee/dianping/src/main/resources/lrmode");
    }

    public List<Integer> sort(List<Integer> shopIdList, Integer userId){

        // 需要根据 lrmode 所需要 11 维的 x,生成特征,然后调用其预测方法
        List<ShopSortModel> list = new ArrayList<>();
        for(Integer shopId : shopIdList){
            //造的假数据,可以从数据库或缓存中拿到对应的性别,年龄,评分,价格等做特征转化生成 feature 向量
            Vector v = Vectors.dense(1,0,0,0,0,1,0.6,0,0,1,0);
            Vector result = lrModel.predictProbability(v);
            // arr[1] 表示代表正样本的概率
            double[] arr = result.toArray();
            double score = arr[1];
            ShopSortModel shopSortModel = new ShopSortModel();
            shopSortModel.setShopId(shopId);
            shopSortModel.setScore(score);
            list.add(shopSortModel);
        }

        list.sort(new Comparator<ShopSortModel>() {
            @Override
            public int compare(ShopSortModel o1, ShopSortModel o2) {
                if(o1.getScore() < o2.getScore()){
                    return 1;
                }else if(o1.getScore() > o2.getScore()){
                    return -1;
                }else{
                    return 0;
                }
            }
        });

        return list.stream().map(shopSortModel -> shopSortModel.getShopId()).collect(Collectors.toList());
    }

}

修改原来的 recommand 方法的实现

  • 先召回,再排序;
package tech.lixinlei.dianping.service.impl;

@Service
public class ShopServiceImpl implements ShopService {  

    @Autowired
    RecommendService recommendService;

    @Autowired
    RecommendSortService recommendSortService;

    /**
     * 先召回,再排序
     * @param longitude
     * @param latitude
     * @return
     */
    @Override
    public List<ShopModel> recommend(BigDecimal longitude, BigDecimal latitude) {
        List<Integer> shopIdList = recommendService.recall(148);
        shopIdList = recommendSortService.sort(shopIdList,148);
        List<ShopModel> shopModelList = shopIdList.stream().map(id->{
            ShopModel shopModel = get(id);
            shopModel.setIconUrl("/static/image/shopcover/xchg.jpg");
            shopModel.setDistance(100);
            return shopModel;
        }).collect(Collectors.toList());
//        List<ShopModel> shopModelList = shopModelMapper.recommend(longitude, latitude);
//        shopModelList.forEach(shopModel -> {
//            shopModel.setSellerModel(sellerService.get(shopModel.getSellerId()));
//            shopModel.setCategoryModel(categoryService.get(shopModel.getCategoryId()));
//        });
        return shopModelList;
    }

}

相关文章

  • Java 接入 ALS & LR 为用户推荐商户

    召回(ALS)接入 之前离线召回的数据保存在了 MySQL 中; 直接取出来就行了; 排序(LR)接入 修改原来的...

  • 支付宝 APP 支付

    App支付快速接入 开放平台密钥 商户服务型应用:适用于服务商,为商户开发应用,拓展商户使用,详见供他人使用; 自...

  • 微信支付

    如何成为微信支付商户的方法: 腾讯客服-微信支付商户申请接入信息汇总:腾讯客服-微信支付商户申请接入信息汇总 腾讯...

  • 协同过滤-ALS算法

    ALS算法应用场景 ALS属于数据挖掘,可以做推荐系统,比如电影推荐,商品推荐,广告推荐等. 原理就是给各个指标,...

  • 牛掰了!支付宝接入南非10000家商户,支付宝世界版图上再填一国

    蚂蚁金服30日宣布,旗下支付宝移动支付业务已经接入南非10000家商户,为赴南非旅游的中国支付宝用户提供支付服务。...

  • 推荐系统 - ALS算法

    ALS简介 ALS算法中文翻译为 交替最小二乘法,其是一种矩阵分解算法;使用两个矩阵拟合用户 - 商品评分矩阵;为...

  • 公众平台接入商户功能篇

    接入微信支付功能——商户功能 微信支付,提供用户身份识别、微信地址共享、支付结算、客户关系维护、售后维权、交易统计...

  • ALS推荐算法

    简要描述: ALS是交替最小二乘(alternating least squares)的简称。在机器学习的范畴中,...

  • HPX后台管理--添加商户

    添加商户 1. 准备工作 2. 获取商户信息 商户注册之后,拿到商户注册的用户名,在后台用户查询界面,查询到商户信...

  • 订单中的退款流程

    场景: 当支付系统接入一个B2C商户,提供网银支付通道,在下述情况时,退款流程是如何设计的? 角色描述:A=用户,...

网友评论

      本文标题:Java 接入 ALS & LR 为用户推荐商户

      本文链接:https://www.haomeiwen.com/subject/cikrxktx.html