sparkml(sparkmllib)
本篇文章给大家谈谈sparkml,以及sparkmllib对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。
本文目录一览:
- 1、spark机器学习-聚类
- 2、spark mllib 和sklearn keras比较,哪个是机器学习未来的主流
- 3、Mahout和Spark ML是什么关系
- 4、推荐系统中矩阵分解算法-funkSVD和ALS
- 5、如何解释spark mllib中ALS算法的原理
spark机器学习-聚类
spark机器学习-聚类
聚类算法是一种无监督学习任务,用于将对象分到具有高度相似性的聚类中,聚类算法的思想简单的说就是物以类聚的思数搜穗想,相同性质的点在空间中表现的较为紧密和接近,主要用于数据探索与异常检测,最常用的一种聚类算法是K均值(K-means)聚类算法
算法原理
kmeans的计算方法如下:
1 选取k个中心点
2 遍历所有数据,将每个数据划分到最近的中心点中
3 计算每个聚类的平均值,并作为新的中心点
4 重复2-3,直到这k个中线点不再变化(收敛了),或执行了足够多的迭代
算法的时间复杂度上界为O(n*k*t), 其中k为输入的聚类个数,n为数据量,t为迭代次数。一般t,k,n均可认为是常量,时间和空间复杂度可以简化为O(n),即线性的
spark ml编码实践
可在spark-shell环境下修改参数调试以下代码,可以用实际的业务数据做测试评估,业务数据一般是多列,可以把维度列用VectorAssembler组装成向量列做为Kmeans算法的输入列,考虑现实的应用场景,比如做异漏慧常数据检测,正常数据分为一类,异常数据分为几类,分别统计正常数据与异常数薯卜据的数据量,求百分比等
span style="font-size:18px;"import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
val dataset = sqlContext.createDataFrame(Seq(
(1, Vectors.dense(0.0, 0.0, 0.0)),
(2, Vectors.dense(0.1, 0.1, 0.1)),
(3, Vectors.dense(0.2, 0.2, 0.2)),
(4, Vectors.dense(9.0, 9.0, 9.0)),
(5, Vectors.dense(1.1, 1.1, 0.1)),
(6, Vectors.dense(12, 14, 100)),
(6, Vectors.dense(1.1, 0.1, 0.2)),
(6, Vectors.dense(-2, -3, -4)),
(6, Vectors.dense(1.6, 0.6, 0.2))
)).toDF("id", "features")
// Trains a k-means model
val kmeans = new KMeans().setK(3).setMaxIter(20).setFeaturesCol("features").setPredictionCol("prediction")
val model = kmeans.fit(dataset)
// Shows the result
println("Final Centers: ")
model.clusterCenters.foreach(println)
model.clusterCenters.zipWithIndex.foreach(println)
val myres = model.transform(dataset).select("features","prediction")
myres.show()/span
聚类算法是一类无监督式机器学习算法,聚类效果怎么评估,模型训练参数怎么调优,是否能用管道来训练模型来比较各种不同组合的参数的效果,即网格搜索法(gridsearch),先设置好待测试的参数,MLLib就会自动完成这些参数的不同组合,管道搭建了一条工作流,一次性完成了整个模型的调优,而不是独立对每个参数进行调优,这个还要再确认一下,查看SPARK-14516好像目前还没有一个聚类效果通用的自动的度量方法
像这种代码(不过现在这个代码有问题):
span style="font-size:18px;"import org.apache.spark.ml.clustering.KMeans
import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.ml.tuning.{ ParamGridBuilder, CrossValidator }
import org.apache.spark.ml.{ Pipeline, PipelineStage }
val dataset = sqlContext.createDataFrame(Seq(
(1, Vectors.dense(0.0, 0.0, 0.0)),
(2, Vectors.dense(0.1, 0.1, 0.1)),
(3, Vectors.dense(0.2, 0.2, 0.2)),
(4, Vectors.dense(9.0, 9.0, 9.0)),
(5, Vectors.dense(1.1, 1.1, 0.1)),
(6, Vectors.dense(12, 14, 100)),
(6, Vectors.dense(1.1, 0.1, 0.2)),
(6, Vectors.dense(-2, -3, -4)),
(6, Vectors.dense(1.6, 0.6, 0.2))
)).toDF("id", "features")
val kmeans = new KMeans().setK(2).setMaxIter(20).setFeaturesCol("features").setPredictionCol("prediction")
//主要问题在这里,没有可用的评估器与label列设置
val evaluator = new BinaryClassificationEvaluator().setLabelCol("prediction")
val paramGrid = new ParamGridBuilder().addGrid(kmeans.initMode, Array("random")).addGrid(kmeans.k, Array(3, 4)).addGrid(kmeans.maxIter, Array(20, 60)).addGrid(kmeans.seed, Array(1L, 2L)).build()
val steps: Array[PipelineStage] = Array(kmeans)
val pipeline = new Pipeline().setStages(steps)
val cv = new CrossValidator().setEstimator(pipeline).setEvaluator(evaluator).setEstimatorParamMaps(paramGrid).setNumFolds(10)
// Trains a model
val pipelineFittedModel = cv.fit(dataset)/span
[img]spark mllib 和sklearn keras比较,哪个是机器学习未来的主流
spark mllib提供了一些机器学习算法的分布式实现;
scikit-learn是python中的机器学习开源库,通闷桐过它可以轻松调用机器学习算法完成实际任务;
keras是深度学习框架(比较高层);
那么可以看到,这三个东西各有侧重,没拍桥有哪一个可以代表未来主流,我们应该把它们都学一下,另外,蚂贺坦还有深度学习的分布式实现,例如TensorFlow on Spark、Paddle on Spark和Caffe on Spark
Mahout和Spark ML是什么关系
两者计算引擎不同,开发芦樱者不同
mahout是hadoop平台下的机器学习库,旧版用的是mapreduce,但新版已经改成用spark了
spark ml是开源spark的机器学习团物类的子项目,目前感觉spark ml更火一点塌哗液
推荐系统中矩阵分解算法-funkSVD和ALS
矩阵分解funkSVD:该矩阵分解不像是线代中的,他属于伪分解。其主要思想是,用两个m*k和k*n的矩阵代替m*n的矩阵。
因为在推荐系统中,矩阵十分稀疏,分解后的矩阵一般是密集的,且可以通过行列相乘来得到空缺的值。
(其预测的是第u个用户对第i个商品的评分)
其通过机器学习最小化损失函数来得到矩阵,
其学习方式有两种,一种是随机梯度下降,一种是交替最小二悄运谨乘。
第一种不说,随处可见。第二种是通过
该式子实现的。
我们先随机化一个Q,因为R是那个稀疏矩阵已知,所以能得到P,我们再反过来用PR求Q。直到模型的误差低于一个阈值。
上面的svd是对于评分的算法,还有svd++等对用户,物品做了偏移项。
隐式矩阵分解(最常见)ALS
我们一般的推荐问题不是通过评分推荐,因为评分的产生十分的困难,一般用户没有这个习惯。我们与其预测评分,不如去预测用户行为。如果我们给用户一个页面有十个商品,我们预测到用户悄隐会点击哪一个,这不就说明用户喜欢这个。而且基于用户启基的信息很多。
我们的矩阵由1,0和空缺组成,1表示该用户点击过该商品(即表示用户对它有想法),0表示用户对它没有想法(怎么是没想法呢,我们定义用户知道他却不想了解他。即我们在所有没有点击该商品的用户中抽样,该商品越火热抽取的人越多。因为热门的东西大家应该都知道,而你却没点击他,说明他不感兴趣)
我们要将该矩阵分解。
我们的损失函数是
Cui是置信度,比如我点击10次当时比只点击一次的喜欢置信度高。
对于学习方法,我们使用加权交替最小二乘法
初始化Y,我们计算出x,再通过
计算出y。再反复交替,直到小于阈值。
该算法目前在spark上有实现。且sparkml将其作为唯一的推荐系统算法。
如何解释spark mllib中ALS算法的原理
对于一个users-products-rating的评分数据集,ALS会建立一个user*product的m*n的矩阵
其中,m为users的数量,n为products的数量
但是在这个数据集中,并不是每个用户都对每个产品进行过评分,所以这个矩阵往往是稀疏的,用户i对产品j的评分往往是空的
ALS所做的事情就是将这个稀疏矩阵通过一定的规律填满,这样就可以从矩阵中得到任意一个user对任意一个product的评分,ALS填充的评分项也称为用户i对产品j的预测得分
所以说,ALS算法的核心就是通过什么样子的规律来填满(预测)这个稀疏矩阵
它是这么做的:
假设m*n的评分矩阵R,可以被近似分解成U*(V)T
U为m*d的用户特征向量矩阵
V为n*d的产品特征向量矩阵((V)T代表V的转置,原谅我不会打转置这个符号。。)
d为user/product的特征值的数量
关于d这个值的理解,大概可以是这样的
对于每个产品,可以从碧余镇d个角度进行评价,以电影为例,可以从主演,导演,特效,剧情4个角度来评价一部电影,那么d就等于4
可以认为,每部电影在这4个角度上都有一个固定的基准评分值
例如《末日崩塌》这部电影是一个产品,它的特征向量是由d个特征值组成的
d=4,有4个特征值,分别是主演,导演,特效,剧情
每个特征值的基准评分值分别为(满分为1.0):
主演:0.9(大光头还是那么霸气)
导演:0.7
特效:0.8
剧情:0.6
矩阵V由n个product*d个特征值组成
对于矩阵U,假设对于任意的用户A,该用户对一部电影的综合评分和电影的特征值存在一定的线性关系,即电影的综合评分=(a1*d1+a2*d2+a3*d3+a4*d4)
其中a1-4为用户A的特征值,d1-4为之前所说的电影的特征值
参考:
协同过滤中的矩阵分解算法研究
那么对于之前ALS算法的这个假设
m*n的评分矩阵R,可以被近似分解成U*(V)T
就是成立的,某个用户对某个产品的评分可以通过矩阵U某行和矩阵V(转置)的某列相乘得到
那么现在的问题是,如何确定用户和产品的特征值?(之前仅仅是举例子,实际中这两个都是未知的变量)
采用的是交替的最小二乘法
在上面的公式中,a表示评分数据集中用户i对产品j的真实评分,另外一部分表示用户i的特征向量(转置)*产品j的特征向量毁衫(这里可以得到预测的i对j的评分)
用真实评分减去预测评分然后求平方,对下一个用户,下一个产品进行相同的计算,将所有结果累加起来(其中,数据集构成的矩阵是存在大量的空打分,并没有实际的评分,解决的方法是就只看对已知打分的项)
参考:
ALS 在 Spark MLlib 中的实现
但是这里之前问题还是存在,就是用户和产品的特征向量都是未知的,这个式子存在两个未知变量
解决的办法是交替的最小二乘法
首先对于上面的公式,以下面的形式显示:
为了防止过度拟合,加上正则化参数
首先用一个小于1的随机数初始化V
根据公式(4)求U
此时就可以得到初始的UV矩阵了,计算上面说过的差平方和
根据计算得到的U和公式(5),重新计算并覆盖V,计算差平方和
反复进行以上两步的计算,直到差平方和小于一个预设的数,或者迭代次数满足要求则停止
取得最新的UV矩阵
则原本的稀疏矩阵R就可以用R=U(V)T来表示了
以上公式内容截图来自:
基于矩阵分解的协同悔粗过滤算法
总结一下:
ALS算法的核心就是将稀疏评分矩阵分解为用户特征向量矩阵和产品特征向量矩阵的乘积
交替使用最小二乘法逐步计算用户/产品特征向量,使得差平方和最小
通过用户/产品特征向量的矩阵来预测某个用户对某个产品的评分
不知道是不是理解正确了
关于sparkml和sparkmllib的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。