1)MLib是一个构建在Spark上的专门针对大数据处理的并发式高速机器学习库,采用较为先进的迭代式、内存存储的分析计算,使得数据的计算处理速度大大高于普通的数据处理引擎
2)目前MLlib中已经有通用的学习算法和工具类,包括统计、分类、回归、聚类、降维等。
3)MLlib采用Scala语言编写,Scala语言是运行在JVM上的一种函数式编程语言,特点就是可移植性强,“一次编写,到处运行”是其最重要的特点。借助于RDD数据统一输入格式,让用户可以在不同的IDE上编写数据处理程序,通过本地化测试后可以在略微修改运行参数后直接在集群上运行。对结果的获取更为可视化和直观,不会因为运行系统底层的不同而造成结果的差异与改变。
二、MLib基本数据类型RDD是MLlib专用的数据格式,它参考了Scala函数式编程思想,并大胆引入统计分析概念,将存储数据转化成向量和矩阵的形式进行存储和计算,这样将数据定量化表示,能更准确地整理和分析结果。
多种数据类型:
| Local vector | 本地向量集。主要向Spark提供一组可进行操作的数据集合 |
| Labeled point | 向量标签。让用户能够分类不同的数据集合 |
| Local matrix | 本地矩阵。将数据结合以矩阵形式存储在本地计算机中 |
| Distributed matrix | 分布式矩阵。将矩阵集合以矩阵形式存储在分布式计算机中 |
1)本地向量
MLlib使用的本地化存储类型是向量,这里的向量主要由两类构成:稀疏型数据集(spares)和密集型数据集(dense)。
import org.apache.spark.mllib.linalg.Vectors //通过传入指定个数的double参数创建向量。 //如果传入其他的数值类型参数,可以隐式转换为double类型 val v1=Vectors.dense(2.5,1.5,5.5) val v2=Vectors.dense(1,2,3) println(v1(0)) print(v2) val v3=Vectors.dense(Array[Double](1,2,3)) val v4=Vectors.dense(Array(1.1,2.2,3.3))
2) 向量标签
三、MLib统计量基础import org.apache.spark.mllib.linalg.Vectors val v5=Vectors.dense(2,3,1) //创建向量标签。1)标签值(看作是因变量Y)2)向量(看做是所有自变量组成的向量) //标签值要求的类型是Double,其他的数值类型,会隐式转换成Double val lb1=LabeledPoint(10,v1) println(lb1.label)//获取标签值 println(lb1.features)//获取向量
数理统计中,基本统计量包括数据的平均值、方差,这是一组求数据统计量的基本内容。在MLlib中,统计量的计算主要用到Statistics类库。
import org.apache.spark.mllib.linalg.Vectors import org.apache.spark.mllib.stat.Statisticsval conf=new SparkConf().setMaster("local").setAppName("statistic") val sc=new SparkContext(conf) val r1=sc.makeRDD(List(1,2,3,4)) val r2=r1.map(x=>Vectors.dense(x)) //返回这一组数据的各项基本指标 val result=Statistics.colStats(r2) println(result.max) println(result.min) println(result.mean)//均值 println(result.variance)//方差 println(result.count)//元素个数 println(result.numNonzeros)//不为0的元素个数 println(result.normL1)//曼哈顿距离 println(result.normL2)//欧式距离val p1=Array(2,1,5) val p2=Array(5,10,3) //计算两个点之间的曼哈顿距离 val p1p2=p1 zip p2 val dis1=p1p2.map( x=>Math.abs(x._1-x._2)).sum //计算两个点之间的欧式距离 val dis2=p1p2.map( x=>(x._1-x._2)*(x._1-x._2)).sum //计算两个点之间的切比雪夫距离 val dis3=p1p2.map( x=>Math.abs(x._1-x._2)).max println(dis1) println(dis2) println(dis3)



