基于内容的推荐 java实现

  • 这是本人在cousera上学习机器学习的笔记,不能保证其正确性,慎重參考
  • 看完这一课后Content Based Recommendations 后自己用java实现了一下

1、下图是待处理的数据,代码使用数据和下图一样:
这里写图片描写叙述

2、思路:对每一个用户假定其为一个3维向量(在代码中初始化为[1,1,1]的转置,然后採用梯度下降法不断的对这个3维向量的值进行更新)。如果更新到最后的向量值为[0,5,0]的转置,然后使用该向量和电影“Cute puppoes of love”的特征向量进行计算,就可以得到该电影的预測分为4.95。
这里写图片描写叙述

3、使用梯度下降法对某个用户的向量进行更新(我在代码中没有考虑正则化这一问题,如今还不懂正则化。后面学会了就附上加了正则化的):
这里写图片描写叙述
下图为没有使用正则化的函数:
这里写图片描写叙述

4、以下仅针对用户carol进行了代码实现

public class ContentBase {
    private static int[][] rate_set = { { 5, 5, 0, 0 }, { 5, -1, -1, 0 },
            { -1, 4, 0, -1 }, { 0, 0, 5, 4 }, { 0, 0, 5, -1 } };
    private static double[][] m_feature = { { 0.9, 0 }, { 1.0, 0.01 },
            { 0.99, 0 }, { 0.1, 1.0 }, { 0, 0.9 } };
    //仅针对用户carol进行了代码实现
    public static void main(String[] args) {
        double t = 0.1;
        double[] para = { 1.0, 1.0, 1.0 };
        double[] partial = new double[3];
        double min = 0.0;

        int i = 0, j, u,times=0;
        double temp,temp2;
        //100为用户2的向量学习次数
        while(times++<100){
            min=0.0;
            i=0;
            //该while循环计算代价函数
            while (i < 5) {
                temp = 0.0;
                if (rate_set[i][2] != -1) {
                    for (u = 0; u < 3; u++) {
                        if (u == 0)
                            temp += para[u];
                        else
                            temp += para[u] * m_feature[i][u - 1];
                    }
                    min += (temp - rate_set[i][2]) * (temp - rate_set[i][2]);
                }
                i++;
            }
            System.out.print("当用户 carol的向量值为[");
            for(j=0;j<3;j++)
                if(j!=2)
                    System.out.print(para[j]+",");
                else
                    System.out.println(para[j]+"]时,min="+min);
            System.out.println();

            for (j = 0; j < 3; j++) {
                i = 0;
                partial[j] = 0;
                while (i < 5) {
                    temp = 0.0;temp2=0.0;
                    if (rate_set[i][2] != -1) {
                        for (u = 0; u < 3; u++) {
                            if (u == 0)
                                temp += para[u];
                            else
                                temp += para[u] * m_feature[i][u - 1];
                        }
                        temp2 += temp - rate_set[i][2];
                        if (j != 0)
                            temp2 *= m_feature[i][j - 1];
                        partial[j]+=temp2;
                    }
                    i++;
                }
            }
            //依据求得的偏导数 partial来更新某用户的參数值
            for (j = 0; j < 3; j++) {
                para[j] = para[j] - t * partial[j];

            }
        }
    }
}

4、执行结果:
这里写图片描写叙述

注:部分图片来源为 机器学习-吴恩达 中的视频截图

项目完整可用,配合压缩包内数据库可直接运行使用。 eclipse+mysql5.7+jdk1.8 功能:推荐引擎利用特殊的信息过滤(IF,Information Filtering)技术,将不同的内容(例如电影、音乐、书籍、新闻、图片、网页等)推荐给可能感兴趣的用户。通常情况下,推荐引擎的实现是通过将用户的个人喜好与特定的参考特征进行比较,并试图预测用户对一些未评分项目的喜好程度。参考特征的选取可能是从项目本身的信息提取的,或是基于用户所在的社会或社团环境。 根据如何抽取参考特征,我们可以将推荐引擎分为以下四大类: • 基于内容推荐引擎:它将计算得到并推荐给用户一些与该用户已选择过的项目相似的内容。例如,当你在网上购书时,你总是购买与历史相关的书籍,那么基于内容推荐引擎就会给你推荐一些热门的历史方面的书籍。 • 基于协同过滤的推荐引擎:它将推荐给用户一些与该用户品味相似的其他用户喜欢的内容。例如,当你在网上买衣服时,基于协同过滤的推荐引擎会根据你的历史购买记录或是浏览记录,分析出你的穿衣品位,并找到与你品味相似的一些用户,将他们浏览和购买的衣服推荐给你。 • 基于关联规则的推荐引擎:它将推荐给用户一些采用关联规则发现算法计算出的内容。关联规则的发现算法有很多,如 Apriori、AprioriTid、DHP、FP-tree 等。 • 混合推荐引擎:结合以上各种,得到一个更加全面的推荐效果。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值