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

 
域是数学中以不同形式定义的基本结构。下面会介绍一些常见的基本类型。
1. 实数
实数包含我们所能想到的任意数字。它包括整数( 0 1 2 3 )、有理数( 2/6 0.768 0.222...
3.4 )和无理数( π 3 的平方根)。实数可以是正数、负数或 0 。虚数则是另一种数,比如 1 的平
方根。注意,极数(无穷大或无穷小)不是实数。
无理数与有理数的区别:
1、把有理数和无理数都du写成zhi小数形式时,有dao理数能写成有限小数和无限循环小数,
比如4=4.0, 4/5=0.8, 1/3=0.33333……而无理数只能写成无限不循环小数,
比如√2=1.414213562…………根据这一点,人们把无理数定义为无限不循环小数.
 
2. 复数
我们通常的理解是,一个数的平方不可能为负数。那如何求解 x 2 = 9 ?不难想到数学中有 i
这个概念能够求解,即 x = 3i 。诸如 i i 3i 2.27i 这样的数称为虚数。一个实数加一个虚数
构成了一个复数。
复数 = 实数部 + 虚数部 i
 
3. 向量
向量是一组有序数字的数学表示。它与集合类似,但是各数是有序的。其中的数均为实数。
n 维向量在几何上表示为 n 维空间中的一个点。向量的起点(原点)从零开始。
比如:
[2, 4, 5, 9, 10]
[3.14159, 2.718281828, 1.0, 2.0]
[1.0, 1.1, 2.0]
4. 向量空间
线性代数是向量空间的代数表示。实数域或复数域中的各向量可相加,或通过与标量 α 相乘
而成倍变化。
向量空间是若干可相加和相乘的向量构成的集合。在向量空间中,两个向量可结合生成第三
个向量或其他对象。向量空间的公理具有诸多有用的性质。向量空间中的空间定义有助于物理空
间属性的学习,比如,确认一个物体的远近。三维欧几里得( Euclidean )空间中的向量集合便是
向量空间的一个例子。向量空间 V 在域 F 上具有如下性质。
向量加法:表示为 v + w ,其中 v w 是空间 V 中的元素。
标量乘法:表示为 α * v ,其中 α F 中的元素。
结合律:表示为 u + ( v + w ) = ( u + v ) + w ,其中 u v w 均为空间 V 中的元素。
交换律:表示为 v + w = w + v
分配律:表示为 α * ( v + w ) = α * v + α * w
5. 向量类型
Scala 编程中,我们使用 Breeze 库来表示向量。向量可表示为密集向量和稀疏向量。
6. Breeze 中的向量
Breeze 使用两种基本的向量类型来表示上述两种向量,即 breeze.linalg.DenseVector
breeze.linalg.SparseVector
DenseVector 是对支持数值运算的数组的一种封装。下面先看下密集向量的计算。首先借
Breeze 创建一个密集向量对象,然后更新索引为 3 的元素的值。
import breeze.linalg.DenseVector
val v = DenseVector(2f, 0f, 3f, 2f, -1f)
v.update(3, 6f)
println(v)
其结果为: DenseVector(2.0, 0.0, 3.0, 6.0, -1.0)
SparseVector 表示多数元素为 0 且支持数值运算的向量,即稀疏向量。下面的代码先借助
Breeze 创建了一个稀疏向量,然后对其中的各值加 1
import breeze.linalg.SparseVectorval
sv:SparseVector[Double] = SparseVector(5)()
sv(0) = 1
sv(2) = 3
sv(4) = 5
val m:SparseVector[Double] = sv.mapActivePairs((i,x) => x+1)
println(m)
其结果为: SparseVector((0,2.0), (2,4.0), (4,6.0))
 
稀疏向量和密集向量都是向量的表示方法
密集向量和稀疏向量的区别: 密集向量的值就是一个普通的Double数组 而稀疏向量由两个并列的 数组indices和values组成 例如:向量(1.0,0.0,1.0,3.0)用密集格式表示为[1.0,0.0,1.0,3.0],用稀疏格式表示为(4,[0,2,3],[1.0,1.0,3.0]) 第一个4表示向量的长度(元素个数),[0,2,3]就是indices数组,[1.0,1.0,3.0]是values数组 表示向量0的位置的值是1.0,2的位置的值是1.0,而3的位置的值是3.0,其他的位置都是0
稀疏向量 [1] 通常用两部分表示:一部分是顺序向量,另一部分是值向量。例如稀疏向量(4,0,28,53,0,0,4,8)可用值向量(4,28,53,4,8)和顺序向量(1,0,1,1,0,0,1,1)表示。
7. Spark 中的向量
Spark MLlib 使用 Breeze jblas 来处理底层线性代数运算。它自定义了 org.apache.spark.
mllib.linalg.Vector 经工厂模式来创建和表示向量。
8. 向量操作
向量可两两相加、相减或与标量相乘。其他操作包括求平均值、正则化、比较和几何表示。
加法 :下面的代码展示了两个向量进行逐元素相加。
// 向量元素相加
val v1 = DenseVector(3, 7, 8.1, 4, 5)
val v2 = DenseVector(1, 9, 3, 2.3, 8)
def add(): Unit = {
println(v1 + v2)
}
该代码的结果为: DenseVector(4.0, 16.0, 11.1, 6.3, 13.0)
乘法和点乘 这种代数运算以等长度的两个数组为输入,输出一个数值。代数上,它是
两个数组的乘积之和。其数学表示如下。
 
import breeze.linalg.{DenseVector, SparseVector}
val sva = SparseVector(0.56390,0.36231,0.14601,0.60294,0.14535)
val svb = SparseVector(0.15951,0.83671,0.56002,0.57797,0.54450)
println(sva.t * svb)
println(sva dot svb)
对应的结果为:
0.9024889161, 0.9024889161
 
这个0.9024889161=0.56390*0.15951+0.36231*0.83671+0.14601*0.56002+0.60294*0.57797+0.14535*0.54450
正则化:每个向量都有大小,它通过毕达哥拉斯定理定义为|v| = sqrt(x2 + y2 + z2)。该大小是从原点到向量对应点的距离。正则向量的大小为 1。向量正则化表示对向量进行改变,以使得其长度为 1,但保持其从原点出发所指向的方向不变。因而,正则向量是方向与原向量相同,但范数(norm,即长度)为 1 的向量。它表示为 Xˆ 并定义如下:其中,| X |表示 X 的范数。该向量也称为单位向量。
import breeze.linalg.{norm, DenseVector, SparseVector} 
import breeze.stats.mean 
val v = DenseVector(-0.4326, -1.6656, 0.1253, 0.2877, -1.1465) 
val nm = norm(v, 1) 
// 正则化向量,使其范数为 1.0 
val nmlize = normalize(v) 
// 最后检查下正则向量的范数是否为 1.0 
println(norm(nmlize)) 
对应的输出如下:
Norm(of dense vector) = 3.6577 
Normalized vector is = DenseVector(-0.2068389122442966, 
 -0.7963728438143791, 0.05990965257561341, 0.1375579173663526, 
 -0.5481757117154094) 
其中(0.2068389122442966)²+(0.7963728438143791)²+····+(0.5481757117154094)²=1,注意他们的平方相加等于1,这个就是正则化后的改变
Norm(of normalized vector) = 0.9999999999999999
 
 
 
 

猜你喜欢

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