机器学习中的线性代数

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了机器学习中的线性代数相关的知识,希望对你有一定的参考价值。

机器学习中的线性代数线性代数作为数学中的一个重要的分支,广发应用在科学与工程中。掌握好线性代数对于理解和从事机器学习算法相关的工作

参考技术A 机器学习中的线性代数
线性代数作为数学中的一个重要的分支,广发应用在科学与工程中。掌握好线性代数对于理解和从事机器学习算法相关的工作是很有必要的,尤其是对于深度学习而言。因此,在开始介绍深度学习之前,先集中探讨一些必备的线性代数知识。
2.1 标量,向量,矩阵和张量
标量(scalar):一个标量就是一个单独的数。用斜体表示标量,如s∈R
.
向量(vector):一个向量是一列数,我们用粗体的小写名称表示向量。比如x
,将向量x
写成方括号包含的纵柱:
x=??????x1x2?xn??????

矩阵(matrix):矩阵是二维数组,我们通常赋予矩阵粗体大写变量名称,比如A。如果一个矩阵高度是m,宽度是n,那么说A∈Rm×n。一个矩阵可以表示如下:
A=[x11x21x12x22]

张量(tensor):某些情况下,我们会讨论不止维坐标的数组。如果一组数组中的元素分布在若干维坐标的规则网络中,就将其称为张量。用A表示,如张量中坐标为(i,j,k)的元素记作Ai,j,k。
转置(transpose):矩阵的转置是以对角线为轴的镜像,这条从左上角到右下角的对角线称为主对角线(main diagonal)。将矩阵A
的转置表示为A?
。定义如下:
(A?)i,j=Aj,i
A=???x11x21x31x12x22x32????A?=[x11x21x21x22x31x32]
2.2 矩阵和向量相乘
矩阵乘法是矩阵运算中最重要的操作之一。两个矩阵A
和B的矩阵乘积(matrix product)是第三个矩阵C。矩阵乘法中A的列必须和B的行数相同。即如果矩阵A的形状是m×n,矩阵B的形状是n×p,那么矩阵C的形状就是m×p
。即
C=A×B

具体的地,其中的乘法操作定义为
Ci,j=∑kAi,kBk,j

矩阵乘积服从分配律
A(B+C)=AB+AC

矩阵乘积也服从结合律
A(BC)=(AB)C

注意:矩阵乘积没有交换律
点积(dot product)两个相同维数的向量x
和y的点积可看作是矩阵乘积x?y
矩阵乘积的转置
(AB)?=B?A?

利用向量的乘积是标量,标量的转置是自身的事实,我们可以证明(10)式:
x?y=(x?y)?=y?x

线性方程组
Ax=b
2.3 单位矩阵和逆矩阵
线性代数中提供了矩阵逆(matrix inverse)的工具,使得我们能够解析地求解(11)中的A
.
单位矩阵(identity matrix):任意向量与单位矩阵相乘都不会改变。我们将保持n
维向量不变地单位矩阵记作为In,形式上In∈Rn×n

?x∈Rn,Inx=x

矩阵A的矩阵逆被记作A?1,被定义为如下形式:
A?1A=AA?1=In

(11)式方程组的求解:
Ax=bA?1Ax=A?1bInx=A?1bx=A?1b
方程组的解取决于能否找到一个逆矩阵A?1。接下来讨论逆矩阵A?1的存在的条件。
2.4 线性相关和生成子空间
如果逆矩阵A?1
存在,那么(11)式肯定对于每一个向量b恰好存在一个解。分析方程有多少个解,我们可以看成是A
的列向量的线性组合(linear combination)。
Ax=∑ixiA:,i

形式上,某个集合中向量的线性组合,是指每个向量乘以对应系数之后的和,即
∑iciv(i)

一组向量的生成空间(span)是原始向量线性组合后所能抵达的点的集合。
线性无关(linearly independent): 如果一组向量中的任意一个向量都不能表示成其他向量的线性组合,那么这组向量被称之为线性无关。
要想使矩阵可逆,首先必须矩阵是一个方阵(square),即m=n
,其次,所有的列向量都是线性无关的。
一个列向量线性相关的方阵被称为奇异的(singular)。
2.5 范数
有时候我们需要衡量一个向量的大小,在机器学习中,我们使用称为范数(norm)的函数来衡量矩阵大小,形式上,Lp
范数如下:
||x||p=(∑i|xi|p)12

其中p∈R,p≥1。
范数是将向量映射到非负值的函数。直观上来说,向量x
的范数就是衡量从原点到x
的举例。更严格来说,范数满足下列性质的函数:
f(x)=0?x=0

f(x+y)≤f(x)+f(y)
?α∈R,f(αx)=|α|f(x)

当p=2
时,L2被称作欧几里得范数(Euclidean norm)。它表示从原点出发到向量x确定的点的欧几里得距离。平方L2范数常被用来衡量向量的大小,因为它便于求导计算(如对向量中每个元素的导数只取决于对应的元素,但是它也有缺陷,即它在原点附近增长得十分缓慢),可以简单用点积x?x
来计算。
max 范数(max norm):这个范数表示向量中具有最大幅度得元素的绝对值,用L∞
范数表示,期形式为:
||x||∞=∑(i,j)A2i,j??????√
两个向量的点积(dot product)也可以用范数来表示。具体地,

x?y=||x||2||y||2cosθ
2.6 特殊类型的矩阵和向量
对角矩阵(diagonal matrix)只在主对角线上含有非零元素,其它位置都是零。矩阵D
是对角矩阵,当且仅当?i≠j,Di,j=0,用diag(v)表示一个对角元素由向量v
中元素给定的对角矩阵。
对称(symmetric) 矩阵是任意转置和自己相等的矩阵:
A=A?
即在矩阵A中,有Ai,j=Aj,i。
单位向量(unit vector)是具有单位范数(unit norm)的向量:
||x||2=1
如果x?y=0,那么向量x和向量y互相正交(orthogonal)。如果两个向量都有非零范数,那么表示这两个向量之间的夹角是90 度。在Rn中,至多有n个范数非零向量互相正交。如果这些向量不仅互相正交,并且范数都为1,那么我们称它们是标准正交(orthonormal)。
正交矩阵(orthonormal matrix)是指行向量是标准正交的,列向量是标准正交的方阵:
A?A=AA?=I
这意味着
A?1=A?

所以正交矩阵受到关注是因为求逆计算代价小。需要注意正交矩阵的定义。反直觉地,正交矩阵的行向量不仅是正交的,还是标准正交的。对于行向量或列向量互相正交但不是标准正交的矩阵没有对应的专有术语。
2.7 特征分解
许多数学对象可以通过将它们分解成多个组成部分,或者找到它们的一些属性而被更好地理解,这些属性是通用的,而不是由我们选择表示它们的方式引起的。就像我们可以通过分解质因数来发现一些关于整数的真实性质,我们也可以通过分解矩阵来获取一些矩阵表示成数组元素时不明显的函数性质。
特征分解(eigendecomposition)是使用最广的矩阵分解之一,即我们将矩阵分解成一组特征向量和特征值。
方阵A
的特征向量(eigenvector)是指与A相乘后相当于对该向量进行缩放的非零向量v

Av=λv
标量λ被称为这个特征向量对应的特征值(eigenvalue)。
如果v
是A的特征向量,那么任何放缩后的向量sv(s∈R,s≠0)也是A
的特征向量并且其与bf v 有相同的特征值。所以我们通常只考虑单位特征向量。
假设矩阵A
有n个线性无关的特征向量v(1),v(2),...,v(n),对应着的特征值λ1,λ2,...,λn
,我们将特征向量连成一个矩阵,使得每一列是一个特征向量:
V=[v(1),v(2),...,v(n)]
类似地,特征值连成一个向量:
λ=[λ1,λ2,...,λn]?
因此bf A 的特征分解(eigendecomposition)可以记作:
A=Vdiag(λ)V?1
上面我们构建具体特定的特征值和特征向量,能够使我们在目标方向上延伸空间。我们也常常希望将矩阵分解(decompose)成特征值和特征向量。这样可以帮助我们分析矩阵的特定性质,就像质因数分解有助于我们理解整数。
不是每一个矩阵都可以分解成特征值和特征向量,在某些情况下,特征分解会涉及到复数,而非实数。在本书的机器学习学习中,我们只讨论一类简单分解的矩阵。具体就是,每个实对称矩阵都可以分解为实特征向量和实特征值:
A=QΛQ?
其中Q是A的特征向量组成的正交矩阵,Λ是对角矩阵。特征值Λi,i对应的特征向量是矩阵Q的第i列,记作Q:,i。因为Q是正交矩阵,所以可以将A看作是沿方向v(i)延展λi倍的空间。如下图所示:
2.8 迹运算
迹运算返回的是矩阵对角元素的和:
Tr(A)=∑iAi,i
迹运算因为很多原因而受到关注。若不使用求和符号,有些矩阵运算很难描述,而通过矩阵乘法和迹运算符号,可以进行清楚地表示。例如,迹运算提供了另一种描述矩阵Frobenius 范数的方式:
||A||F=Tr(AA?)????????√
用迹运算表示式,使我们可以用很多有用的性质来操纵表示式。例如迹运算在转置下是不变的:
Tr(A)=Tr(A?)
多个矩阵乘积的迹还满足链式规律,即:
Tr(ABC)=Tr(BCA)=Tr(CAB)

标量的迹是它本身:a=Tr(a)。
2.9 行列式
行列式,记作det(A)
,是一个将方阵A
映射到实数的函数。行列式等于矩阵特征值的乘积。行列式的绝对值可以被认为是衡量矩阵相乘后空间扩大或者缩小了多少。如果行列式是0, 那么空间至少沿着某一维完全收缩了,使其失去了所有的体积。如果行列式是1, 那么矩阵相乘没有改变空间体积。
总结
以上是在机器学习过程中必须了解和掌握的有关线性代数的知识

使用tensorflow实现机器学习中的线性拟合

使用tensorflow实现机器学习中的线性拟合
这个例子是模拟的单变量线性回归,通过提高单变量的阶数来增加特征数量,例如:4阶相当于分解为四个特征
这种思想同样适用于多变量线性回归

        import tensorflow as tf
        import numpy as np
        import matplotlib.pyplot as plt
        plt.rcParams[‘font.sans-serif‘]=[‘FangSong‘] # 用来正常显示中文标签
        plt.rcParams[‘axes.unicode_minus‘]=False# 用来正常显示负号
        plt.title(‘四阶多项式拟合‘)        
        
        #数据准备
        n_samples =100
        #数据集
        X = np.linspace(-3, 3, n_samples)
        #数据集标签,需要拟合的结果
        Y = np.sin(X) + np.random.uniform(0,1,n_samples)
        
        #静态图定义
        mg = tf.Graph()
        with mg.as_default():
            #占位
            xs = tf.placeholder(dtype=tf.float32,name=‘xs‘)
            ys = tf.placeholder(dtype=tf.float32,name=‘ys‘)
             
            #需要训练的权重变量
            w1 = tf.Variable(tf.random_normal([1]),name=‘w1‘)
            w2 = tf.Variable(tf.random_normal([1]),name=‘w2‘)
            w3 = tf.Variable(tf.random_normal([1]),name=‘w3‘)
            w4 = tf.Variable(tf.random_normal([1]),name=‘w4‘)
            b = tf.Variable(tf.zeros(1),name=‘b‘)
            
            #多项式公式
            my_pred = []
            my_pred.append(tf.multiply(w1,xs)) 
            my_pred.append(tf.multiply(w2,tf.pow(xs,2)))
            my_pred.append(tf.multiply(w3,tf.pow(xs,3)))
            my_pred.append(tf.multiply(w4,tf.pow(xs,4)))
            y_pred = tf.add(tf.add_n(my_pred), b)
                        
            #损失函数:使用样本方差
            loss = tf.reduce_sum(tf.pow(y_pred-ys, 2)) / (len(X)-1)

            #学习率,其实就是用多大的步进持续学习
            lr = 0.01
            #学习的轮数
            epochs = 1000
            #使用梯度下降法优化
            optimizer = tf.train.GradientDescentOptimizer(learning_rate=lr).minimize(loss)
        
        with tf.Session(graph=mg) as sess:
            sess.run(tf.global_variables_initializer())
            for epoch in range(epochs):
                total_loss = 0
                for x,y in zip(X,Y):
                    _,tmp_loss = sess.run([optimizer,loss],feed_dict={xs:x,ys:y})
                    total_loss += tmp_loss
                if epoch%10 == 0:
                    print(‘epoch{:} the loss {:}‘.format(epoch,total_loss))
            #获取系统优化结果
            mgw1,mgw2,mgw3,mgw4,mgb = sess.run([w1,w2,w3,w4,b])
        #session中的变量自动转换为全局变量
        print(mgw1,mgw2,mgw3,mgw4,mgb)
        #最终的拟合函数
        YY= X*mgw1 + X**2*mgw2 + X**3*mgw3 + X**4*mgw4 + mgb
        plt.plot(X, Y, ‘bo‘, label=‘原始数据‘)
        plt.plot(X, YY, ‘r‘, label=‘拟合数据‘)
        plt.legend()
        plt.show()  

 技术图片

以上是关于机器学习中的线性代数的主要内容,如果未能解决你的问题,请参考以下文章

机器学习中的线性代数

机器学习中的线性代数之矩阵求导

如何搞懂机器学习中的线性回归模型?机器学习系列之线性回归基础篇

机器学习中的线性模型

使用tensorflow实现机器学习中的线性拟合

机器学习(线性相关)