尧图网络 高端网站定制 · 原创设计
免费咨询热线
400-888-6620
免费获取方案
Spark大数据分析与实战笔记(第八章 Spark MLlib 机器学习算法库-02)
文章目录每日一句正能量章节概要8.3 数据类型8.3.1 本地向量8.3.2 标注点8.3.3 本地矩阵8.4 Spark MLlib基本统计8.4.1 摘要统计8.4.2 相关统计8.4.3 分层抽样每日一句正能量最结实的希望是用下一步编织的。希望不是空中楼阁而是由连续不断的、微小的行动经纬编织而成的地毯。那些光、花、根、蝉鸣、滚烫、茶香与镜台……拼贴起来就是一个完整而自足的世界。章节概要MLlib是Spark提供的处理机器学习方面的功能库该库包含了许多机器学习算法开发者可以不需要深入了解机器学习算法就能开发出相关程序。本章将介绍Spark MLlib基本知识以及使用方法最后通过构建推荐引擎了解机器学习系统的构建思路及流程。8.3 数据类型MLlib的主要数据类型包括本地向量、标注点、本地矩阵。本地向量与本地矩阵是提供公共接口的简单数据类型Breeze和Jblas提供了底层的线性代数运算。在监督学习中使用标注点类型表示训练样本。8.3.1 本地向量本地向量分为密集向量Dense和稀疏向量Sparse密集向量是由Double类型的数组支持而稀疏向量是由两个并列的数据索引、值支持。例如向量1.0, 0.0, 3.0的密集向量表示的格式为[1.0, 0.0, 3.0]由稀疏向量表示的格式为3, [0, 2], [1.0, 3.0]其中3是向量1.00.0 3.0的长度[0, 2]是向量中非0维度的索引值即向量索引0和2的位置为非0元素[1.03.0]是按照索引排列的数组元素值。本地向量的基类是VectorMLlib提供了DenseVector和SparseVector类官方建议使用Vectors工具类下的工厂方法来创建本地向量创建方式如下所示。#导包 scalaimportorg.apache.spark.mllib.linalg.{Vector,Vectors}#创建一个密集本地向量 scalavaldv:VectorVectors.dense(1.0,0.0,3.0)#创建一个稀疏本地向量 scalavalsv1:VectorVectors.sparse(3,[0,2],[1.0,3.0])# 通过指定非零项目创建稀疏本地向量 scalavalsv2:VectorVectors.sparse(3,Seq((0,1.0),(1.0,3.0)))需要说明的是在Scala中默认会导入scala.collection.immutable.Vector包所以必须显式导入org.apache.spark.mllib.linalg.Vector才能使用MLlib提供的Vector类。结果如下图所示#导包 scalaimportorg.apache.spark.mllib.linalg.{Vector,Vectors}#创建一个密集本地向量 scalavaldv:VectorVectors.dense(1.0,0.0,3.0)dv:org.apache.spark.mllib.linalg.Vector[1.0,0.0,3.0]#创建一个稀疏本地向量 scalavalsv1:VectorVectors.sparse(3,[0,2],[1.0,3.0])# 通过指定非零项目创建稀疏本地向量 scalavalsv2:VectorVectors.sparse(3,Seq((0,1.0),(1.0,3.0)))sv2:org.apache.spark.mllib.linalg.Vector(3,[0,2],[1.0,3.0])8.3.2 标注点标注点是一种带有标签的本地向量标注点通常用于监督学习算法中MLlib使用Double数据类型存储标签因此可以在回归和分类中使用标记点。如果只有两种分类可以使用二分法则正样本标签为1.0负样本标签为0.0对于多分类问题来说标签是一个以0开始的索引序列如0、1、2…。标注点的实现类是org.apache.spark.mllib.regression.LabeledPoint 创建标注点方式的代码如下。#导包 scalaimportorg.apache.spark.mllib.linalg.Vectors scalaimportorg.apache.spark.mllib.regression.LabeledPoint #创建带有正标签和密集向量的标注点 scalavalposLabeledPoint(1.0,Vectors.dense(1.0,0.0,3.0))#创建带有负标签和稀疏向量的标注点 scalavalnegLabeledPoint(0.0,Vectors.sparse(3,Array(0,2),Array(1.0,3.0)))结果如下图所示#导包 scalaimportorg.apache.spark.mllib.linalg.Vectors scalaimportorg.apache.spark.mllib.regression.LabeledPoint #创建带有正标签和密集向量的标注点 scalavalposLabeledPoint(1.0,Vectors.dense(1.0,0.0,3.0))pos:org.apache.spark.mllib.regression.LabeledPoint(1.0,[1.0,0.0,3.0])#创建带有负标签和稀疏向量的标注点 scalavalnegLabeledPoint(0.0,Vectors.sparse(3,Array(0,2),Array(1.0,3.0)))neg:org.apache.spark.mllib.regression.LabeledPoint(0.0,(3,[0m2],[1.0,3.0]))稀疏向量数据在机器学习应用中较为常见MLlib支持读取LIBSVM的格式数据LIBSVM格式是一种每一行表示一个标签稀疏向量的文本格式其格式如下label index1:value1 index2:value2…上述格式中label是该样本点的标签值”index: value“代表了该样本向量中所有非零的索引和元素值需要注意的是index是以1递增的。8.3.3 本地矩阵本地矩阵具有整型的行和列索引值以及Double类型的元素值它存储在单个机器上。MLlib支持密集矩阵和稀疏矩阵密集矩阵将所有元素的值存储在一个列优先的双精度数组中而稀疏矩阵则将以列优先的非零元素压缩到稀疏列CSC格式中。本地矩阵的基类是MatrixDenseMatrix和SparseMatrix均是Matrix的继承类。创建本地矩阵方式的代码如下。#导包 scalaimportorg.apache.spark.mllib.linalg.{Matrix,Matrices}#创建一个3行2列的密集矩阵 scalavaldm:MatrixMatrices.dense(3,2,Array(1.0,3.0,5.0,2.0,4.0,6.0))#创建一个3行2列的稀疏矩阵 scalavalsm:MatrixMatrices.sparse(3,2,Array(0,1,3),Array(0,2,1),Array(9,6,8))结果如下图所示#导包 scalaimportorg.apache.spark.mllib.linalg.{Matrix,Matrices}#创建一个3行2列的密集矩阵 scalavaldm:MatrixMatrices.dense(3,2,Array(1.0,3.0,5.0,2.0,4.0,6.0))dm:org.apache.spark.mllib.linalg.Matrix1.02.03.04.05.06.0#创建一个3行2列的稀疏矩阵 scalavalsm:MatrixMatrices.sparse(3,2,Array(0,1,3),Array(0,2,1),Array(9,6,8))sm:org.apache.spark.mllib.linalg.Matrix3x2CSCMatrix 009.0216.0118.0上述是创建本地矩阵的方式需要注意的是这里的数组参数是列优先的即按照列的方式从数组中提取元素。8.4 Spark MLlib基本统计MLlib提供了很多统计方法包含摘要统计、相关统计、分层抽样、假设检验、随机数生成等统计方法利用这些统计方法可以帮助用户更好地对结果数据进行处理和分析。8.4.1 摘要统计在MLlib中统计量的计算主要用到Statistics类摘要统计主要方法及相关说明如表所示。方法名称相关说明count列的大小mean每列的均值variance每列的方差max每列的最大值min每列的最小值numNonzeros每列非零向量的个数方差公式接下来使用Spark-Shell演示摘要统计方法代码如下。#导包 scalaimportorg.apache.spark.mllib.linalg.Vectors scalaimportorg.apache.spark.mllib.stat.{MultivariateStatisticalSummary,Statistics}#创建密集矩阵 scalavalobservationssc.parallelize(Seq(Vectors.dense(1.0,10.0,100.0),Vectors.dense(2.0,10.0,200.0),Vectors.dense(3.0,30.0,300.0)))#计算列摘要统计信息 scalavalsummary:MultivariateStatisticalSummaryStatistics.colStats(observations)#打印平均值 scalaprintln(summary.mean)[2.0,20.0,200.0]#打印方差 scalaprintln(summary.variance)[1.0,100.0,10000.0]结果如下图所示8.4.2 相关统计相关系数是反应两个变量之间相关关系密切程度的统计指标这也是统计学中常用的统计方式MLlib提供了计算多个序列之间相关统计的方法目前MLlib默认采用皮尔森相关系数计算方法。皮尔森相关系数Pearson correlation coefficient也称皮尔森积矩相关系数Pearson product-moment correlation coefficient它是一种线性相关系数计算公式如下Statistics提供了计算序列之间相关性的方法接下来通过Spark Shell演示相关统计方法具体代码如下。#导包 scalaimportorg.apache.spark.mllib.linalg._ scalaimportorg.apache.spark.mllib.stat.Statistics scalaimportorg.apache.spark.mllib.rdd.RDD #创建序列 scalavalseriesX:RDD[Double]sc.parallelize(Array(1,2,3,3,5))scalavalseriesY:RDD[Double]sc.parallelize(Array(11,22,33,33,555))#计算seriesX,seriesY的相关系数 scalavalcorrelation:DoubleStatistics.corr(seriesX,seriesY,pearson)#打印数据 scalaprintln(sCorrelation is:$correlation)Correlation is:0.8500286768773001#利用皮尔森方法计算密集矩阵相关系数 scalavaldata:RDD[Vector]sc.parallelize(Seq(Vectors.dense(1.0,10.0,100.0)Vectors.dense(2.0,20.0,200.0)Vectors.dense(5.0,33.0,366.0)))scalavalcorrelMatrix:MatrixStatistics.corr(data,pearson)scalaprintln(correlMatrix.toString)在上述代码中通过Statistics.corr(data, “pearson”)方法选择使用皮尔森相关系数算法获得数据的相关系数但在MLlib中还提供了斯皮尔曼等级相关系数方法只需要在corr()方法中标注spearman参数即可。结果如下图所示8.4.3 分层抽样分层抽样法也叫类型抽样法它是先将总体按照某种特征分为若干次级层然后再从每一层内进行独立取样组成一个样本的统计学计算方法。例如某手机厂家估算当地 潜在用户可以将当地居民消费水平作为分层基础减少样本中的误差如果不采取分层抽样仅在消费水平较高的用户中做调查是不能准确的估算出潜在的用户。接下来通过Spark-Shell演示分层抽样方法具体代码如下。#创建键值对RDD scalavaldatasc.parallelize(Seq((1.a),(1,b),(2,c),(2,d),(2,e),(3,f)))#设定抽样格式 scalavalfractionsMap(1-0.1,2-0.6,3-0.3)#从每层获取抽样样本 scalavalapproxSampledata.sampleByKeyy(withReplacementfalse,fractionsfractions)# 从每层获取精确样本 scalavalexactSampledata.sampleByKeyExact(withReplacementfalse,fractionsfractions)#打印抽样样本 scalaapproxSample.foreach(println)(2,e)#打印精确样本 scalaexactSample.foreach(println)(2,d)(3,f)结果如下图所示在上述代码中用到了两种分层抽样方法其中sampleByKey()方法需要作用于一个键值对数组其中Key用于分类Value可以是任意值然后通过fractions参数定义分类条件和采样机率fractions参数被定义成一个Map类型Key是键值对数组的分层条件Value是满足Key条件的采样比例1.0代表概率为100%withReplacement代表每次抽样是否有放回。sampleByKey()方法会对全量数据做采样计算。对于每个类别其都会产生fk·nk个样本其中fk是键为fractions的Key的样本类别采样的比例nk是Key所拥有的样本数。sampleByKeyExtra采样的结果会更准确有99.99%的置信度但耗费的计算资源也更多。sampleByKey()方法和sampleByKeyExact()方法的区别在于sampleByKey()方法每次都得通过给定的概率以一种类似于掷硬币的方式来决定这个观察值是否被放入样本因此一遍就可以过滤完所有数据最后得到一个近似大小的样本但往往并不够准确。转载自https://blog.csdn.net/u014727709/article/details/163802680欢迎 点赞✍评论⭐收藏欢迎指正
RELATED

相关推荐

WindowTabs:把桌面窗口收进标签页,多窗口切换成本更低

WindowTabs:把桌面窗口收进标签页,多窗口切换成本更低

WindowTabs:把桌面窗口收进标签页,多窗口切换成本更低 【免费下载链接】WindowTabs 项目地址: https://gitcode.com/gh_mirrors/wi/WindowTabs WindowTabs 是一款把浏览器式标签管理带到桌面的窗口管理工具:多个应用程序窗口可以被收…

📅 2026/9/20 22:00:58
输入手机号就能查到归属地:开源号码定位项目 location-to-phone-number

输入手机号就能查到归属地:开源号码定位项目 location-to-phone-number

输入手机号就能查到归属地:开源号码定位项目 location-to-phone-number 【免费下载链接】location-to-phone-number This a project to search a location of a specified phone number, and locate the map to the phone number location. 项目地址: https://git…

📅 2026/11/8 4:29:16
Wand-Enhancer 使用指南:如何免费启用 Wand 专业版功能,并用手机控制训练器

Wand-Enhancer 使用指南:如何免费启用 Wand 专业版功能,并用手机控制训练器

Wand-Enhancer 使用指南:如何免费启用 Wand 专业版功能,并用手机控制训练器 【免费下载链接】Wand-Enhancer Advanced UX and interoperability extension for Wand (WeMod) app 项目地址: https://gitcode.com/GitHub_Trending/we/Wand-Enhancer …

📅 2026/9/24 6:57:54
MORE NEWS

更多资讯

📰

安阳办电工作业证在哪 最新政策解读 多久拿证全搞懂

安阳办电工作业证在哪 最新政策解读 多久拿证全搞懂 之前考的证在外省能不能转过来?这是很多在外地考了证的电工朋友最关心的问题,尤其是像你这样在南阳从事市政工程的朋友,证书能不能顺利转到安阳,直接关系到能不能正常上岗。别急,下面我来详细说说…

📰

维修电工证办理多久拿证?怕考不过白交培训费的看过来

维修电工证办理多久拿证?怕考不过白交培训费的看过来 怕考不过白交培训费?维修电工证办理多久拿证,成了很多人最关心的问题。特别是现在找工作、换行业、转岗,维修电工证成了刚需。但很多新手一上来就怕花钱打了水漂,怕培训费白交,怕考不过白忙一场。别…

📰

兴山电工证怎么考?实操考试心里没底怕挂科?上岗必备全流程解析

兴山电工证怎么考?实操考试心里没底怕挂科?上岗必备全流程解析 你是不是正在为考【兴山电工证】发愁?实操考试心里没底怕挂科,怕流程复杂搞不清楚,怕证书不被认可?别急,今天我就从焦作房建工程从业者的角度,把【兴山电工证】这个上岗必备的证怎么考、…

📰

工地太忙根本没时间复习考试?维修电工证办理通过率揭秘

工地太忙根本没时间复习考试?维修电工证办理通过率揭秘 工地太忙根本没时间复习考试,这是很多一线电工的真实写照。你是不是也经常在工地上被催着干活,一拖再拖,等到要考维修电工证的时候,才发现自己连大纲都看不懂?别急,今天我就从一个河南鹤壁的应届…

📰

企业要压电工证怎么报名 避坑指南+薪资前景全解析

企业要压电工证怎么报名 避坑指南+薪资前景全解析 你是不是也这样,手里拿着企业要压电工证的任务,却不知道从哪儿开始?怕被中间人骗钱、怕流程复杂、怕资料不全耽误事?今天就带你从零开始,讲清楚怎么报名、该准备什么、多少钱能搞定,还有这份证书在不…

📰

尚志市电工证复审怎么报名?证书过期了不知道怎么复审延期

尚志市电工证复审怎么报名?证书过期了不知道怎么复审延期 证书过期了不知道怎么复审延期,你是不是也遇到过这种情况?别慌,今天我就给你讲清楚 尚志市电工证复审怎么报名…

TODAY

今日更新

THIS WEEK

本周精选

THIS MONTH

本月热门

读完文章,想聊聊您的网站?

告诉我们您的行业与需求,资深顾问一对一梳理方案与报价,全程免费。

📞 💬