基础推荐算法

 

<dependency>
    <groupId>org.slf4j</groupId>
    <artifactId>slf4j-nop</artifactId>
    <version>1.7.25</version>
</dependency>

<dependency>
    <groupId>org.apache.mahout</groupId>
    <artifactId>mahout-core</artifactId>
    <version>0.8</version>
</dependency>

<dependency>
    <groupId>com.google.guava</groupId>
    <artifactId>guava</artifactId>
    <version>15.0</version>
</dependency>

 

按照用户相似度
    简述:与用户相似选课记录的人喜欢的,但是用户没有学的课推荐给用户。
    函数userSimilarity;客户相似用欧式距离计算(直线距离,标题极其相似)
    样本showxxin1.csv(每个人的选课记录都不一样,无法推荐)showxxin2.csv(3个人abc,abc人都选了3门同样的课,bc两人都多选了1门课,这时会给a推荐这门课程)函数userSimilarity2;客户相似用曼哈顿距离计算(实际距离,标题大概相似)
    样本:虽然其标题不一样,但是标题内容及其相近,所以其showxxin1.csvshowxxin2.csv样本都会给a推荐bc都选了的课。

按照Item相似度
    简述:与用户相似选课记录的人喜欢的,用户没有学的,同时这门课其他用户选了,则推荐给用户。与客户相似度主要不同的是item相似度还需考虑本门课程的热门程度。
    函数itemSimilarity;
    样本showxxin3.csv(3个人abcab选了3门同样的课,然后b多选了一门课,c也选了这门课,这时会给a推荐bc选的这门课)showxxin4.csv(样本showxxin3.csv的基础上增加了几组用户)注意:样本showxxin3.csvuserSimilarity是不会出结果的,这是因为showxxin3.csv的数据不足以建立用户相似度,只有基于Item相似度才有效果。所以需根据实际需求选择推荐算法。
按照model模型相似度
    简述:多数用户评价较好的课程;先根据评分再根据热门程度,若没有评分数据,则只根据热门程度。 
    函数sVDRecommender和slopeOne;  样本

 

import org.apache.mahout.cf.taste.common.TasteException;
import org.apache.mahout.cf.taste.impl.common.LongPrimitiveIterator;
import org.apache.mahout.cf.taste.impl.model.MemoryIDMigrator;
import org.apache.mahout.cf.taste.impl.model.file.FileDataModel;
import org.apache.mahout.cf.taste.impl.neighborhood.NearestNUserNeighborhood;
import org.apache.mahout.cf.taste.impl.recommender.CachingRecommender;
import org.apache.mahout.cf.taste.impl.recommender.GenericItemBasedRecommender;
import org.apache.mahout.cf.taste.impl.recommender.GenericUserBasedRecommender;
import org.apache.mahout.cf.taste.impl.recommender.slopeone.SlopeOneRecommender;
import org.apache.mahout.cf.taste.impl.recommender.svd.*;
import org.apache.mahout.cf.taste.impl.similarity.*;
import org.apache.mahout.cf.taste.model.DataModel;
import org.apache.mahout.cf.taste.recommender.RecommendedItem;
import org.apache.mahout.cf.taste.recommender.Recommender;
import org.apache.mahout.cf.taste.similarity.ItemSimilarity;
import org.apache.mahout.cf.taste.similarity.UserSimilarity;

import java.io.*;
import java.util.List;
import java.util.Random;

public class Recommend {
    static final String inputFile = "data/showxxin6.csv";// 数据源
    static final String outputFile = "data/xxout.csv";// 算法所需csv文件
    static MemoryIDMigrator thing2long = new MemoryIDMigrator();

    public static void main(String[] args) throws IOException, TasteException {
        CreateCsvRatingsFile();
        //创建模型数据源文件
        DataModel model = new FileDataModel(new File(outputFile));
        // 修改算法引擎
        Recommender cachingRecommender = sVDRecommender(model);

        int userNum = 0;
        // 对用户进行推荐
        for (LongPrimitiveIterator it = model.getUserIDs(); it.hasNext(); ) {
            userNum++;
            long userId = it.nextLong();
            // 对单个User进行推荐
            List<RecommendedItem> recommendations = cachingRecommender.recommend(userId, 1);
            // 该用户无推荐结果
            if (recommendations.size() == 0) {
                System.out.print("User: ");
                System.out.print(thing2long.toStringID(userId));
                System.out.println(": No Recommend");
            } else {
                // 打印推荐信息
                for (RecommendedItem recommendedItem : recommendations) {
                    System.out.print("User: ");
                    System.out.print(thing2long.toStringID(userId));
                    System.out.print(": ");
                    System.out.println(thing2long.toStringID(recommendedItem.getItemID()) + " Value: " + recommendedItem.getValue());
                }
            }
            System.out.println("------");
        }
        System.out.println("用户数:" + userNum);
    }

    private static void CreateCsvRatingsFile() throws IOException {
        BufferedReader br = new BufferedReader(new FileReader(inputFile));
        BufferedWriter bw = new BufferedWriter(new FileWriter(outputFile));

        String line = null;
        String line2write = null;
        String[] temp;
        Random random = new Random();
        int ccc=0;
        while ((line = br.readLine()) != null) {
            ccc++;
            if (line.equals("")) continue;
            temp = line.split(",");
            long uLong = thing2long.toLongID(temp[0]);
            long iLong = thing2long.toLongID(temp[1]);
//            line2write = uLong + "," + iLong; // 无评分
//            line2write = uLong + "," + iLong + "," + random.nextInt(10); // 有评分
            line2write = uLong + "," + iLong + "," + temp[2];
            thing2long.storeMapping(uLong, temp[0]);
            thing2long.storeMapping(iLong, temp[1]);
            bw.write(line2write);
            bw.newLine();
            bw.flush();
        }
        System.out.println(ccc);
        br.close();
        bw.close();
    }

    // 根据用户相似度建立推荐引擎,model中需包含:用户IDitemID,评分
    // 个人理解:跟你相似 选课记录 的人喜欢的,但是你没有学的课推荐给你
    private static Recommender userSimilarity(DataModel model) throws TasteException {
        UserSimilarity userSim = new EuclideanDistanceSimilarity(model);
        //指定NearestNUserNeighborhood作为近邻算法
        NearestNUserNeighborhood userNei = new NearestNUserNeighborhood(3, userSim, model);// 邻居的个数,用户相似度,数据模型
        // 构建UserCF推荐器
        Recommender cachingRecommender = new GenericUserBasedRecommender(model, userNei, userSim);
        return cachingRecommender;
    }

    // 根据用户相似度建立推荐引擎,model中需包含:用户IDitemID,可选项:评分
    // 个人理解:与userSimilarity不同的是对于用户相似度的计算,一个是 EuclideanDistanceSimilarity(欧式距离),一个是CityBlockSimilarity(曼哈顿距离),曼哈顿距离会判断item的内容相似度。
    private static Recommender userSimilarity2(DataModel model) throws TasteException {
        UserSimilarity userSim = new CityBlockSimilarity(model);
        //指定NearestNUserNeighborhood作为近邻算法
        NearestNUserNeighborhood userNei = new NearestNUserNeighborhood(3, userSim, model);// 邻居的个数,用户相似度,数据模型
        // 构建UserCF推荐器
        Recommender cachingRecommender = new GenericUserBasedRecommender(model, userNei, userSim);
        return cachingRecommender;
    }

    // 根据Item相似度建立推荐引擎,model中需包含:用户IDitemID。可选项:评分
    // 个人理解:与你课程内容相似的人在看的课的,同时这门课还有其他人在学推荐给你
    private static Recommender itemSimilarity(DataModel model) {
        ItemSimilarity itemSim = new LogLikelihoodSimilarity(model);// LogLikelihoodSimilarity(对数似然相似度),重叠的个数,不重叠的个数,都没有的个数
        Recommender cachingRecommender = new GenericItemBasedRecommender(model, itemSim);
        return cachingRecommender;
    }

    // 根据model(模型)相似度建立推荐引擎,model中需包含:用户IDitemID。可选项:评分
    private static Recommender sVDRecommender(DataModel model) throws TasteException {
        // 数据模型,邻居的个数,迭代数
        Factorizer fatorizer1 = new RatingSGDFactorizer(model,2,3);// 用户和物品偏差的矩阵分解,用于评级预测
        Factorizer fatorizer2 = new SVDPlusPlusFactorizer(model,2,3);// 用于评级预测的经典矩阵分解的增强。感觉稍微增强了一点吧。
        Recommender cachingRecommender = new SVDRecommender(model, fatorizer1);// SVD矩阵分解技术的推荐器。fatorizer是分解器类型
        return cachingRecommender;
    }


    // SlopeOne算法,model中需包含:用户IDitemID。可选项:评分
    // @Deprecated
    private static Recommender slopeOne(DataModel model) throws TasteException {
        CachingRecommender cachingRecommender = new CachingRecommender(new SlopeOneRecommender(model));
        return cachingRecommender;
    }
}

 

样本数据:showxxin1

A1,全面实施绩效管理的路径选择,1
A1,构建安全生产治理新格局,1
A1,安全生产工作面临挑战,1

A2,全面实施绩效管理的路径选择2,3
A2,构建安全生产治理新格局2,3
A2,安全生产工作面临挑战2,3
A2,借助风险管理完善事中事后监管,3

A3,全面实施绩效管理的路径选择3,3
A3,构建安全生产治理新格局3,3
A3,安全生产工作面临挑战3,3
A3,借助风险管理完善事中事后监管,3

样本数据:showxxin2

A1,全面实施绩效管理的路径选择,1
A1,构建安全生产治理新格局,1
A1,安全生产工作面临挑战,1

A2,全面实施绩效管理的路径选择,30
A2,构建安全生产治理新格局,30
A2,安全生产工作面临挑战,30
A2,借助风险管理完善事中事后监管,3

A3,全面实施绩效管理的路径选择,30
A3,构建安全生产治理新格局,30
A3,安全生产工作面临挑战,30
A3,借助风险管理完善事中事后监管,4

样本数据:showxxin3

A1,全面实施绩效管理的路径选择,1
A1,构建安全生产治理新格局,1
A1,安全生产工作面临挑战,1

A2,全面实施绩效管理的路径选择,3
A2,构建安全生产治理新格局,3
A2,安全生产工作面临挑战,3
A2,借助风险管理完善事中事后监管,3

A5,借助风险管理完善事中事后监管,2

样本数据:showxxin4

A1,全面实施绩效管理的路径选择,1
A1,构建安全生产治理新格局,1
A1,安全生产工作面临挑战,1

A2,全面实施绩效管理的路径选择,3
A2,构建安全生产治理新格局,3
A2,安全生产工作面临挑战,3
A2,借助风险管理完善事中事后监管,3

A5,借助风险管理完善事中事后监管,2
A5,完善事中事后监管,2
A5,风险管理,2

A6,完善事中事后监管,2
A6,风险管理,2
A6,管理的问题,2

A7,管理的问题,2

 

发布者:songJian   点击数:1649   发布时间:2018-07-25 19:11:14   更新时间:2018-10-23 18:47:19
正在加载评论...
相关文章