spark机器学习(10):als交替最小二乘算法

代码空间 代码空间     2022-09-09     242

关键词:

1. Alternating Least Square

ALS(Alternating Least Square),交替最小二乘法。在机器学习中,特指使用最小二乘法的一种协同推荐算法。如下图所示,u表示用户,v表示商品,用户给商品打分,但是并不是每一个用户都会给每一种商品打分。比如用户u6就没有给商品v3打分,需要我们推断出来,这就是机器学习的任务。

由于并不是每个用户给每种商品都打了分,可以假设ALS矩阵是低秩的,即一个m*n的矩阵,是由m*k和k*n两个矩阵相乘得到的,其中k<<m,n。

Am×n=Um×k×Vk×n

这种假设是合理的,因为用户和商品都包含了一些低维度的隐藏特征,比如我们只要知道某个人喜欢碳酸饮料,就可以推断出他喜欢百世可乐、可口可乐、芬达,而不需要明确指出他喜欢这三种饮料。这里的碳酸饮料就相当于一个隐藏特征。上面的公式中,Um×k表示用户对隐藏特征的偏好,Vk×n表示产品包含隐藏特征的程度。机器学习的任务就是求出Um×k和Vk×n。可知uiTvj是用户i对商品j的偏好,使用Frobenius范数来量化重构U和V产生的误差。由于矩阵中很多地方都是空白的,即用户没有对商品打分,对于这种情况我们就不用计算未知元了,只计算观察到的(用户,商品)集合R。

这样就将协同推荐问题转换成了一个优化问题。目标函数中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,这个信息存储在OutBlock;R中有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()函数的4个参数分别是训练用的数据集,特征数量,迭代次数,和正则因子。

运行结果:

可见,预测结果还是非常准确的。 

机器学习算法--als(代码片段)

...是交替最小二乘(alternatingleastsquares)的简称。在机器学习中,ALS特指使用交替最小二乘求解的一个协同推荐算法。它通过观察到的所有用户给商品的打分,来推断每个用户的喜好并向用户推荐适合的商品。举个... 查看详情

spark实战(代码片段)

ALS是交替最小二乘法ALS是交替最小二乘的简称。在SparkMLlib中特指通过交替最小二乘法求解的协同推荐算法。它通过观察所有用户给产品打分,来推断每个用户的喜好并向用户推荐适合的产品。用户评分矩阵的每行代表一个用... 查看详情

spark实战(代码片段)

ALS是交替最小二乘法ALS是交替最小二乘的简称。在SparkMLlib中特指通过交替最小二乘法求解的协同推荐算法。它通过观察所有用户给产品打分,来推断每个用户的喜好并向用户推荐适合的产品。用户评分矩阵的每行代表一个用... 查看详情

推荐算法协同过滤算法代码(pyspark|als)(代码片段)

...算法的代码实现。下面我就开始介绍用pyspark中的ALS(交替最小二乘矩阵分解)来实现协同过滤代码。一、ALS的简单介绍ALS算法是2008年以来,用的比较多的协同过滤算法。它已经集成到Spark的Mllib库中&#x 查看详情

协同过滤算法案例

...组。       ALS:ALS提供了求解带偏置矩阵分解的交替最小二乘算法       MatrixFactorizationModel:ALS求解矩阵分解返回的结果类型       作为训练结果的MatrixFactorizationModel中提供了许多推荐操作。          val... 查看详情

spark2.x机器学习视频教程

Spark2.x机器学习视频教程讲师:轩宇老师链接:https://pan.baidu.com/s/1TcFl6KDjxJS597TxYFSCOA密码:3t2z本课程讲解Spark在机器学习中的应用,并介绍如何从各种公开渠道获取用于机器学习系统的数据。内容涵盖推荐系统、回归、聚类、分类等... 查看详情

机器学习模型和算法(代码片段)

文章目录python简介python基本语法监督学习--回归模型线性回归模型一元线性回归线性回归最小二乘代码实现多元线性回归梯度下降法和最小二乘法相比线性回归梯度下降代码实现非线性回归python简介略python基本语法文件开头加上#... 查看详情

机器学习中的矩阵方法01:线性系统和最小二乘

---恢复内容开始---机器学习中的矩阵方法01:线性系统和最小二乘 说明:MatrixMethodsinDataMiningandPatternRecognition读书笔记非常nice矩阵在线计算器,网址:http://www.bluebit.gr/matrix-calculator/. 1.LUDecomposition假设现在要解一个线性系... 查看详情

机器学习中的矩阵方法01:线性系统和最小二乘

机器学习中的矩阵方法01:线性系统和最小二乘 说明:MatrixMethodsinDataMiningandPatternRecognition读书笔记非常nice矩阵在线计算器,网址:http://www.bluebit.gr/matrix-calculator/. 1.LUDecomposition假设现在要解一个线性系统:Ax=b,其中A是n... 查看详情

推荐系统中矩阵分解算法-funksvd和als

...的值。(其预测的是第u个用户对第i个商品的评分)其通过机器学习最小化损失函数来得到矩阵,其学习方式有两种,一种是随机梯度下降,一种是交替最小二乘。第一种不说,随处可见。第二种是通过该式子实现的。我们先随机... 查看详情

Apache Spark:多机器学习算法的并行化

】ApacheSpark:多机器学习算法的并行化【英文标题】:ApacheSpark:ParallelizationofMultipleMachineLearningALgorithm【发布时间】:2017-09-0321:54:56【问题描述】:有没有办法在Spark中并行化多个ML算法。我的用例是这样的:A)并行运行多种机器学... 查看详情

spark学习10_1sparkmllib入门与相关资料索引(代码片段)

...eans聚类算法SVM算法其他算法实例的文件目录位置资料Spark机器学习库(MLlib)中文指南关于spark机器学习的知乎专栏Spark入门实战系列--8.SparkMLlib(上)--机器学习及SparkMLlib简介基本Kmeans算法介绍及其实现sparkMLlib概念1:相关系数... 查看详情

机器学习中常见的优化算法

   在机器学习中,有很多的问题并没有解析形式的解,或者有解析形式的解但是计算量很大(譬如,超定问题的最小二乘解),对于此类问题,通常我们会选择采用一种迭代的优化方式进行求解。??这些常用的优化算法包... 查看详情

spark机器学习:保序回归算法

保序回归即给定了一个无序的数字序列,通过修改其中元素的值,得到一个非递减的数字序列,要求是使得误差(预测值和实际值差的平方)最小。比如在动物身上实验某种药物,使用了不同的剂量,按理说剂量越大,有效的比... 查看详情

机器学习具体解释线性回归梯度下降最小二乘的几何和概率解释

线性回归即线性拟合,给定N个样本数据(x1,y1),(x2,y2)....(xN,yN)(x_1,y_1),(x_2,y_2)....(x_N,y_N)当中xix_i为输入向量,yiy_i表示目标值,即想要预測的值。採用曲线拟合方式,找到最佳的函数曲线来逼近原始数据。通过使得代价函数最... 查看详情

机器学习中的优化算法!

...干货 作者:李祖贤,Datawhale高校群成员,深圳大学在机器学习中,有很多的问题并没有解析形式的解,或者有解析形式的解但是计算量很大(譬如,超定问题的最小二乘解),对于此类问题,通常我们会选择采用一种迭代的... 查看详情

斯坦福机器学习课程笔记

...模拟)---策略(风险函数)--算法(最优化方法)第一节:机器学习的基本概念和分类第二节:线性回归,最小二乘批梯度下降(bgd)和随机梯度下降(sgd)第三节:过拟合,欠拟合非参数学习算法:局部加权回归概率角度解释线性回归... 查看详情

目前最流行的机器学习算法是啥

毫无疑问,机器学习在过去几年越来越受欢迎。由于大数据是目前技术行业最热门的趋势,机器学习是非常强大的,可以根据大量数据进行预测或计算推理。如果你想学习机器算法,要从何下手呢?监督学习1.决策树:决策树是... 查看详情