Spark机器学习(二)数学基础(下)

9.矩阵
F 域中的矩阵是指由 F 域中的元素构成的二维数组。比如实数域中的一个矩阵可为:
1 2 3
10 20 30
上述矩阵有 2 3 列,被称为 2 × 3 矩阵。人们通常用数字来指代行和列。行 1 (1 2 3),行 2 (10 20 30) ;列 1 (1 10) ,列 2 (2 20) ,列 3 (3 30) 。通常,一个 m n 列的矩阵称为 m × n 矩阵。对于给定矩阵 A ,其元素 ( i , j ) 定义为第 i 行第 j 列的元素,并通过 A i,j A ij来表示。 后续内容将会经常采用 Python 风格,即 A [ i , j ]
 
9.1Spark 中的矩阵
Spark 中的本地矩阵的行列索引为整数,而元素值为双精度(double)型。所有值均存储在单个节点上。MLlib 支持如下矩阵类型。
 密集矩阵:其各元素以列优先顺序存储在单个双精度数组中。
 稀疏矩阵:其各非零元素以列优先顺序存储为 CSC 格式。比如,如下大小为(3, 2)的密集矩阵存储在一维数组[2.0, 3.0, 4.0, 1.0, 4.0, 5.0]中:
2.0 3.0 
4.0 1.0 
4.0 5.0 
以下例子说明了这两种矩阵的创建:
val dMatrix: Matrix = Matrices.dense(2, 2, Array(1.0, 2.0, 3.0, 4.0)) 
println("dMatrix: \n" + dMatrix) 
val sMatrixOne: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), 
 Array(0, 2, 1), Array(5, 6, 7)) 
println("sMatrixOne: \n" + sMatrixOne) 
val sMatrixTwo: Matrix = Matrices.sparse(3, 2, Array(0, 1, 3), 
 Array(0, 1, 2), Array(5, 6, 7)) 
println("sMatrixTwo: \n" + sMatrixTwo) 
其输出如下:
[info] Running linalg.matrix.SparkMatrix 
dMatrix: 
1.0 3.0 
2.0 4.0 
sMatrixOne: 
3 x 2 CSCMatrix 
(0,0) 5.0 
(2,1) 6.0 
(1,1) 7.0 【请不要纠结(2,1)6.0以及(1,1)7.0,通过三行两列的存储,他们就能还原成3*3列的矩阵,下面的(1,1)6.0和(2,1)7.0也是一样】
sMatrixTwo: 
3 x 2 CSCMatrix 
(0,0) 5.0 
(1,1) 6.0 
(2,1) 7.0
9.2Spark 中的分布式矩阵
分布式矩阵的行列索引为长整数( long)型,元素值为双精度型,且分布式地存储在一个或 多个 RDD 上。 Spark 中包含了四类分布式矩阵,它们均为 DistributedMatrix 的子类,如下 图所示。
RowMatrix:该类矩阵是以行优先模式存储的分布式矩阵,但没有有意义的行索引。(在 行优先的矩阵里,每一行的相邻元素在内存中也是相邻存储的。) RowMatrix 实现为其各 行的一个 RDD 。每一行是一个本地向量。其列的数目必须小于等于 2 31,以便单个本地向 量可同驱动程序通信,也使其能在单个节点上保存或进行操作。
Spark 中的本地矩阵的行列索引为整数,而元素值为双精度(double)型。所有值均存储在单个节点上。MLlib 支持如下矩阵类型。
 密集矩阵:其各元素以列优先顺序存储在单个双精度数组中。
 稀疏矩阵:其各非零元素以列优先顺序存储为 CSC 格式。比如,如下大小为(3, 2)的密集
矩阵存储在一维数组[2.0, 3.0, 4.0, 1.0, 4.0, 5.0]中:
2.0 3.0 
4.0 1.0 
4.0 5.0

IndexedRowMatrix:与 RowMatrix 类似,但以行而非列为索引。该索引可用于检索行以及执行连接(join)操作。如下代码演示了创建一个带相应行索引的 4×3 的IndexedMatrix 方法。

CoordinateMatrix:该类矩阵以坐标表(COO,coordinated list)格式将各元素分布式地存储在一个 RDD 中。COO 保存了一个(row, column, value)三元组的列表。各元素依次按行索引和列索引排序过,以提升随机访问性能。当需要增量式增删来构建一个矩阵时,这种格式很有优势。

9.3矩阵操作
矩阵支持的操作有多种。
 按元素加法。已知两个矩阵 a 和 b,将它们相加,(a + b),意味着将两个矩阵相同位置好的元素相加

Breeze 中代码为:
val a = DenseMatrix((1,2),(3,4)) 
val b = DenseMatrix((2,2),(2,2)) 
val c = a + b 
println("a: \n" + a) 
println("b: \n" + b) 
println("a + b : \n" + c) 
其输出为:
a: 
1 2 
3 4 
b: 
2 2 
2 2 
a + b : 
3 4 
5 6

按元素乘法。即将两个矩阵各相同位置上的元素相乘。
在 Breeze 中代码为:
a :* b 
val d = a*b 
println("Dot product a*b : \n" + d) 
其输出为:
Dot product a*b : 
6 6 
14 14

6,6,14,14是这么得来的 (1,2)*(2,2),(1,2)*(2,2)【也就是a矩阵第一行1,2元素乘以b矩阵的第一列元素(2,2)=1*2+2*2=6,第一行第二列元素也是1*2+2*2,第二行第一列是3*2+4*2=14,第二行第二列也一样】,以此类推,就是,6,6,14,14

9.4特征值和特征向量
Ax = b 是源于静态问题的一个线性方程。特征值( eigenvalue )则用于求解动态问题。假设 A 是一个矩阵且 x 为一个向量,下面考虑如何求解线性代数中的新方程, Ax = λ x
A 乘以 x 时,向量 x 改变了它的方向。但存在若干与 Ax 同方向的向量,即特征向量 ( eigenvector ),它们满足如下等式:
Ax = λ x
在上述等式中,向量 Ax 等于 λ 乘以向量 x λ 被称为特征值。特征值 λ 表明向量的方向是反转还 是保持不变。
Ax = λ x 还表明 det( A λ I ) = 0 ,其中 I 为单位矩阵( identity matrix )。这确定了特征值的个数 n
特征值问题定义如下:
Ax = λ x
Ax λ x = 0
Ax λ Ix = 0
( A λ I ) x = 0
如果 x 非零,上述方程仅当 | A λ I | = 0 时有一个解。通过该方程,我们可找到各特征值:
val A = DenseMatrix((9.0,0.0,0.0),(0.0,82.0,0.0),(0.0,0.0,25.0))
val es = eigSym(A)
val lambda = es.eigenvalues
val evs = es.eigenvectors
println("lambda is : " + lambda)
println("evs is : " + evs)
上述代码的结果如下:
lambda is : DenseVector(9.0, 25.0, 82.0)
evs is : 1.0 0.0 0.0
0.0 0.0 1.0
0.0 1.0 -0.0
特征向量第三个(0.0,1.0,-0.0)应该表示0.0-1.0是正增长,1.0到-0.0是负增长。

10.函数
要定义一个如函数这样的数学对象,需要先明白什么是集合(set)。集合是若干无序对象的集,比如 S = {4, 4, 3, 3, 2, 2, 1, 1, 0}。如果集合 S 并非无限,则用|S|来表示其元素的个数,即集合的势(cardinality)。如果 A 和 B 都是有限集合,则有| A → B | = |A| → |B|,即笛卡儿积(Cartesian product)。
对于 A 中的每一个输入元素,一个函数会将其对应到另一集合 B 中的某一个输出元素。A 称为函数的定义域(domain),B 则称为值域(codomain)。函数是若干(x, y)对的集合,其中 x 各不相同。
比如,定义域为{1, 2, 3, …}的函数,其两倍输入操作对应的集合为{(1, 2), (2, 4),(3, 6), …} 又如,输入变量数为 2 且定义域均为{1, 2, 3, …}的函数,其对应的集合为{((1,1),1),((1,2),2), …, ((2,1),2),((2,2),4),((2,3),6),…,((3,1),3),((3,2),6),((3,3),9),…}
给定输入对应的输出称为该输入的映射。q 在函数 f 上的映射表示为 f(q)。如果 f(q) = s,则称 q 经 f 映射为 s ,写作 q → s。包含所有输出的集合称为值域。可用 f: D → F 来表示函数 f 是一个定义域和值域分别为 D 和 F 的函数。

10.1. 假设
X 为输入变量,也称输入特征, y 为要预测的输出或目标变量。 ( x , y )对称为训练样本,用 于学习的数据集为由 m 个训练样本构成的列表, {( x , y )} 表示训练集。 X 也用来表示输入变量的值 的空间, Y 则表示输出变量的值的空间。给定一个训练集,用它来学习一个函数 h ,使得 h : X Y, 其中 h ( x ) y 值的预测函数。这样的函数 h 称为 假设 hypothesis)。 当要预测的目标变量是连续的时,该学习问题称为回归问题。当 y 的取值为少数离散变量时, 则称为分类问题。
 
11梯度下降
梯度下降法中的随机梯度下降法会对数据样本进行简单的分布式抽样。损失是优化问题的一 部分,因此是一个二级梯度。
12.微积分
微积分是一种可用来研究事情如何变化的数学工具。它提供了对内部有变动的系统进行建模
的框架,并能推断出该模型的预测。
12.1可微微分
导数是微积分的核心。它定义为给定函数的函数值随其某个变量的变化而改变的瞬时变化 率。找寻导数的方法称为微分。几何上,如果函数的导数存在且在给定点上有定义,则该点上的 导数为函数在该点上正切线的斜率。
微分是积分的逆向过程,有着广泛的应用。比如在物理上,位移对时间的导数为速度,而速度对时间的导数则是加速度。导数常用于求解函数的极大值或极小值。
机器学习所涉及的函数,其变量或特征的维度成百上千。我们会分别计算函数在每个变量维 度上的导数,然后将这些偏导数合并到一个向量中。这样的向量就构成了一个梯度。类似地,一 个梯度的二阶导数是一个矩阵,称为黑塞( Hessian)矩阵。 理解梯度和黑塞矩阵有助于定义下降的方向和速率,从而获知如何在函数空间中变动,以移 动到最底端那个点,进而最小化该函数的值。

猜你喜欢

转载自blog.csdn.net/penker_zhao/article/details/109770967