11.4 数据类型
MLlib 包含一些特有的数据类型,它们位于:
- org.apache.spark.mllib 包(Java/Scala)内。
- pyspark.mllib (Python)内。
主要的几个如下所列:
-
Vector
一个数学向量。MLlib 既支持稠密向量也支持稀疏向量,前者表示向量的每一位都存储下来,后者则只存储非零位以节约空间。 -
LabeledPoint
在诸如分类和回归这样的监督式学习(supervised learning)算法中, LabeledPoint 用来表示带标签的数据点。
它包含一个特征向量与一个标签(由一个浮点数表示),位置在mllib.regression 包中。 -
Rating
用户对一个产品的评分,在 mllib.recommendation 包中,用于产品推荐。 -
各种 Model 类
每个 Model 都是训练算法的结果,一般有一个 predict() 方法可以用来对新的数据点或数据点组成的 RDD 应用该模型进行预测。
操作向量
作为 MLlib 中最常用的数据类型, Vector 类有一些需要注意的地方。
-
向量有两种:
1.1 稠密向量
稠密向量把所有维度的值存放在一个浮点数数组中。
例如,一个 100 维的向量会存储 100 个双精度浮点数。
1.2 稀疏向量
稀疏向量只把各维度中的非零值存储下来。
当最多只有 10% 的元素为非零元素时,我们通常更倾向于使用稀疏向量(不仅是出于对内存使用的考虑,也是出于对速度的考虑)。
许多特征提取技术都会生成非常稀疏的向量,所以这种方式常常是一种很关键的优化手段。 -
创建向量的方式在各种语言中有一些细微的差别。
2.1 在 Python 中,你在 MLlib 中任意地方传递的 NumPy 数组都表示一个稠密向量,你也可以使用 mllib.linalg.Vectors 类创建其他类型的向量。
2.2 在 Java 和 Scala 中,都需要使用 mllib.linalg.Vectors 类。
创建向量:
在 Java 和 Scala 中,MLlib 的 Vector 类只是用来为数据表示服务的,而没有在用户 API 中提供加法和减法这样的向量的算术操作。
这主要是为了让 MLlib 保持在较小规模内,因为实现一套完整的线性代数库超出了本工程的范围。
如果你想在你的程序中进行向量的算术操作,可以使用一些第三方的库,比如 Scala 中的 Breeze 或者 Java 中的 MTJ,然后再把数据转为 MLlib 向量。