Mllib的数据格式
Mllib的数据格式
本地向量
标签数据
本地矩阵
分布式矩阵
本地向量
本地向量是存储在本地节点上的,其基本数据类型是Vector.其有两个子集,分别是密集的与稀疏的,我们一般使用
Vectors工厂类来生成,例如:
Vectors.dense(1.0,2.0,3.0) //密集向量
Vectors.sparse(3,(0,1),(1,2),(2,3)) //稀疏向量
标签数据
监督学习是(x,y)数据形式,其中y就是标签,x就是特征向量,标签数据也是应用
LabeledPoint(1.0,Vectors.dense(1.0,2.0,3.0))
本地矩阵
与向量相似,本地矩阵类型为Matrix,分为稠密与稀疏两种类型。同样使用工厂方法Matrices来生成。但是要注意,MLlib 的矩阵是按列存储的。例如下面创建一个3×3的单位矩阵:
稠密的:
Matrices.dense(3,3,Array(1,0,0,0,1,0,0,1))
稀疏的:
Matrices.sparse(3,3,Array(0,1,2,3),Array(0,1,2),Array(1,1,1))
分布式矩阵
分布式矩阵意为把一个矩阵数据分布式存储到多个RDD中。将分布式矩阵进行数据转换需要全局的shuffle 函数,最基本的分布式矩阵是
RowMatrix.
分布式数据集
RDD Dataset DataFrame都是Spark的分布式数据集的数据格式,三者在一定程度上可以互相转化,有各自的适用范围。
其中 RDD是最为基础与简单的一种数据集形式。
RDD
RDD(Resilient Distributed Datasets),弹性分布式数据集,是Spark 中结构最简单,也是最常用的一类数据集形式。可以理解为把输入数据进行简羊的封装之后形成的对内存数据的抽象。
DataSet
与RDD分行存储,没有列的概念不同,Dataset引入了列的概念,这一点类似于一个CSV文件结构。类似于一个简单的
维表。
DataFrame
DataFrame结构与Dataset是类似的,都引入了列的概念。与Dataset不同的是,DataFrame 中的每一行被再次封装为Row 的对象。需要通过该对象的方法来获取到具体的值。
MLlib与ml
Spark提供的机器学习算法
通用算法:分类,回归,聚类等
特征工程类:降维,转换,选择,特征提取等
MLlib 采用RDD形式的数据结构,而ml使用DataFrame的结构
MLlib的应用场景
例如对海量的房屋出租,出售信息进行数据挖掘,预测房价价格,租金
典型数据集:波士顿房价数据集
主要用到传统的数据挖掘算法,例如使用回归算法
矩阵与向量
矩阵介绍
Matrix :按照长方阵列排列的实数或复数的集合
矩阵在程序中以二维数组的形式存储,可以认为是一个二维表
矩阵可以进行加、减、数乘、叉乘、转置、共扼等运算
矩阵的转置
矩阵的乘法
向量介绍
Vector,向量又称矢量,是有方向和大小的量
矩阵中的每一行可以看做是个行向量,每一列就是一个列向量
向量也可以进行加、减、点积、转置等运算,与矩阵操作类似
向量既然是有大小的,模长就可以看做向量的大小
此外,向量还有范数的概念,常用的主要是p范数,范数可以衡量列向量的大小,范数可以认为是列向量的度量方式,p=2的时候,范数就是向量的模长
p范数
向量介绍
Vector,向量又称矢量,是有方向和大小的量
矩阵中的每一行可以看做是个行向量,每一列就是一个列向量
向量也可以进行加、减、点积、转置等运算,与矩阵操作类似
向量既然是有大小的,模长就可以看做向量的大小
此外,向量还有范数的概念,常用的主要是p范数
p范数
创建一个向量
import org.apache.spark.mllib.linalg.Vectors
val v1= Vectors.dense(1, 2, 3, 4)
res2: org.apache.spark.mllib.linalg.Vector = [1.0,2.0,3.0,4.0]
向量的基本计算
import breeze.linalg.DenseVector
val v2: DenseVector[Int] =DenseVector(1,2,3,4)
res3: breeze.linalg.DenseVector[Int] = DenseVector(1, 2, 3, 4)
向量的转置
v2.t
res5: breeze.linalg.Transpose[breeze.linalg.DenseVector[Int]] = Transpose(DenseVector(1, 2, 3, 4))
向量的乘法
v2*v2.t
res6: breeze.linalg.DenseMatrix[Int] =
1 2 3 4
2 4 6 8
3 6 9 12
4 8 12 16
基础统计
基础统计学
实战
Spark的基础统计模块即MLlib 组件中的 Basic Statistics部分
Basic Statistics主要包括Correlation与 Hypothesis testing等
其大多被封装在org.apache.spark.mllib.stat._中
常用的统计学知识
描述性统计:平均数,方差,众数,中位数。。。
相关性度量: spark提供了皮尔逊和斯皮尔曼相关系数,反映变量间相关关系密切程度!
假设检验∶根据一定假设条件,由样本推断总体的一种统计学方法。spark提供了皮尔森卡方检测
统计模块:
官网
https://spark.apache.org/docs/2.1.1/mllib-statistics.html#summary-statistics
列如统计北京降水量
0.4806,0.4839,0.318,0.4107,0.4835,0.4445,0.3704,0.3389,0.3711,0.2669,0.7317,0.4309,0.7009,0.5725,0.8132,0.5067,0.5415,0.7479,0.6973,0.4422,0.6733,0.6839,0.6653,0.721,0.4888,0.4899,0.5444,0.3932,0.3807,0.7184,0.6648,0.779,0.684,0.3928,0.4747,0.6982,0.3742,0.5112,0.597,0.9132,0.3867,0.5934,0.5279,0.2618,0.8177,0.7756,0.3669,0.5998,0.5271,1.406,0.6919,0.4868,1.1157,0.9332,0.9614,0.6577,0.5573,0.4816,0.9109,0.921
读取文件进行统计
val txt = spark.sparkContext.textFile("src/main/scala1/coding-271/ch6/beijing.txt")
import org.apache.spark.mllib.{stat,linalg}
import org.apache.spark.mllib.linalg.Vectors
val data = txt
.flatMap(_.split(",")) //切割字符串压缩
.map(x => Vectors.dense(x.toDouble))
/**
* 使用统计模块进行统计分析
* 列统计
*/
val summary = stat.Statistics.colStats(data)
println(summary.max)
println(summary.mean)
相关系数
相关性度量
是—种研究变量之间线性相关程度的量
我们主要介绍皮尔逊相关系数︰
公式
E:期望值,可以是平均值
列子
对北京市历年降水量进行相关性统计,看看年份与降水量之间的相关性有多大
数据集
2009,2007,2006,2005,2004,2003,2002,2001,2000,1999,1998,1997,1996,1995,1994,1993,1992,1991,1990,1989,1988,1987,1986,1985,1984,1983,1982,1981,1980,1979,1978,1977,1976,1975,1974,1973,1972,1971,1970,1969,1968,1967,1966,1965,1964,1963,1962,1961,1960,1959,1958,1957,1956,1955,1954,1953,1952,1951,1950,1949
0.4806,0.4839,0.318,0.4107,0.4835,0.4445,0.3704,0.3389,0.3711,0.2669,0.7317,0.4309,0.7009,0.5725,0.8132,0.5067,0.5415,0.7479,0.6973,0.4422,0.6733,0.6839,0.6653,0.721,0.4888,0.4899,0.5444,0.3932,0.3807,0.7184,0.6648,0.779,0.684,0.3928,0.4747,0.6982,0.3742,0.5112,0.597,0.9132,0.3867,0.5934,0.5279,0.2618,0.8177,0.7756,0.3669,0.5998,0.5271,1.406,0.6919,0.4868,1.1157,0.9332,0.9614,0.6577,0.5573,0.4816,0.9109,0.921
读取数据,划分为年份数据,降水量数据
val txt = spark.sparkContext.textFile("src/main/scala1/coding-271/ch4/beijing.txt")
val data = txt.flatMap(_.split(",")).map(_.toDouble)
val years =data.filter(_>1000) //年份数据
val values=data.filter(_<1000) //降水量数据
计算皮尔逊相关系数
import org.apache.spark.mllib.stat._
println(Statistics.corr(years, values))//线性相关程度具体值
假设检验
根据一定假设条件,由样本推断总体的一种统计学方法。基本思路是先提出假设(虚无假设),使用统计学方法进行计算,根据计算结果判断是否拒绝假设
假设检验的统计方法有很多,如卡方检验,T检验等
spark 实现的是皮尔森卡方检验,它可以实现适配度检测和独立性检测
皮尔森卡方检验是最常用的卡方检验,可以以分为适配度检验和独立性检验
适配度检验∶验证观察值的次数分配与理论值是否相等
独立性检验:两个变量抽样到的观察值是否相互独立
列子:
判断性别与撇子关系
性别 男 女
左利手 127 147
右利手 19 10
数据
127 147
19 10
假设检验
import org.apache.spark.mllib.stat
import org.apache.spark.mllib.linalg.Matrices
val data=Matrices.dense(2,2,Array(127,19,147,10))
println(data)
val result = stat.Statistics.chiSqTest(data)
println(result)