基于标签的推荐算法实现

随笔 2016-04-26

  上面一篇文章说到了可以用mahout快速开发推荐算法,事实上推荐算法的应用场景已经十分广泛,最早提出的是协同过滤的推荐算法,也已经应用于各新闻,社交及电商网站。下面让我们模拟这一算法的开发过程。   首先对于每一个注册用户,网站可以根据他们对相关内容的关注程度给他们分别标上标签,例如,张三喜欢某款运动鞋等。随着网站用户数的增加,数据量也随之增长,这时候为了提高效率,网站就可以考虑使用推荐算法来向用户推荐物品。   为了更好地进行计算,首先要将数据进行清洗,例如将用户和物品按照数字编号进行表示,以一定的格式给出,例如:    23,345    12,22    45,87    ......

  然后就可以进行程序的编写了。

  mahout提供了6种推荐算法接口(详细使用请参见文档),要根据场景分析使用,这里我们显然需要使用基于用户的推荐器(GenericUserBasedRecommender)。

   public class Recommend {

    final static int RECOMMENDER_NUM = 5;  //推荐数上限

    public static void main(String[] args) throws Exception {

        String path = Recommend.class.getClassLoader().getResource("").getPath(); //获取文件路径
        String file = "/data/data1.csv";
        DataModel model = new FileDataModel(new File(path+file)); //根据数据生成模型
        UserSimilarity similar = new CityBlockSimilarity(model);  //使用曼哈顿距离计算相似度
        //NearestNUserNeighborhood作为近邻算法,参数为 邻居的个数,用户相似度,数据模型
        UserNeighborhood unb = new NearestNUserNeighborhood(2, similar, model);
        //构建不包含评分的UserCF型推荐器
        Recommender r = new GenericBooleanPrefUserBasedRecommender(model, unb, similar);

        //输出推荐结果,为2号用户推荐最多5个
        List<RecommendedItem> list = r.recommend(2, RECOMMENDER_NUM);
        for (RecommendedItem recommendedItem : list) {
            System.out.println("推荐的是:"+recommendedItem.getItemID()+"  "+"推荐度是:"+recommendedItem.getValue());  
        }

    }
}

  然后我们用假定的数据集测试看看    1,2    2,1    1,3    1,5    1,7

  上面5组数据代表1和2的表现,他们共同关注编号1的物品。运行程序输出:

推荐的是:5  推荐度是:0.25   
推荐的是:7  推荐度是:0.25   
推荐的是:3  推荐度是:0.25

  结果合理。

  如果将推荐数改为1,那么程序将选出推荐度最高的一个,在这里是随机选择。

  如果将数据改为:    1,2    2,1    1,3    1,5    1,7

  那么结果将推荐所有:

推荐的是:5  推荐度是:0.16666667
推荐的是:7  推荐度是:0.16666667
推荐的是:3  推荐度是:0.16666667
推荐的是:2  推荐度是:0.16666667

  如果加入第三个用户

   1,2    2,1    1,3    1,5    1,7    3,8    3,2

  输出是

推荐的是:2  推荐度是:0.4166667
推荐的是:8  推荐度是:0.25
推荐的是:3  推荐度是:0.16666667
推荐的是:7  推荐度是:0.16666667
推荐的是:5  推荐度是:0.16666667

  之所以重点推荐2是因为它被其他两个人共同关注,而8推荐度高的原因是,用户3关注的物品被重点推荐所占的比例高,对此,大加可以进一步实验。

  总的来说,该推荐算法的效果还是很好的。如果使用真实数据mahout也提供了准确度的检验方法,十分方便。


本文由 Tony 创作,采用 知识共享署名 3.0,可自由转载、引用,但需署名作者且注明文章出处。

如果对您有用,您的支持将鼓励我继续创作!