7. 基于MLlib的机器学习
*以下内容由《Spark快速大数据分析》整理所得。
读书笔记的第七部分是讲的是如何使用Spark中提供机器学习函数的MLlib库,在集群中并行运行机器学习算法。
MLlib是Spark中提供机器学习函数的,MLlib就是RDD上一系列可供调用的函数的集合。需要注意的是:MLlib 中只包含能够在集群上运行良好的并行算法,不支持不能并行执行的算法。
一、操作向量
二、特征提取
三、特征标准化
四、分类
五、回归
六、聚类
七、降维
一、操作向量
MLlib 中有个最常用的数据类型Vector类:稠密向量与稀疏向量。
例子:用 Python 创建向量
- from numpy import array
- from pyspark.mllib.linalg import Vectors
- # 创建稠密向量<1.0, 2.0, 3.0>
- # 方法1:NumPy数组可以直接传给MLlib
- denseVec1 = array([1.0, 2.0, 3.0])
- # 方法2:或者使用Vectors类来创建
- denseVec2 = Vectors.dense([1.0, 2.0, 3.0])
- # 创建稀疏向量<1.0, 0.0, 2.0, 0.0>;该方法只接收
- # 向量的维度(4)以及非零位的位置和对应的值
- # 这些数据可以用一个dictionary来传递,或使用两个分别代表位置和值的list
- sparseVec1 = Vectors.sparse(4, {0: 1.0, 2: 2.0})
- sparseVec2 = Vectors.sparse(4, [0, 2], [1.0, 2.0])
二、特征提取
MLlib 有两个算法可以用来计算 TF-IDF:HashingTF和IDF,都在 mllib.feature 包内。 HashingTF从一个文档中计算出给定大小的词频向量。
例子:在 Python 中使用 TF-IDF
- from pyspark.mllib.feature import HashingTF, IDF
- # 将若干文本文件读取为TF向量
- rdd = sc.wholeTextFiles("data").map(lambda (name, text): text.split())
- tf = HashingTF()
- tfVectors = tf.transform(rdd).cache()
- # 计算IDF,然后计算TF-IDF向量 idf = IDF()
- idfModel = idf.fit(tfVectors)
- tfIdfVectors = idfModel.transform(tfVectors)
还有其它方法: Word2Vec.fit_transform(rdd)
三、特征标准化
使用MLlib中的StandardScaler类来进行这样的缩放,同时控制均值和标准差(例如所有的特征平均值为0,标准差为1)。
例子:在Python中缩放向量
- from pyspark.mllib.feature import StandardScaler
- vectors = [Vectors.dense([-2.0, 5.0, 1.0]), Vectors.dense([2.0, 0.0, 1.0])]
- dataset = sc.parallelize(vectors)
- scaler = StandardScaler(withMean=True, withStd=True)
- model = scaler.fit(dataset)
- result = model.transform(dataset)
四、分类
例子:Python 版垃圾邮件分类器
- from pyspark.mllib.regression import LabeledPoint # 方便准备带标签的数据点
- from pyspark.mllib.feature import HashingTF # 词频特征的提取
- from pyspark.mllib.classification import LogisticRegressionWithSGD # SGD
- spam = sc.textFile("spam.txt") normal = sc.textFile("normal.txt")
- # 创建一个HashingTF实例来把邮件文本映射为包含10000个特征的向量
- tf = HashingTF(numFeatures = 10000)
- # 各邮件都被切分为单词,每个单词被映射为一个特征
- spamFeatures = spam.map(lambda email: tf.transform(email.split(" ")))
- normalFeatures = normal.map(lambda email: tf.transform(email.split(" ")))
- # 创建LabeledPoint数据集分别存放阳性(垃圾邮件)和阴性(正常邮件)的例子
- positiveExamples = spamFeatures.map(lambda features: LabeledPoint(1, features))
- negativeExamples = normalFeatures.map(lambda features: LabeledPoint(0, features))
- trainingData = positiveExamples.union(negativeExamples) trainingData.cache() # 因为逻辑回归是迭代算法,所以缓存训练数据RDD
- # 使用SGD算法运行逻辑回归
- model = LogisticRegressionWithSGD.train(trainingData)
- # 以阳性(垃圾邮件)和阴性(正常邮件)的例子分别进行测试。首先使用
- # 一样的HashingTF特征来得到特征向量,然后对该向量应用得到的模型
- posTest = tf.transform("O M G GET cheap stuff by sending money to ...".split(" "))
- negTest = tf.transform("Hi Dad, I started studying Spark the other ...".split(" "))
- print "Prediction for positive test example: %g" % model.predict(posTest)
- print "Prediction for negative test example: %g" % model.predict(negTest)
五、回归
例子:Python 中的线性回归
- from pyspark.mllib.regression import LabeledPoint
- from pyspark.mllib.regression import LinearRegressionWithSGD
- points = # (创建LabeledPoint组成的RDD)
- model = LinearRegressionWithSGD.train(points, iterations=200, intercept=True)
- print "weights: %s, intercept: %s" % (model.weights, model.intercept)
六、聚类
当你要调用K-means算法时,你需要创建 mllib.clustering.KMeans 对象(在Java/Scala中)或者调用 KMeans.train (在Python中)。它接收一个Vector组成的RDD作为参数。K-means返回一个KMeansModel对象,该对象允许你访问其clusterCenters属性(聚类中心,是一个向量的数组)或者调用 predict() 来对一个新的向量返回它所属的聚类。
七、降维
PCA目前只在Java 和Scala(MLlib 1.2)中可用。要调用PCA,你首先要使用mllib. linalg.distributed.RowMatrix类来表示你的矩阵,然后存储一个由Vector 组成的RDD每行一个。
例子:Scala 中的 PCA
- import org.apache.spark.mllib.linalg.Matrix
- import org.apache.spark.mllib.linalg.distributed.RowMatrix
- val points: RDD[Vector] = // ...
- val mat: RowMatrix = new RowMatrix(points)
- val pc: Matrix = mat.computePrincipalComponents(2)
- // 将点投影到低维空间中
- val projected = mat.multiply(pc).rows
- // 在投影出的二维数据上训练k-means模型
- val model = KMeans.train(projected, 10)
7. 基于MLlib的机器学习的更多相关文章
- Spark学习之基于MLlib的机器学习
Spark学习之基于MLlib的机器学习 1. 机器学习算法尝试根据训练数据(training data)使得表示算法行为的数学目标最大化,并以此来进行预测或作出决定. 2. MLlib完成文本分类任 ...
- Spark学习笔记——基于MLlib的机器学习
使用MLlib库中的机器学习算法对垃圾邮件进行分类 分类的垃圾邮件的如图中分成4个文件夹,两个文件夹是训练集合,两个文件夹是测试集合 build.sbt文件 name := "spark-f ...
- 基于Python的机器学习实战:KNN
1.KNN原理: 存在一个样本数据集合,也称作训练样本集,并且样本集中每个数据都存在标签,即我们知道样本集中每一个数据与所属分类的对应关系.输入没有标签的新数据后,将新数据的每个特征与样本集中数据对应 ...
- 基于Apache Spark机器学习的客户流失预测
流失预测是个重要的业务,通过预测哪些客户可能取消对服务的订阅来最大限度地减少客户流失.虽然最初在电信行业使用,但它已经成为银行,互联网服务提供商,保险公司和其他垂直行业的通用业务. 预测过程是大规模数 ...
- 基于python的机器学习开发环境安装(最简单的初步开发环境)
一.安装Python 1.下载安装python3.6 https://www.python.org/getit/ 2.配置环境变量(2个) 略...... 二.安装Python算法库 安装顺序:Num ...
- 基于C#的机器学习--贝叶斯定理-执行数据分析解决肇事逃逸之谜
贝叶斯定理-执行数据分析解决肇事逃逸之谜 在这一章中,我们将: 应用著名的贝叶斯定理来解决计算机科学中的一个非常著名的问题. 向您展示如何使用贝叶斯定理和朴素贝叶斯来绘制数据,从真值表中发现异常值 ...
- 基于C#的机器学习--面部和动态检测-图像过滤器
在本章中,我们将展示两个独立的例子,一个用于人脸检测,另一个用于动态检测,以及如何快速地将这些功能添加到应用程序中. 在这一章中,我们将讨论: 面部检测 动态检测 将检测添加到应用程序中 面部检测 人 ...
- 基于C#的机器学习--我应该接受这份工作吗-使用决策树
决策树 要使决策树完整而有效,它必须包含所有的可能性.事件序列也必须提供,并且是互斥的,这意味着如果一个事件发生,另一个就不能发生. 决策树是监督机器学习的一种形式,因为我们必须解释输入和输出应该是什 ...
- 基于C#的机器学习--深层信念网络
我们都听说过深度学习,但是有多少人知道深度信念网络是什么?让我们从本章开始回答这个问题.深度信念网络是一种非常先进的机器学习形式,其意义正在迅速演变.作为一名机器学习开发人员,对这个概念有一定的了解是 ...
随机推荐
- mysql CHAR and VARCHAR 比较
写在前面 面试的时候突然有一位面试官问,说说CHAR和VARCHAR的区别,懵逼了,想自己平常使用的时候直接把VARCHAR拿来就用,真没注意到其中的不同. 反思,为什么没有注意到他们的不同 对于my ...
- lua 1.1 源码阅读总结
GC 1. 怎么回收的lua 中所有已经分配的数据都会用一些指令的数据结构来记录,当需要回收时,先遍历当前栈内所有 object,把 ref 标志位打上 1,遍历符号表(这部分不能回收),反符号表中的 ...
- 3.Android网络编程-http介绍
1.HTTP请求方法 根据HTTP标准,HTTP请求可以使用多种请求方法. HTTP1.0定义了三种请求方法: GET(查), POST(改)和 HEAD(获取报头,一般用来测试链接是否正常)方法. ...
- 用ip xfrm搭ipsec隧道
拓扑如下 基本的IP配置就不说了,直接写重点,在LS上配置 #配置SA ip xfrm state add src 194.168.10.4 dst 194.168.10.5 proto esp sp ...
- 实验三 HTML表格和表单的制作
实验三 HTML表格和表单的制作 [实验目的] 1.掌握表格的创建.结构调整与美化方法: 2.熟悉表格与单元格的主要属性及其设置方法: 3.掌握通过表格来进行网页页面的布局方法. [实验环境] 连接互 ...
- Java 10 种常用第三方服务
严格意义上说,所有软件的第三方服务都可以自己开发,不过从零到一是需要时间和金钱成本的.就像我们研发芯片,投入了巨大的成本,但仍然没有取得理想的成绩,有些事情并不是一朝一夕,投机取巧就能完成的. Jav ...
- dom4j api 详解【转】
1.DOM4J简介 DOM4J是 dom4j.org 出品的一个开源 XML 解析包.DOM4J应用于 Java 平台,采用了 Java 集合框架并完全支持 DOM,SAX 和 JAXP. DOM4J ...
- 探索ParNew和CMS垃圾回收器
前言 上篇文章我们一起分析了JVM的垃圾回收机制,了解了新生代的内存模型,老年代的空间分配担保原则,并简单的介绍了几种垃圾回收器.详细内容小伙伴们可以去看一下我的上篇文章:秒懂JVM的垃圾回收机制. ...
- 子父类存在同名成员时super的使用条件
1.子父类存在同名成员时,子类中默认访问子类的成员,可通过super指定访问父类的成员,格式:super.xx (注:xx是成员名): 2.创建子类对象时,默认会调用父类的无参构造方法,可通过sup ...
- vue路由传参及组件传参和组件方法调用
VUE路由和组件传参 第一种vue自带的路由传参的三种基本方式 1.通过name :id传参 子组件通过$route.name接收参数 { path: '/particulars/:id', name ...