参考资料

【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. python发送手机动态验证码

    一.准备短信发送平台 首先进入http://user.ihuyi.com/nav/sms.html互亿天线,并且注册,进入首页 注册后会免费送50条消息 注册完后进入验证码通知短信,复制自己的api接 ...

  2. 解决centos7 python3 上下左右变ABCD

    首先:rpm -qa | grep readline //查看有没有安装readline-devel(出现标题的问题就是因为没有安装readline-devel包) 其次:使用yum search r ...

  3. java Queue中 add/offer,element/peek,remove/poll区别

    转自https://blog.csdn.net/u012050154/article/details/60572567 java Queue中 add/offer,element/peek,remov ...

  4. util.go 源码阅读

        }     h := md5.New()     baseString, _ := json.Marshal(obj)     h.Write([]byte(baseString))      ...

  5. C#多线程中的异常处理

    常规Thread中处理异常 使用Thread创建的子线程,需要在委托中捕捉,无法在上下文线程中捕捉 static void Main(string[] args) { ThreadStart thre ...

  6. EffictiveC++笔记 第1章

    Chapter 一: 条款 1 :视 C++为一个语言联邦 (P41 ) c++其实可以视为有四个部分: C Object-Oriented C++ Template C++ STL 条款 2:尽量以 ...

  7. hystrix基本配置项(2)

    ①配置HystrixCommand HystxixCommand支持如下的配置: GroupKey:该命令属于哪一个组,可以帮助我们更好的组织命令. CommandKey:该命令的名称 ThreadP ...

  8. ie兼容问题记录

    工作中遇到的ie网站兼容性问题  头疼.......... 以下为从网上搜索学习的整理兼容性方法 用于自己记录 #兼容问题 ##css hack: https://blog.csdn.net/fres ...

  9. ASP.NET Core 借助 K8S 玩转容器编排

    Production-Grade Container Orchestration - Automated container deployment, scaling, and management. ...

  10. subprocess实时获取结果和捕获错误

    需要调用命令行来执行某些命令,主要是用 subprocess 实时获取结果和捕获错误,发现subprocess的很多坑. subprocess 普通获取结果方式,其需要命令完全执行才能返回结果: im ...