1 Local vector 本地向量
一个本地向量可以是integer型和double型的值,存储在单机上。MLlib支持两种类型的本地向量即dense和sparse型。两者之从表达形式上不同,例如:
一个向量(1.0,0.0,3.0) in dense format [1.0,0.0,3.0] ,in sparse format (3,[0,2][1.0,3.0]),其中3是这个向量的大小。
scala> import org.apache.spark.mllib.linalg.{Vector,Vectors}
import org.apache.spark.mllib.linalg.{Vector, Vectors}
// Create a dense vector (1.0, 0.0, 3.0).
scala> val dv:Vector=Vectors.dense(1.0,0.0,3.0)dv: org.apache.spark.mllib.linalg.Vector = [1.0,0.0,3.0]
// Create a sparse vector (1.0, 0.0, 3.0) by specifying its indices and values corresponding to nonzero entries.
scala> val sv1:Vector=Vectors.sparse(3,Array(0,2),Array(1.0,3.0))sv1: org.apache.spark.mllib.linalg.Vector = (3,[(0,1.0),(2,3.0)])
// Create a sparse vector (1.0, 0.0, 3.0) by specifying its nonzero entries.
scala> val sv2:Vector=Vectors.sparse(3,Seq((0,1.0),(2,3.0)))sv2: org.apache.spark.mllib.linalg.Vector = (3,[(0,1.0),(2,3.0)])
注释:
scala会自动importsscala.collection.immutable.Vector
,所以你必须显示的importorg.apache.spark.mllib.linalg.Vector
。
2 Labeled point 标记点
一个标记点就是一个带有标签或者反应的本地向量,可以是dense也可以是sparse,在MLlib,标记点经常在监督性学习算法中使用,我们用double来存一个标记,所以
我们可以在回归和分类中用标记的点。例如,在二分法中,标记应该是0(负)或者1(正);在多类的分类中,标记应该从0开始,0,1,2,.....
scala> import org.apache.spark.mllib.linalg.Vectors
import org.apache.spark.mllib.linalg.Vectors
scala> import org.apache.spark.mllib.regression.LabeledPoint
import org.apache.spark.mllib.regression.LabeledPoint
// Create a labeled point with a positive label and a dense feature vector.
scala> val pos=LabeledPoint(1.0,Vectors.dense(1.0,0.0,3.0))pos: org.apache.spark.mllib.regression.LabeledPoint = LabeledPoint(1.0, [1.0,0.0,3.0])
// Create a labeled point with a negative label and a sparse feature vector.
scala> val neg=LabeledPoint(0.0,Vectors.sparse(3,Array(0,2),Array(1.0,3.0)))neg: org.apache.spark.mllib.regression.LabeledPoint = LabeledPoint(0.0, (3,[(0,1.0),(2,3.0)]))
Sparse data 稀疏数据
现实中我们经常用到稀疏的训练数据。MLlib支持读取以LIBSVM格式的训练例子。这些数据缺省情况下是LIBSVM ,LIBLINEAR格式。如果是text格式,则每一行代表一个
标记的稀疏特征向量,以一下格式:
label index1:value1 index2:value2 ... 例子:
import org.apache.spark.mllib.regression.LabeledPoint import org.apache.spark.mllib.util.MLUtils import org.apache.spark.rdd.RDD val training: RDD[LabeledPoint] = MLUtils.loadLibSVMFile(sc, "mllib/data/sample_svm_data.txt") //出错,好像是文件split两个