机器学习-->矩阵和线性代数

来源:互联网 发布:宇多田光知乎 编辑:程序博客网 时间:2024/06/07 13:13

本篇博文将主要总结机器学习里面的线性代数知识。分以下几个主题,但是不做详细的证明,只做总结。

  • 矩阵
    SVD
    状态转移矩阵

  • 特征值和特征向量
    对称阵
    正交阵
    正定阵

  • 矩阵求导
    向量对向量求导
    标量对向量求导
    标量对矩阵求导

矩阵

SVD(奇异值分解)

奇异值分解(Singular Value Decomposition)是一种重要的矩阵分解方法。

假设矩阵A是一个m*n阶实矩阵,则存在一个分解使得:
这里写图片描述

假设A是一个M * M的矩阵,那么得到的U是一个M * M的方阵(里面的向量是正交的,U里面的向量称为左奇异向量),Σ是一个M * N的矩阵(除了对角线的元素都是0,对角线上的元素称为奇异值),这里写图片描述(V的转置)是一个N * N的矩阵,里面的向量也是正交的,V里面的向量称为右奇异向量)

Σ对角线上的元素称为矩阵A的奇异值;
U的第i列称为A的关于σi的左奇异向量;
V的第i列称为A的关于σi的右奇异向量。

那么如何求出这里写图片描述这里写图片描述这里写图片描述 矩阵呢?

首先,我们将一个矩阵A的转置这里写图片描述 乘以矩阵A,将会得到一个对称方阵,由定理:实对称矩阵必可对角化,且特征向量正交。于是我们可以得到:

这里写图片描述

这里得到的v,就是我们上面的右奇异向量。此外我们还可以得到:
这里写图片描述

这里的σ就是上面说的奇异值,u就是上面说的左奇异向量。

通常将奇异值由大而小排列。奇异值σ跟特征值类似,在矩阵Σ中也是从大到小排列,而且σ的减少特别的快,在很多情况下,前10%甚至1%的奇异值的和就占了全部的奇异值之和的99%以上了。也就是说,我们也可以用前r大的奇异值来近似描述矩阵,这里定义一下部分奇异值分解:
这里写图片描述

这里写图片描述

这里我们假设前三个奇异值占到全部奇异值总和的99%以上,那么上式约等于:

这里写图片描述
这里UV是特征的话,那么SVD就起到一个特征选择的作用或者是降维的作用,在pca降维时用到类似思想

也即是:
这里写图片描述

r是一个远小于m、n的数。矩阵U和V都是单位正交方阵:UTU=I, VTV=I。

SVD应用案例代码:对图像提取主成分

#!/usr/bin/python#  -*- coding:utf-8 -*-import numpy as npimport osfrom PIL import Imageimport matplotlib.pyplot as pltdef restore1(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量    m = len(u)    n = len(v[0])    a = np.zeros((m, n))    for k in range(K):        uk = u[:, k].reshape(m, 1)        vk = v[k,:].reshape(1, n)        a += sigma[k] * np.dot(uk, vk)    a[a < 0] = 0    a[a > 255] = 255    # a = a.clip(0, 255)    return np.rint(a).astype('uint8')def restore2(sigma, u, v, K):  # 奇异值、左特征向量、右特征向量    m = len(u)    n = len(v[0])    a = np.zeros((m, n))    for k in range(K+1):        for i in range(m):            a[i] += sigma[k] * u[i][k] * v[k]    a[a < 0] = 0    a[a > 255] = 255    return np.rint(a).astype('uint8')## 上面的restore1和restore2都是用来计算sigma*u*v,其效果一样if __name__ == "__main__":    A = Image.open("son.png", 'r')    output_path = r'.\Pic'    if not os.path.exists(output_path):        os.mkdir(output_path)    a = np.array(A)    K = 50    ## 分别在RGB三个通道上,利用SVD分解出u,sigma,v三个矩阵    u_r, sigma_r, v_r = np.linalg.svd(a[:, :, 0])    u_g, sigma_g, v_g = np.linalg.svd(a[:, :, 1])    u_b, sigma_b, v_b = np.linalg.svd(a[:, :, 2])    plt.figure(figsize=(10,10), facecolor='w')    for k in range(1, K+1):        ## 分别提取在RGB三个颜色通道上的主成分,然后进行堆叠形成新的像素点        R = restore2(sigma_r, u_r, v_r, k)        G = restore2(sigma_g, u_g, v_g, k)        B = restore2(sigma_b, u_b, v_b, k)        I = np.stack((R, G, B), axis=2) ## axis=2表示对应元素级的堆叠        ##Image.fromarray(I).save('%s\\svd_%d.png' % (output_path, k))        if k <= 24:            plt.subplot(6, 4, k)            plt.imshow(I)            plt.axis('off')            plt.title(u'奇异值个数:%d' % k)    plt.suptitle(u'SVD与图像分解', fontsize=20)    plt.tight_layout(0.3, rect=(0, 0, 1, 0.92))    # plt.subplots_adjust(top=0.9)    plt.show()

范德蒙行列式

这里写图片描述

状态转移矩阵
考虑某随机过程π,它的状态有n个,用1~n 表示。记在当前时刻t时位于i状态,它在t+1 时刻位于j状态的概率为P(i,j)=P(j|i):即状态转移的概率只依赖于前一个状态。

这里写图片描述

第n+1次的迭代中处于第j个状态的概率为:

这里写图片描述

因此,矩阵P即为(条件)概率转移矩阵。
那么初始概率分布π对最终分布有什么样的影响呢?

这里我们以初始概率π= [0.21, 0.68, 0.1]迭代,状态转移矩阵P为:
这里写图片描述,那么迭代结果如何呢?

这里写图片描述

可以看出在迭代到第六次时,其结果已经稳定了,几乎不发生变化了。

那么我们在换个初值看看结果如何?初始概率π= [0.75, 0.15, 0.1]的迭代结果
这里写图片描述

同样迭代到一定次数后,其结果几乎也不发生变化了。并且结果和上面的结果一致。

初始概率不同,但经过若干次迭代, π最终 稳定收敛在某个分布上。
从而,这是转移概率矩阵P的性质,而非初始分布的性质。事实上,上述矩阵P的n次幂, 每行都是(0.286,0.489,0.225),n>20。

特征值和特征向量

矩阵和向量的乘法

A为m×n的矩阵, x为n×1的列向量,则A*x 为m×1的列向量,记 这里写图片描述

由于n维列向量和n维空间的点一一对应,上 式实际给出了向量从n维空间的点到m为空间点的 线性变换。同样的道理,我们可以对向量做旋转,平移等等操作。

一个矩阵乘以一个向量后得到的向量,其实就相当于将原来的向量进行了线性变换。

矩阵的秩

这里写图片描述

对于n元线性方程组Ax=b,

  • 无解的充要条件是R(A)< R(A,b)
  • 有唯一解的充要条件是R(A)=R(A,b)=n
  • 有无限多解的充要条件是R(A)=R(A,b)< n
  • Ax=0有非零解的充要条件是R(A)< n
  • Ax=b有解的充要条件是R(A)=R(A,b)

正交阵

若n阶矩阵A满足ATA=I,成A为正交矩阵, 简称正交阵。

A是正交阵的充要条件:A的列(行)向量都是单 位向量,且两两正交。

A是n阶矩阵,若数λ和n维非0列向量x满足 Ax=λx,那么,数λ称为A的特征值,x称为A 的对应于特征值λ的特征向量。

根据定义,立刻得到(A-λI)x = 0,令关于λ 的多项式|A-λI|为0,方程|A-λI|=0的根为A的特征值; 将根λ0带入方程组(A-λI)x = 0,求得到的非零解,即λ0对应的特征向量。

特征值的性质:
设n阶矩阵A=(aij) 的特征值为λ1,λ2,…λn,则

  • λ1+λ2+…+λn=a11+a22+…+ann
  • λ1λ2…λn=|A|
  • λ2是A2的特征值
  • A可逆时,λ-1是A-1的特征值

矩阵A主行列式的元素和,称作矩阵A的迹。

不同特征值对应的特征向量:设λ1,λ2,…,λm是方阵A的m个特征值,p1,p2,…,pm是依 次与之对应的特征向量,若λ1,λ2,…,λm各不相等,则 p1,p2,…,pm线性无关。

实对称阵的特征值是实数。
实对称阵不同特征值的特征向量正交
实对称矩阵肯定能对角化
设A为n阶对称阵,则必有正交阵P,使得
这里写图片描述

Λ是以A的n个特征值为对角元的对角阵。
该变换称为“合同变换”,A和Λ互为合同矩阵。

白化/漂白whitening

计算观测数据x的n×n的对称阵 的特征 值和特征向量,用特征值形成对角阵D,特
征向量形成正交阵U,则这里写图片描述

这里写图片描述

可以看出 x 到 这里写图片描述变换中,使得 这里写图片描述,就是使得 这里写图片描述变成正交矩阵,即是每列或者是每行正交,如果每一列或者每一行是一个特征的话,我们做了这样的变换后最大限度的使得特征之间不相关,最大程度减少特征之间的共线性。

正定阵
对于n阶方阵A,若任意n阶向量x,都有 xTAx>0,则称A是正定阵。若条件变成xTAx≥0,则A称作半正定阵。

给定任意m×n的矩阵A,这里写图片描述一定是半 正定方阵。

正定阵的判定:

  • A的特征值都为正;
  • A的顺序主子式大于0

QR分解
对于m×n的*列满秩矩阵***A,必有:

这里写图片描述

其中,这里写图片描述(Q为列正交矩阵),R为非奇异 上三角矩阵。当要求R的对角线元素为正时, 该分解唯一。

QR分解可以通过Schmidt正交化来实现,具体的可以参考这篇博文QR分解

QR分解可以用来求矩阵的逆,特征值等。
比如求矩阵A的逆:我们可以将矩阵A进行分解得:A=QR,那么这里写图片描述,因为R是上三角,故其逆很好求。

QR分解求方阵A的特征值:

这里写图片描述

上述每一步不断的左乘这里写图片描述右乘这里写图片描述,然后左乘这里写图片描述右乘这里写图片描述,每一步都在增强,每一步得出的矩阵都是与原始矩阵A相似最终把矩阵R对角线上面部分消去,只剩下对角线上的值。最后就求出原始方阵的特征值。

矩阵求导

向量偏导公式:
这里写图片描述

这里写图片描述

标量对向量的导数

A为n×n的矩阵, x为n×1的列向量,记 这里写图片描述

那么可得:这里写图片描述

标量对方阵的导数

A为n×n的矩阵, |A|为A的行列式。

这里写图片描述

原创粉丝点击