推荐系统

来自ng ml-003 的16_XVI._Recommender_Systems 还有17 和18 ng的ml-003就能够看完了。

推荐系统,常见于广告推送,比如亚马逊或者京东,等你购买东西之后他就会知道你喜欢什么。

一、推荐系统


假设一个电影评价系统,等级有5个星星,其中现在有4个评价者,在5部电影进行评价,r(I,j)表示某个人是否对某个电影进行评价。而y(I,j)就是评价的等级。

通过对某个人没有看过的电影中向这个人推荐电影。


这里是基于内容的推荐系统,假设的例子还是前面的额电影例子,对于每个电影来说,有两个特征:romance(爱情片)和acition(动作片)(这里虽然是特征,但可以看成是对电影不同程度的标签,回归),通过左边的几个不同的电影来对这两个特征进行不同程度的赋值,比如第四部电影,那么这和特征来说更像是动作片,而不是爱情片。

这里通过引入x_0=1来将本来2维的特征扩展到三维,然后通过简单的theta T*x的模型来做预测,,这里假设用户1 对第三个电影的想看程度是4.95.


这里就是上面的一个标准化处理方式,在上图最后写出了这个模型的目标函数,如果可以还加上正则化项,在这里面要注意目标函数第一项中的求和下面的那个,是个求真函数,只有当r(I,j)=1的时候才取j的值,不然就是跳过,这个在ufldl和ng在08年的教学视频中都有提及,这里正则化项是从1开始的,因为x_0 =1是常数项,(通常这一项都是省略的),因为对于目标函数来说,缩放 所得到的最后结果是不变的,所以目标函数中前后两项的1/m可以划掉,1/2不能,是因为留着后面求导用的


上图中上半部分是对单个的用户来说的,下面是扩展到所有的用户的目标函数。这其中发现是对应于一个用户有一个模型,也就是说不同的用户虽然使用的是线性回归,但是参数集确是自己的。


上图就是如何使用梯度下降法来更新参数了,这其实和线性回归差不多,而且注意k等于0说的是第一个参数 因为我们直接赋值为1的, 在nn中这个叫做偏置部分,上图中 对于偏置是不进行正则化项的,和上上图一样,但是却需要类似于nn的权值更新。值得注意

二、协同过滤


因为没人会给出一个很好的电影的特征,这个电影多少爱情成分,多少动作成分,而且代价太大,通过换个方法,对于不同的参数,即不同的用户来说,让他们给出自己的喜好,这个不难,比如用户1 所对应的参数就是偏爱爱情片5  不喜欢动作片0,后面三个用户以此类推。


、这里是通过用户给定的参数来逆推电影的特征,比如第一个电影,因为前两个用户给了5分,而且这两个用户超喜欢爱情片,所以这个电影的爱情特征就是1,相反的动作特征就是0.



上图就是通过知道参数的情况下来得到特征的目标函数,和之前的目标函数是一样的。


这就是协同算法(和em算没法好像),通过先瞎猜theta 来估计特征 x,然后通过特征x来重新训练theta,以此进行直到差不多收敛。


上面的就是先通过给定特征来按照目标函数进行估计参数theta。然后第二个就是通过给定的theta来按照目标函数估计特征x。前面估计不同的参数的时候第一项是一样的,但是正则化项是不同的,但是最下面的第三个是通过同时对两个进行目标函数建立,将两个正则化项放到一起。而且前面第一项的下标要注意下。前两个是交替的学习theta 和特征x,第三个是同时进行学习,这里为什么大家遵循这个不学习x_0=1的特征,因为之前说了不学习theta0 所以第三项也是从x_1开始的,而每次都忽略theta 0是因为:Finally one last detail is that when we're learning the features this way. Previously we have been using this convention that we have a feature x0 equals one that corresponds to an interceptor. When we are using this sort of formalism where we're are actually learning the features, we are actually going to do away with this convention. And so the features we are going to learn x, will be in Rn. Whereas previously we had features x and Rn + 1 including the intercept term. By getting rid of x0 we now just have x in Rn.
And so similarly, because the parameters theta is in the same dimension, we now also have theta in RN because if there's no x0, then there's no need parameter theta 0 as well. And the reason we do away with this convention is because we're now learning all the features, right? So there is no need to  hard code the feature that is always equal to one. Because if the algorithm really wants a feature that is always equal to 1, it can choose to learn one for itself. So if the algorithm chooses, it can set the feature X1 equals 1.So there's no need to hard code the feature of 001, the algorithm now has the flexibility to just learn it by itself. So, putting everything together, here is our collaborative filtering algorithm.


上图就是具体的过程,通过训练好theta 和特征x ,就可以进行预测并知道用户j 对电影 I 的评价了。

三、低秩矩阵因式分解

通过用户购买的一个产品的信息,来推荐所有相似的产品给用户


通过上一节中获得的数据进行组成个矩阵。


上面就是将用户对电影的评价矩阵给分解成用户theta矩阵和电影特征矩阵x的乘积形式。


通过计算不同电影之间的2-范数,找到和所需要找的目标电影差距最小的电影来作为相似电影推荐。

四、均值标准化


对于使用协同算法进行计算的时候,对于上图中新增加的成员5,他没有参与任何的电影评价,没法进行训练,目标函数第一项来说,因为r(i,5)=0,所以第一项完全跳过,对于参数theta来说,都是0,所以开始的预测值都是0.但是这没啥帮助,因为很多人钟爱第一部电影,那或多或少推荐第五个人他是不是也喜欢第一部电影来的好。


其实ng说的均值标准化,就是如上图的将之前评分过的分数进行求均值,然后赋值给没评分的,这个方法先不说更新数据量大,和在线学习差不多,而且感觉精度好差,觉得也就是理解原理吧,在实际的系统上就是让人知道现在大众对这个的评价,感觉不好。







原文地址:https://www.cnblogs.com/shouhuxianjian/p/4529212.html