用户给商品打分,用户给商品打分

1. Alternating Least Square

ALS(Alternating Least
Square),交替最小二乘法。在机器学习中,特指使用最小二乘法的一种共同推荐算法。如下图所示,u表示用户,v表示商品,用户给商品打分,不过并不是每二个用户都会给每个商品打分。比如用户u6就从未给商品v3打分,必要大家想见出来,那就是机械学习的职分。

体育365网址 1

是因为并不是各种用户给各种商品都打了分,能够固然ALS矩阵是低秩的,即二个m*n的矩阵,是由m*k和k*n五个矩阵相乘获得的,当中k<<m,n。

Am×n=Um×k×Vk×n

那种假如是合情的,因为用户和货物都富含了部分低维度的藏身特征,比如大家只要理解有些人欣赏碳酸饮料,就能够推论出他喜爱百世可乐、Coca Cola、芬达,而不要求明显提出他喜好那三种饮品。那里的碳酸饮料就一定于一个隐蔽特征。上边的公式中,Um×k表示用户对逃匿特征的偏好,Vk×n表示产品含有隐藏特征的品位。机器学习的天职就是求出Um×k和Vk×n。可知uiTvj是用户i对货品j的偏好,使用Frobenius范数来量化重构U和V发生的误差。由于矩阵中诸多地点都以空手的,即用户并未对货品打分,对于那种意况大家就毫无总括未知元了,只计算观望到的(用户,商品)集合大切诺基。

体育365网址 2

那样就将一块推荐难点转换到了叁个优化难题。目的函数中U和V相互耦合,那就需求运用交替二乘算法。即先要是U的伊始值U(0),那样就将难点转化成了二个微细二乘难点,能够根据U(0)能够测算出V(0),再根据V(0)计算出U(1),那样迭代下去,直到迭代了一定的次数,也许没有截止。即使不能够确认保障没有的全局最优解,不过影响极小。

1. Alternating Least Square

ALS(Alternating Least
Square),交替最小二乘法。在机械学习中,特指使用最小二乘法的一种共同推荐算法。如下图所示,u表示用户,v表示商品,用户给商品打分,可是并不是每叁个用户都会给各类商品打分。比如用户u6就从未有过给商品v3打分,须要大家估量出来,那就是机械学习的任务。

体育365网址 3

由于并不是种种用户给各个商品都打了分,能够假诺ALS矩阵是低秩的,即一个m*n的矩阵,是由m*k和k*n四个矩阵相乘获得的,个中k<<m,n。

Am×n=Um×k×Vk×n

那种倘诺是在理的,因为用户和商品都含有了一部分低维度的隐蔽特征,比如大家假如知道某些人爱不释手碳酸饮料,就足以预计出她喜好百世可乐、Pepsi-Cola、芬达,而不须求显然提出他欣赏那三种饮品。那里的碳酸饮料就相当于3个潜伏特征。上边的公式中,Um×k表示用户对藏身特征的偏好,Vk×n表示产品含有隐藏特征的水准。机器学习的天职正是求出Um×k和Vk×n。可知uiTvj是用户i对货物j的偏好,使用Frobenius范数来量化重构U和V发生的误差。由于矩阵中广大地点都是空手的,即用户没有对货物打分,对于那种情状我们就不用总括未知元了,只总结观看到的(用户,商品)集合奥迪Q7。

体育365网址 4

这么就将一同推荐难点转换来了二个优化难题。指标函数中U和V相互耦合,那就须要运用交替二乘算法。即先借使U的伊始值U(0),那样就将难题转化成了三个微细二乘难题,能够依照U(0)能够总计出V(0),再根据V(0)计算出U(1),那样迭代下去,直到迭代了迟早的次数,或然消失截止。就算不可能保障没有的大局最优解,不过影响相当小。

首先局地 算法原理及推导

2. MLlib的ALS实现

MLlib的ALS选择了数码分区结构,即将U分解成u1,u2,u3,…um,V分解成v1,v2,v3,…vn,相关的u和v存放在同三个分区,从而减弱分区间数据调换的血本。比如通过U计算V时,存款和储蓄u的分区是P1,P2…,存款和储蓄v的分区是Q1,Q2…,要求将不相同的u发送给差别的Q,存放那几个关系的块称作OutBlock;在P中,总计v时须要什么样u,存放那一个关系的块称作InBlock。

比如R中有a12,a13,a15,u1存放在P1,v2,v3存放在Q2,v5存放在Q3,则须求将P1中的u1发送给Q2和Q3体育365网址,,那些新闻囤积在OutBlock;PRADO中有a12,a32,由此总计v2需要u1和u3,那个信息存款和储蓄在InBlock。

直接上代码:

import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating

/**
  * Created by Administrator on 2017/7/19.
  */
object ALSTest01 {

  def main(args:Array[String]) ={
    // 设置运行环境
    val conf = new SparkConf().setAppName("ALS 01")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 读取样本数据并解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/test.data")
    val ratingRDD = dataRDD.map(_.split(',') match {
      case Array(user, item, rate) =>
        Rating(user.toInt, item.toInt, rate.toDouble)
    })

    // 拆分成训练集和测试集
    val dataParts = ratingRDD.randomSplit(Array(0.8, 0.2))
    val trainingRDD = dataParts(0)
    val testRDD = dataParts(1)

    // 建立ALS交替最小二乘算法模型并训练
    val rank = 10
    val numIterations = 10
    val alsModel = ALS.train(trainingRDD, rank, numIterations, 0.01)

    // 预测
    val user_product = trainingRDD.map {
      case Rating(user, product, rate) =>
        (user, product)
    }
    val predictions =
      alsModel.predict(user_product).map {
        case Rating(user, product, rate) =>
          ((user, product), rate)
      }

    val ratesAndPredictions = trainingRDD.map {
      case Rating(user, product, rate) =>
        ((user, product), rate)
    }.join(predictions)

    val MSE = ratesAndPredictions.map {
      case ((user, product), (r1, r2)) =>
        val err = (r1 - r2)
        err * err
    }.mean()

    println("Mean Squared Error = " + MSE)

    println("User" + "\t" + "Products" + "\t" + "Rate" + "\t" + "Prediction")
    ratesAndPredictions.collect.foreach(
      rating => {
        println(rating._1._1 + "\t" + rating._1._2 + "\t" + rating._2._1 + "\t" + rating._2._2)
      }
    )

  }

}

当中ALS.train()函数的6个参数分别是磨炼用的数据集,特征数据,迭代次数,和正则因子。

运转结果:

体育365网址 5

足见,预测结果恐怕很是精确的。 

2. MLlib的ALS实现

MLlib的ALS选取了数额分区结构,即将U分解成u1,u2,u3,…um,V分解成v1,v2,v3,…vn,相关的u和v存放在同1个分区,从而减弱分区间数据交流的开销。比如通过U总计V时,存款和储蓄u的分区是P1,P2…,存储v的分区是Q1,Q2…,须要将不相同的u发送给分化的Q,存放那一个涉及的块称作OutBlock;在P中,总计v时需求什么样u,存放那个涉及的块称作InBlock。

比如R中有a12,a13,a15,u1存放在P1,v2,v3存放在Q2,v5存放在Q3,则必要将P1中的u1发送给Q2和Q3,那一个音信囤积在OutBlock;Tucson中有a12,a32,由此计算v2需要u1和u3,那个音讯囤积在InBlock。

一向上代码:

import org.apache.log4j.{ Level, Logger }
import org.apache.spark.{ SparkConf, SparkContext }
import org.apache.spark.mllib.recommendation.ALS
import org.apache.spark.mllib.recommendation.Rating

/**
  * Created by Administrator on 2017/7/19.
  */
object ALSTest01 {

  def main(args:Array[String]) ={
    // 设置运行环境
    val conf = new SparkConf().setAppName("ALS 01")
      .setMaster("spark://master:7077").setJars(Seq("E:\\Intellij\\Projects\\MachineLearning\\MachineLearning.jar"))
    val sc = new SparkContext(conf)
    Logger.getRootLogger.setLevel(Level.WARN)

    // 读取样本数据并解析
    val dataRDD = sc.textFile("hdfs://master:9000/ml/data/test.data")
    val ratingRDD = dataRDD.map(_.split(',') match {
      case Array(user, item, rate) =>
        Rating(user.toInt, item.toInt, rate.toDouble)
    })

    // 拆分成训练集和测试集
    val dataParts = ratingRDD.randomSplit(Array(0.8, 0.2))
    val trainingRDD = dataParts(0)
    val testRDD = dataParts(1)

    // 建立ALS交替最小二乘算法模型并训练
    val rank = 10
    val numIterations = 10
    val alsModel = ALS.train(trainingRDD, rank, numIterations, 0.01)

    // 预测
    val user_product = trainingRDD.map {
      case Rating(user, product, rate) =>
        (user, product)
    }
    val predictions =
      alsModel.predict(user_product).map {
        case Rating(user, product, rate) =>
          ((user, product), rate)
      }

    val ratesAndPredictions = trainingRDD.map {
      case Rating(user, product, rate) =>
        ((user, product), rate)
    }.join(predictions)

    val MSE = ratesAndPredictions.map {
      case ((user, product), (r1, r2)) =>
        val err = (r1 - r2)
        err * err
    }.mean()

    println("Mean Squared Error = " + MSE)

    println("User" + "\t" + "Products" + "\t" + "Rate" + "\t" + "Prediction")
    ratesAndPredictions.collect.foreach(
      rating => {
        println(rating._1._1 + "\t" + rating._1._2 + "\t" + rating._2._1 + "\t" + rating._2._2)
      }
    )

  }

}

当中ALS.train()函数的陆个参数分别是教练用的数据集,特征数据,迭代次数,和正则因子。

运作结果:

体育365网址 6

足见,预测结果依旧要命规范的。 

1.1 算法原理介绍

背景介绍:ALS是轮番最小二乘的简称,在机械学习上下文中,ALS特指使用交替最小二乘求解的贰个联袂过滤推荐算法。它通过观看到的持有用户给物品的打分,来揣测种种用户的喜好并向用户推荐适量的物料。

着力要是:打分矩阵是近似低秩的,也正是说几个mn阶的打分矩阵 卡宴mn
能够用多少个小矩阵Xkm和 Ykn的乘积来就好像,即:

体育365网址 7

56F7E703-B3F7-403E-818C-8CDAE9C8FAC3.png

其中 k << min(m, n)
假诺的客体:描述一个人的喜好普通是在两个虚幻的低维空间举行的,并不必要一一列出其具体喜好的东西,比如说一人欢娱悬疑类电影,重打击乐歌曲…..
为了找到使得矩阵X和Y的乘积尽大概地逼近CRUISER,选取最小化平方误差损失函数:

体育365网址 8

28FDFDB0-98A7-42C3-92DB-1ABA9031A7DA.png

其间,rui 代表第u个用户对第 i 个物品的评分,xu (k1阶)表示用户 u
的钟爱隐含特征向量 1<= u <= m,yi (k
1阶) 表示商品 i
的隐含特征向量 1<= i <= n,用户 u 对物品 i 的评分近似为:

体育365网址 9

3ABCE5FD-D3E3-47AE-B95A-85CE483F1F22.png

为了防备过拟合,参加正则化项:

体育365网址 10

E2A998D4-D1C5-465C-B48A-43E8A3B6D49F.png

迄今截止,协同过滤难题转化为1个优化难点,不过由于xu和yi耦合在联合,并不佳求解,故引用ALS:先固定Y,由上式求解X,然后再固定求得的X,求解Y,如此交替执行直到误差满足阈值条件大概到达迭代次数上限。

1.2 推导进度

演绎进度: 先随机生成Y,固定之,对损失函数L(X,
Y)在xu上求偏导,并令其导数=0:

体育365网址 11

75AB4903-CBCA-44E5-A261-D8D595BDD61F.png

同理,由对称性得:

体育365网址 12

4A411DEA-B20E-4F7B-8C47-BFF312455F9B.png

1.3 隐式反馈

如上针对显式反馈,对于隐式反馈的事态,损失函数如下:

体育365网址 13

A208062F-CD5E-4824-8237-2B9E60F5EB8C.png

体育365网址 14

D8126DCA-C623-4CB2-9376-26760993AA57.png

中间rui表示动作的成效,比如购置、加购物车、收藏、点击的次数,或许看到/收听录制/音频的时间长度等等,α是置信度全面,cui代表信任度,根据那种措施,大家存在最小限度的信任度,并且随着我们着眼到的正偏向的证据更加多,信任度也会进一步大。
演绎进度看似显式反馈的公式推导,结果如下:

体育365网址 15

74A84B02-8F13-4897-9FC6-FE16213DB085.png

1.4 伪代码

1.4 伪代码
评分矩阵LX570(mn),最大迭代次数K,均方根误差阈值a,正则化周到lambda
轻易初步化X(k
m), Y(kn), i = 0
While i < K and delta>=a
#计量每四个用户的涵盖特征向量
for u = 1,2…….m do
#算算中间结果矩阵tmp01
tmp01 = Y
Y.T + lambdaE
#对中级结果矩阵tmp01求逆
tmp02 = tmp01.I
*
#估测计算中间结果矩阵tmp03
tmp03 = tmp02Y
#计量用户 u 的包括特征向量, Ru为用户对各样物品的 n 维评分向量
xu = tmp03
Ru
end for
#更新用户隐含特征向量
X(km) = (x1,x2,…..xm)
#测算每3个物品的盈盈特征向量
for j = 1,2…….n do
#总结中间结果矩阵tmp01
tmp01 = X
X.T + lambdaE
#对中等结果矩阵tmp01求逆
tmp02 = tmp01.I
*
#算算中间结果矩阵tmp03
tmp03 = tmp02X
#测算物品 j 的涵盖特征向量,智跑j为全数用户对该物品的 m 维评分向量
yj = tmp03
Rj
end for
#革新物品隐含特征向量
Y(kn) = (y1,y2,…..yn)
#迭代次数 +1
i = i + 1
#总结本次迭代现在实际评分矩阵与X
Y的接近评分矩阵之间的均方根误差
sum = 0
for p =1,2…..m
for q = 1,2,…..n
tmp = Rpq – Xp.TYq
sum = sum + tmp
tmp
delta = sqrt(sum/m*n)
Return X, Y

1.5 预测验评定分

透过1.3的伪代码达成之后收获Xkm和 Ykn

若预测全数用户对拥有物品的评分,即:Predict_All = X(km).T \ Y(k*n)

若预测某一用户 i 对负有物品的评分,即:Predict_User = X(ki).T \
Y(k*n)

若预测全体用户对某一物品 j 的评分,即:Predict_User = X(km).T \
Y(k*j)

若预测某一用户 i 对某一物料 j 的评分,即:Predict_User = X(ki).T \
Y(k*j)

其次部分 斯Parker达成

2.1 落成关键点

SparkMLlib完毕ALS的关键点:通过合理的分区设计和索罗德DD缓存来压缩节点间的数据调换

率先,斯Parker会将种种用户的评分数据 u 和每一种物品的评分数据 v
依照一定的分区策略分区存款和储蓄,如下图:u1和u2在P1分区,u3在P2分区,v1和v2在Q1分区。

体育365网址 16

7A4336A0-383E-4E2C-BB33-E291DC493161.png

ALS求解进程中,如通过U求V,在每2个分区中 u 和 v
通过客观的分区设计使得在同2个分区中总括进度可以在分区内举办,无需从另外节点传输数据,生成那种分区结构分两步:

先是步、在P1少将每一个U发送给要求它的Q,
将那种涉及存款和储蓄在该块中,称作OutBlock

其次步、在Q第11中学必要掌握每贰个V和怎么U有关联及其对应的打分,这一部分数目不仅含有原始打分数据,还富含从各样用户分区收到的向量排序音信,称作InBlock。

由此,从U求解V,大家须求经过用户的OutBlock新闻把用户向量发送给物品分区,然后通过物品的InBlock音讯构建最小二乘难点并求解。同理,从V求解U,我们须要物品的OutBlock信息和用户的InBlock新闻。

对此OutBlock和InBlock只需扫描3次建立好音讯并缓存,在之后的迭代总括进度中能够直接计算,大大减少了节点之间的多少传输。

2.3 斯Parker完结与1.4 伪代码区别

1.4
中的伪代码达成属于单机简化达成,在斯Parker的MLlib中落实的分布式并行版本所做的要害调整和进度如下:

① 、将数据分为若干个区,每一种分区都只含有用户和物品的一有的数据块,通过分区实现相互之间更新用户还是物品的每一个隐含特征向量

二 、在每一个分区中更新隐含特征向量时供给营造最小二乘法的两某个音讯,一部分是用户/物品特征矩阵,一部分是用户/物品评分向量;第一局地新闻透过2.第11中学牵线的贯彻关键点营造用户/物品的InBlock和OutBlock新闻获得。

叁 、在每一步迭代进程中,每二个分区都会盘算所在分区的用户照旧物品物品特征向量,然后去革新对应用户照旧物品的特征向量,从而达成相互之间。

相关文章