参考资料

【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的更多相关文章

  1. 吴裕雄--天生自然HADOOP操作实验学习笔记:协同过滤算法

    实验目的 初步认识推荐系统 学会用mapreduce实现复杂的算法 学会系统过滤算法的基本步骤 实验原理 前面我们说过了qq的好友推荐,其实推荐算法是所有机器学习算法中最重要.最基础.最复杂的算法,一 ...

  2. 吴恩达机器学习笔记58-协同过滤算法(Collaborative Filtering Algorithm)

    在之前的基于内容的推荐系统中,对于每一部电影,我们都掌握了可用的特征,使用这些特征训练出了每一个用户的参数.相反地,如果我们拥有用户的参数,我们可以学习得出电影的特征. 但是如果我们既没有用户的参数, ...

  3. Spark机器学习(11):协同过滤算法

    协同过滤(Collaborative Filtering,CF)算法是一种常用的推荐算法,它的思想就是找出相似的用户或产品,向用户推荐相似的物品,或者把物品推荐给相似的用户.怎样评价用户对商品的偏好? ...

  4. 机器学习(十三)——机器学习中的矩阵方法(3)病态矩阵、协同过滤的ALS算法(1)

    http://antkillerfarm.github.io/ 向量的范数(续) 范数可用符号∥x∥λ表示. 经常使用的有: ∥x∥1=|x1|+⋯+|xn| ∥x∥2=x21+⋯+x2n−−−−−− ...

  5. Spark机器学习之协同过滤算法

    Spark机器学习之协同过滤算法 一).协同过滤 1.1 概念 协同过滤是一种借助"集体计算"的途径.它利用大量已有的用户偏好来估计用户对其未接触过的物品的喜好程度.其内在思想是相 ...

  6. spark机器学习从0到1协同过滤算法 (九)

      一.概念 协同过滤算法主要分为基于用户的协同过滤算法和基于项目的协同过滤算法.   基于用户的协同过滤算法和基于项目的协同过滤算法 1.1.以用户为基础(User-based)的协同过滤 用相似统 ...

  7. 机器学习 | 简介推荐场景中的协同过滤算法,以及SVD的使用

    本文始发于个人公众号:TechFlow,原创不易,求个关注 今天是机器学习专题的第29篇文章,我们来聊聊SVD在上古时期的推荐场景当中的应用. 推荐的背后逻辑 有没有思考过一个问题,当我们在淘宝或者是 ...

  8. Collaborative Filtering(协同过滤)算法详解

    基本思想 基于用户的协同过滤算法是通过用户的历史行为数据发现用户对商品或内容的喜欢(如商品购买,收藏,内容评论或分享),并对这些喜好进行度量和打分.根据不同用户对相同商品或内容的态度和偏好程度计算用户 ...

  9. 原创:协同过滤之ALS

    推荐系统的算法,在上个世纪90年代成型,最早应用于UserCF,基于用户的协同过滤算法,标志着推荐系统的形成.首先,要明白以下几个理论:①长尾理论②评判推荐系统的指标.之所以需要推荐系统,是要挖掘冷门 ...

随机推荐

  1. Linux时间子系统之四:Timer在用户和内核空间流程

    用户空间应用中创建一个Timer(alarm/setitimer/POSIX Timer等等),然后程序继续执行: 内核进入创建/设置Timer系统调用,开始计时,在超时后通过何种方式通知用户空间: ...

  2. YII框架组件CListView实现分页

    效果是普通分页就不截图了... C控制器方法如下: $criteria=new CDbCriteria; $criteria->condition = "`status`={$newS ...

  3. Mybatis通过注解方式实现批量插入数据库 及 常见的坑

    原文地址:http://f0rb.iteye.com/blog/1207384 MyBatis中通过xml文件配置数据库批量操作的文章很多,比如这篇http://www.cnblogs.com/xcc ...

  4. springmvc配置详解 教程

    https://www.cnblogs.com/sunniest/p/4555801.html

  5. selenium相关技术研究(从1.0-3.0)

    注: 以下内容引自http://www.cnblogs.com/hhudaqiang/p/6550135.html Selenium相关技术研究(从1.0-3.0) 好吧,最近看wxpython有点多 ...

  6. CSS3实现轴心为x轴的3D数字圆环

    当做混合开发时,总有各种意想不到的酷炫效果的需求等着你.不过这个还好,先备着方便以后用. 先上效果图: 总结一下:此效果的完成基于以下几个关键点: 1.DOM结构,为每个DIV设置旋转后,一次也会影响 ...

  7. Go-技篇第一 技巧杂烩

    Go-技篇第一 技巧杂烩 一句话技巧 把你面向对象的大脑扔到家里吧,去拥抱接口.@mikegehard 学习如何使用Go的方式做事,不要把别的的编程风格强行用在Go里面.@DrNic 多用接口总比少用 ...

  8. Docker 新手入门

    简介 如果您是 Docker 新手请您花大约三十分钟的时间来了解 Docker 相关的知识和内容. Docker 与 Linux 息息相关,因此在阅读本文档之前请您确保以下条件: 对 Linux 的命 ...

  9. kv_storage.go

    package storage //kv 存储引擎实现 import (     "github.com/cznic/kv"     "io" ) //kv 存 ...

  10. nsqlookup_protocol_v1.go

    , atomic.LoadInt64(&client.peerInfo.lastUpdate))         now := time.Now()         p.ctx.nsqlook ...