8.4.5 算法应用实例
MLlib是一些常用机器学习算法在Spark上的实现,Spark的设计初衷是支持一些迭代的大数据算法。下面通过一个例子使用Mllib支持向量机进行分类,并将程序打包执行,读者可以通过示例开启MLlib之旅。
1.程序代码
使用支持向量机进行分类的代码如下。
- import org.apache.spark.SparkContext
- import org.apache.spark.mllib.classification.SVMWithSGD
- import org.apache.spark.mllib.regression.LabeledPoint
- Val SL = new Sparkcontext("Local","SVM","/root",Sep "svm.jar"))
- /* 加载和解析样例数据文件 */
- val data = sc.textFile("mllib/data/sample_svm_data.txt")
- val parsedData = data.map { line =>
- val parts = line.split(' ')
- /*将数据转化为标记向量 */
- LabeledPoint(parts(0).toDouble, parts.tail.map(x => x.toDouble).toArray)
- }
- /* 配置迭代次数为20 */
- val numIterations = 20
- /* 使用SVMWithSGD类,训练模型。其中使用的优化方法是随机梯度下降(SGD) */
- val model = SVMWithSGD.train(parsedData, numIterations)
- /* 使用训练好的模型进行分类预测 */
- val labelAndPreds = parsedData.map { point =>
- val prediction = model.predict(point.features)
- (point.label, prediction)
- }
- /*统计分类错误并打印 */
- val trainErr = labelAndPreds.filter(r => r._1 != r._2).count.toDouble / parsedData.count
- println("trainError = " + trainErr)
与开发Spark应用程序一样,可以在spark-shell中交互式地运行MLlib,也可以把代码打包成一个jar提交到Spark集群中执行。
2.在Spark Shell中运行
在Spark根目录执行bin/spark-shell命令。然后将示例代码复制进Shell。
3.打包为Jar运行
1)新建项目,项目中需要创建一个SVM_TEST类,将使用支持向量机进行分类的代码复制到main函数中,然后配置SparkContext。
2)示例项目下需要有一个sbt配置文件simple.sbt,输入下面的配置项。
- name := "SVM_TEST"
- version := "1.0"
- scalaVersion := "2.10.3"
- libraryDependencies += "org.apache.spark" %% "spark-core" % "1.0.0-incubating"
- #由于本例使用MLlib底层库,所以需要加入MLlib库依赖
- libraryDependencies += "org.apache.spark" %% "spark-mllib" % "1.0.0-incubating"
- resolvers += "Akka Repository" at "http://repo.akka.io/releases/"
3)把上述文件组织成一定的目录结构。
- ./simple.sbt
- ./src
- ./src/main
- ./src/main/scala
- ./src/main/scala/SVM_TEST.scala
4)在示例项目根目录下执行以下操作。
①打包项目。
- sbt package
②执行项目。
- sbt run
③在控制台得到以下结果。
- trainError = 0.40372670807453415
- 14/08/26 18:26:22 INFO network.ConnectionManager: Selector thread was interrupted!
- [success] Total time: 4 s, completed Oct 1, 2014 8:26:22 PM