• 基于内容的推荐 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、执行结果:
    这里写图片描写叙述

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

  • 相关阅读:
    Vue数据绑定和响应式原理
    JavaScript实现MVVM之我就是想监测一个普通对象的变化
    缓存的理解
    理解promise 02
    线段与线段的交点
    线段与线段交点的推导公式
    promise你懂了吗?
    wx import require的理解
    webgl example1
    sublime2常用插件
  • 原文地址:https://www.cnblogs.com/mthoutai/p/7364348.html
Copyright © 2020-2023  润新知