【机器学习笔记一】协同过滤算法 - ALS
参考资料
【1】《Spark MLlib 机器学习实践》
【2】http://blog.csdn.net/u011239443/article/details/51752904
【3】线性代数-同济大学
【4】基于矩阵分解的协同过滤算法 https://wenku.baidu.com/view/617482a8f8c75fbfc77db2aa.html
【5】机器学习的正则化 http://www.cnblogs.com/jianxinzhou/p/4083921.html
【6】正则化方法 http://blog.csdn.net/u012162613/article/details/44261657
1、协同过滤算法概念
协同过滤算法是一种基于群体用户或者物品的典型的推荐算法。考虑的推荐思路基于两类:
1)、基于用户的推荐:认为类似的用户应具备类似的爱好
2)、基于物品的推荐:认为用户会选择比较接近的物品
两类思路也存在相应的局限性:
1)、基于用户的推荐,无法准确找到物品热点,因此经常只反馈常用物品;
2)、基于物品的推荐,会导致返回相似物品,但用户往往不会购买已经选择过的类似商品;
2、相似度计算
假设存在用户和物品的评价矩阵如下:

1)、基于欧几里得距离的相似度计算
,以此公式可知用户1和用户2的相似度为:
2)、基于余弦角度的相似度计算
,以此公式可知用户1和用户2的相似度为:
备注:2)相当于把欧几里得中的坐标点转换为向量,求向量的夹角
3、ALS(交替最小二乘法)的一些数学知识备注
1)可逆矩阵
对于矩阵
,有矩阵
,有
。
备注:已知对矩阵A实施一次初等行变换,相当于在矩阵的坐标乘以一个矩阵;对矩阵A实施一次初等列变换相当于在矩阵的右边乘以一个矩阵。
2)特征值
有矩阵
,可计算该矩阵存在特征值3和5,分别对应特征向量
和
。
特征值的几何意义在于该矩阵B乘以一个向量,相当于将这个向量在特征向量方向上做了一个特征值的拉升,其他都是旋转操作。
在上面的例子中,若给出向量(1,1)则被B左乘后拉升到了(3,3)。由于5这个特征值,特征向量是0,因此无法给出拉升的效果。
3)特征分解
对于可对角矩阵可以将矩阵分解称特征值和特征向量的乘积。即
,其中
4)奇异值分解
对于大部分矩阵来说,特别是非方阵,无法进行特征分解,此时我们采用奇异值分解的方法。
,同时用前r大的奇异值来近似描述矩阵,因为奇异值递减的非常快,通常前1%~10%奇异值能够占到全部奇异值之和的99%,这也是协同过滤算法的数据基础。
4、ALS(交替最小二乘法)算法流程
在实际协同过滤算法中,并没有直接用奇异值分解,而是用ALS算法直接用低秩矩阵来逼近。
当采用X来逼近矩阵R时,有Frobenius损失函数:
,并增加正则化项
算法流程如下:
1、先固定矩阵U为全零
2、对L(U,V)求V的偏导,使其偏导数全为0,
,得出所有的v向量
3、固定v向量,转而求u,同样使偏导数全为0,有公式
,得到所有的u向量
4、重复步骤2,3,直到损失函数达到目标值。
4、ALS(交替最小二乘法)在Spark上的例子
package com.fredric.spark.als;
import org.apache.spark.mllib.recommendation.{Rating, ALS}
import org.apache.spark.{SparkContext, SparkConf}
/*-
* 协同过滤算法(ALS)
* 针对笔记《Spark-协同过滤算法-ALS》
* Fredric 2017
*/
object als {
def main(args:Array[String]): Unit ={
val conf = new SparkConf().setMaster("local").setAppName("als")
val sc = new SparkContext(conf)
val Array = new Array[Rating](5)
//new Rating(user: Int, product: Int, rating: Double)
Array(0) = new Rating(1,1,0.4)
Array(1) = new Rating(1,4,0.5)
Array(2) = new Rating(2,2,0.7)
Array(3) = new Rating(2,3,0.8)
Array(4) = new Rating(3,1,0.9)
Array(4) = new Rating(3,3,0.9)
val data = sc.makeRDD(Array)
val rank = 2 //隐语义因子的个数。
val numIterations = 5
val lambda = 0.01 //是ALS的正则化参数。
val model = ALS.train(data, rank, numIterations, lambda)
//为用户1推荐4款产品
val rs = model.recommendProducts(1, 4)
/*
输入如下:由于用户1与用户3共同爱好了产品1,因此用户3偏好的产品3也被推荐
Rating(1,4,0.4814649456978035)
Rating(1,3,0.3956308705617122)
Rating(1,1,0.38517196440752066)
Rating(1,2,0.21108557718205034)*/
rs.foreach(println)
}
}
【机器学习笔记一】协同过滤算法 - ALS的更多相关文章
- 吴裕雄--天生自然HADOOP操作实验学习笔记:协同过滤算法
实验目的 初步认识推荐系统 学会用mapreduce实现复杂的算法 学会系统过滤算法的基本步骤 实验原理 前面我们说过了qq的好友推荐,其实推荐算法是所有机器学习算法中最重要.最基础.最复杂的算法,一 ...
- 吴恩达机器学习笔记58-协同过滤算法(Collaborative Filtering Algorithm)
在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数.相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征. 但是如果我们既没有用户的参数, ...
- Spark机器学习(11):协同过滤算法
协同过滤(Collaborative Filtering,CF)算法是一种常用的推荐算法,它的思想就是找出相似的用户或产品,向用户推荐相似的物品,或者把物品推荐给相似的用户.怎样评价用户对商品的偏好? ...
- 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)
http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...
- Spark机器学习之协同过滤算法
Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...
- spark机器学习从0到1协同过滤算法 (九)
一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法. 基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...
- 机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用
本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用. 推荐的背后逻辑 有没有思考过一个问题,当我们在淘宝或者是 ...
- Collaborative Filtering(协同过滤)算法详解
基本思想 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分.根据不同用户对相同商品或内容的态度和偏好程度计算用户 ...
- 原创:协同过滤之ALS
推荐系统的算法,在上个世纪90年代成型,最早应用于UserCF,基于用户的协同过滤算法,标志着推荐系统的形成.首先,要明白以下几个理论:①长尾理论②评判推荐系统的指标.之所以需要推荐系统,是要挖掘冷门 ...
随机推荐
- SSM-MyBatis-12:Mybatis中添加单个对象返回主键id列
------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥------------- 实体类 public class Book { private Integer bookID; private ...
- js判断浏览器是否支持flash的方法
传统浏览器可以使用window.ActiveXObject检查浏览器是否启用相关的控件.检查浏览器是否启用flash控件,需要先检查浏览器是否支持ActiveXObject,可以使用typeof检查w ...
- Activity的运行过程
今天看到了这个关于Activity的过程这个方面的知识,之前我其实也是做过安卓项目的,也是有安卓开发的一定经验的,但是我发现之前似乎是知其然,而不知其所以然,之前来说只知道activity里的onCr ...
- 关于二叉查找树的一些事儿(bst详解,平衡树入门)
最近刚学了平衡树,然后突发奇想写几篇博客纪念一下,可能由于是刚学的缘故,还有点儿生疏,望大家海涵 说到平衡树,就不得不从基础说起,而基础,正是二叉查找树 什么是二叉查找树?? 大家观察一下下面的这棵二 ...
- 任务调度--使用java.util.Timer实现
任务调度是指基于给定时间点,给定时间间隔或者给定执行次数自动执行任务. 举个例子,比如说我们希望一个系统每周日晚上9点都将数据库文件备份一次,这时我们就可以使用任务调度来实现.为了更加的方便,我们需要 ...
- Android 不规则图像填充 小玩着色游戏
转载请标明出处: http://blog.csdn.net/lmj623565791/article/details/45788433: 本文出自:[张鸿洋的博客] 一.概述 近期群里偶然看到一哥们在 ...
- 吐槽一下--最近多次在腾讯以及万科的面试经历---Web前端与PHP后端开发
前端时间,由于职业发展等,想要换一份工作,于是投递了一些国内还算知名的公司,列如: 腾讯.万科之类的: (1)首先说一下这两家公司的反馈情况: 腾讯:投递到反馈,(初次人事打电话沟通)大约1周,三次不 ...
- memcache 和 redis 之间的区别
结论 应该说Memcached和Redis都能很好的满足解决我们的问题,它们性能都很高,总的来说,可以把Redis理解为是对Memcached的拓展,是更加重量级的实现,提供了更多更强大的功能.具体来 ...
- Python xml处理模块
---恢复内容开始--- xml 通过< >节点来区别数据结构 ---恢复内容结束--- xml 通过< >节点来区别数据结构 <xml version='1.0'> ...
- java.lang.IllegalArgumentException异常 配置文件的问题
java.lang.IllegalArgumentException: org.hibernate.hql.internal.ast.QuerySyntaxException: Student is ...