大家好,如果您还对奇异值分解(SVD)的5 个应用不太了解,没有关系,今天就由本站为大家分享奇异值分解(SVD)的5 个应用的知识,包括的问题都会给大家分析到,还望可以解决大家的问题,下面我们就开始吧!
好吧,我可以向你保证,事实并非如此。特别是如果您想开始数据科学的职业生涯。
线性代数弥合了理论与概念的实际实现之间的差距。掌握线性代数为我们认为难以理解的机器学习算法打开了大门。线性代数的一种应用是用于降维的奇异值分解(SVD)。
您在数据科学中一定多次遇到过SVD。它无处不在,尤其是当我们处理降维时。但它是什么?它是如何运作的? SVD有哪些应用?
事实上,SVD 是推荐系统的基础,而推荐系统是Google、YouTube、Amazon、Facebook 等大公司的核心。
1. 奇异值分解(SVD)的应用
我们将在这里遵循自上而下的方法,首先讨论SVD 应用程序。如果您对其工作原理感兴趣,我将在下面解释SVD 背后的数学原理。现在您只需要了解四件事就可以理解这些应用程序:
SVD是将矩阵A分解为3个矩阵——U、S和V。S是奇异值对角矩阵。将奇异值视为矩阵中不同特征的重要性值。矩阵的秩是矩阵中存储的唯一信息的度量。等级越高,掌握的信息就越多。矩阵的特征向量是数据的最大散布或方差的方向。在大多数应用中,我们希望将高秩矩阵简化为低秩矩阵,同时保留重要信息。
1.1 SVD用于图像压缩
我们已经遇到过多少次这个问题了?我们喜欢在智能手机上浏览图像并随机保存照片。然后突然有一天,提示手机没有空间!图像压缩有助于解决这个问题。
它将图像的大小(以字节为单位)最小化到可接受的质量水平。这意味着您可以在相同的磁盘空间中存储更多图像。
图像压缩利用了SVD后得到的只有部分奇异值较大的原理。你可以根据前几个奇异值对三个矩阵进行修剪,得到原始图像的压缩近似值,有些压缩图像人眼无法区分。下面是用Python 编写的代码:
# 下载图片’https://cdn.pixabay.com/photo/2017/03/27/16/50/beach-2179624_960_720.jpg’ import numpy as npimport pandas as pdimport matplotlib.pyplot as pltimport cv2# 灰度读取图像img=cv2.imread (‘beach-2179624_960_720.jpg’, 0)# 获取svdU, S, V=np.linalg.svd(img)# 获取矩阵的形状print(U.shape, S.shape, V.shape)# 绘制具有不同组件编号的图像comps=[638, 500, 400, 300, 200, 100]plt.figure(figsize=(16, 8))for i in range(6): low_rank=U[:comps[i ] ] @ np.diag(S[:comps[i]]) @V[:comps[i],] if(i==0): plt.subplot(2, 3, i+1), plt.imshow( low_rank , cmap=’灰色’), plt.axis(‘off’), plt.title(‘带有n_components=的原始图像=’ + str(comps[i])) else: plt.subplot(2, 3, i+1 ) , plt.imshow(low_rank, cmap=’gray’), plt.axis(‘off’), plt.title(‘n_components=’ + str(comps[i]))Output:
如果你说最后一张图也很好看!是的,如果没有之前的图像比较,我不会猜到这是压缩图像。
1.2 SVD图像恢复
我们将通过矩阵填充的概念(以及一个很酷的Netflix 示例)来理解图像恢复。
矩阵填充是填充部分观察到的矩阵中缺失元素的过程。 Netflix 问题就是一个常见的例子。
给定一个评分矩阵,其中每个元素(i,j)代表顾客i对电影j的评分,即顾客i观看了电影j,否则该值为缺失值,我们要预测剩余的元素,以便评估客户提出好的建议。
有助于解决这个问题的基本事实是,大多数用户在他们观看的电影以及他们给这些电影的评分中都有一个模式。因此,评级矩阵包含很少的独特信息。这意味着低秩矩阵提供了足够好的矩阵近似值。
这就是我们在SVD 的帮助下可以实现的。
您还在哪里见过这样的房产?是的,在图像矩阵中!由于图像是连续的,因此大多数像素的值取决于它们周围的像素。因此,低秩矩阵可以很好地近似这些图像。
这是结果的屏幕截图:
陈子涵. “奇异值分解及其在图像处理中的应用。”美国CM,2018
问题的整个表述可能很复杂,需要理解几个附加概念。
1.3 特征脸的SVD
《Eigenfaces for Recognition》论文发表于1991 年。在此之前,大多数面部识别方法都涉及识别单个特征,例如眼睛或鼻子,并根据这些特征的位置、大小和关系开发模型。
特征脸方法尝试提取面部图像中的相关信息,尽可能有效地对其进行编码,并将面部编码与数据库中的模型编码进行比较。
通过将每个人脸表示为新人脸空间中选定特征脸的线性组合来获得编码。
将此方法分为五个步骤:
收集面部训练集,通过查找最大方差的方向(特征向量或特征脸)来找到最重要的特征。选择与最高特征值对应的M 个特征脸。这些特征脸现在定义了一个新的面部空间。将所有数据投影到该面空间中。对于新面孔,将它们投影到新的面孔空间中。找到空间中最近的人脸,并将该人脸分类为已知或未知人脸。您可以使用PCA 和SVD 找到这些特征脸。这是我在Wild 数据集中的Labeled Faces 上执行SVD 后获得的几个特征脸中的第一个:
我们可以看到,只有前几行的图像看起来像真实的面孔。其他的看起来很糟糕,所以我抛弃了它们。我总共保留了120 个特征脸,并将数据转换到一个新的面部空间中。然后,我使用k 最近邻分类器根据面孔预测姓名。
您可以看到下面的细分报告。显然,还有改进的空间。您可以尝试调整特征脸的数量或尝试不同的分类器:
看一下一些预测值及其真实标签:
1.4 谱聚类的SVD
聚类是将相似的对象分组在一起的任务。这是一种无监督机器学习技术。对于我们大多数人来说,聚类与K 均值聚类是同义词,这是一种简单但功能强大的算法。然而,这并不是一个准确的说法。
考虑以下情况:
显然,同心圆中有2个簇。然而,n_clusters=2 的KMeans 给出以下聚类:
K-Means 绝对不是这里使用的合适算法。谱聚类是一种可以解决这个问题的技术,它源自图论。以下是基本步骤:
从数据亲和矩阵(A) 或邻接矩阵开始。这表明一个对象与另一对象的相似程度。在图中,这表示点之间是否存在边缘。找到每个对象的度矩阵(D)。这是一个对角矩阵,其元素(i, i) 等于与对象i 相似的对象的数量。查找亲和矩阵(L) 的拉普拉斯矩阵(L):L=A – D。根据特征值特征向量查找拉普拉斯矩阵的最高k,对这些特征向量运行k 均值,将对象聚类为k 个类。您可以通过下面的链接阅读完整的算法及其数学原理^2,并且scikit-learn 中谱聚类的实现与KMeans 类似:
from sklearn.datasets import make_circlesfrom sklearn.neighbors import kneighbors_graphfrom sklearn.cluster import SpectralClusteringimport numpy as npimport matplotlib.pyplot as plt# s生成数据X, labels=make_circles(n_samples=500, Noise=0.1, Factor=.2)# 可视化数据plt .scatter(X[: 0], X)# 可视化结果plt.scatter(X[: 0], X[: 1], c=s_cluster)plt.show() 你会得到如下不错的聚类结果从上面的代码可以看出:
1.5 SVD 用于去除视频背景
考虑如何区分视频的背景和前景。视频的背景基本上是静态的——看不到太多的变化。所有更改都在前台可见。这是我们用来将背景与前景分开的属性。
以下是我们可以采取的实施此方法的步骤:
从视频创建矩阵M – 这是通过定期从视频中采样图像快照,将这些图像矩阵展平为数组,并将它们存储为矩阵M 的列来完成的。我们得到矩阵M 的以下图形:
您认为这些水平线和波浪线代表什么?花点时间思考一下。
水平线代表在整个视频中不变的像素值。基本上,这些代表了视频中的背景。波浪线显示变化并代表前景。
因此,我们可以将M 视为两个矩阵的和- 一个代表背景,另一个代表前景。背景矩阵看不到像素的变化,因此是冗余的,即它没有很多独特的信息。因此,它是一个低秩矩阵。因此,M的低秩近似就是背景矩阵。我们在这一步中使用SVD。我们只需从矩阵M 中减去背景矩阵就可以得到前景矩阵。这是去除背景的视频帧:
到目前为止,我们已经讨论了SVD 的五个非常有用的应用。但SVD 背后的数学原理实际上是如何运作的呢?它对我们作为数据科学家有多大用处?让我们在下一节中了解这些要点。
2. SVD是什么?
2.1 矩阵的秩
矩阵的秩是矩阵中线性无关的行(或列)向量的最大数量。如果向量r 不能表示为r1 和r2 的线性组合,则向量r 被称为与向量r1 和r2 线性无关。
考虑以下三个矩阵:
在矩阵A中,行向量r2是r1的倍数,r2=2 r1,因此它只有一个无关的行向量。 Rank(A)=1 在矩阵B 中,行向量r3 是r1 和r2 之和,r3=r1 + r2,但r1 和r2 是独立的,Rank(B)=2 在矩阵C 中,所有3 行都等于彼此无事可做。 Rank(C)=3 矩阵的秩可以被认为是矩阵所表示的唯一信息量的表示。等级越高,信息量就越高。
2.2 奇异值分解
SVD 将一个矩阵分解为3 个矩阵的乘积,如下所示:
如果A 是m x n 矩阵:
U 是左奇异向量的mm 矩阵S 是按降序排列的奇异值的mn 对角矩阵V 是右奇异向量的nn 矩阵2.3 为什么使用SVD 进行降维?
您可能想知道为什么我们要经历这种看似费力的分解。其原因可以通过分解的替代表示来理解。见下图:
分解允许我们将原始矩阵表示为低秩矩阵的线性组合。
在实际应用中,你会观察到只有前几个(比如k)奇异值很大。其余奇异值接近于零。因此,除了前几个之外的所有内容都可以忽略,而不会丢失大量信息。看看下图中矩阵是如何截断的:
总结以下3点:
使用SVD,我们能够用3 个较小的矩阵U、S 和V 来表示我们的大矩阵A。这在大型计算中非常有用,我们可以获得A 的k 阶近似值。为此,请选择前k 个奇异值并相应地截断3 个矩阵。
3. 3种在Python中使用SVD的方法
我们知道SVD 是什么、它如何工作以及它在现实世界中的用途。但是我们自己如何实现SVD呢?
SVD 的概念听起来很复杂。您可能想知道如何找到U、S 和V 3 个矩阵。如果我们手动计算这些矩阵,这是一个漫长的过程。
幸运的是,我们不需要手动执行这些计算。我们可以通过三种简单的方式在Python 中实现SVD。
3.1 numpy中的SVD
NumPy 是Python 中科学计算的基础包。它具有有用的线性代数函数以及其他应用程序。
您可以在numpy.linalg 中使用SVD 获得完整的矩阵U、S 和V。注意,S是对角矩阵,这意味着它的大部分元素都是0。这称为稀疏矩阵。为了节省空间,S 作为一维奇异值数组而不是完整的二维矩阵返回。
import numpy as npfrom numpy.linalg import svd# 定义二维矩阵A=np.array([[4, 0], [3, -5]])U, S, VT=svd(A)print(‘Left奇异向量:’)print(U)print(‘奇异值:’) print(np.diag(S))print(‘右奇异向量:’) print(VT)#检查分解是否正确#@代表矩阵乘法print( U @ np .diag(S)@VT)3.2 scikit-learn 中截断的SVD
在大多数常见应用中,我们不想找到完整的矩阵U、S 和V。我们通过降维和潜在语义分析看到了这一点,还记得吗?
我们最终会修剪矩阵,那么为什么首先要找到完整的矩阵呢?
在这种情况下,最好使用sklearn.decomposition 中的TruncatedSVD。您可以通过n_components 参数指定要输出的所需特征数量。 n_components 应严格小于输入矩阵中的特征数量:
import numpy as npfrom sklearn.decomposition import TruncatedSVDA=np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])print(‘原始矩阵:’) print(A)svd=TruncatedSVD(n_components=2)A_transf=svd.fit_transform(A)print(‘奇异值:’)print(svd.singular_values_)print(‘减少到2个特征后的变换矩阵:’)print(A_transf)3.3 scikit-learn 中的随机SVD
原创文章,作者:小su,如若转载,请注明出处:https://www.sudun.com/ask/128262.html
用户评论
心贝
这篇文章介绍了奇异值分解的不同应用,非常全面!尤其是机器学习中的推荐系统和降维部分,受益匪浅。我一直想了解这些应用,终于有了一个清晰的理解。
有17位网友表示赞同!
绝版女子
没想到奇异值分解竟然有这么多的应用场景啊!原来我们平常使用的很多应用程序背后都有它的身影。这篇文章让我对SVD有了更深入的认识。
有20位网友表示赞同!
花菲
作为一名数据分析师,我一直用SVD降维处理数据,但是没有想到它还有这么多其他的应用。这篇文章开拓了我的眼界,我会尝试在其他领域应用SVD来解决问题。
有9位网友表示赞同!
日久见人心
这篇博文写的不错,讲解也很清楚。但个人感觉5个应用还是有点少,SVD的应用范围非常广泛啊!比如图像识别、文本挖掘等等,也都可以使用到SVD。
有5位网友表示赞同!
箜篌引
机器学习部分说的太浅了,希望作者能够深入一些,介绍更多关于SVD在推荐系统和降维中的具体算法和实现细节。
有16位网友表示赞同!
眉黛如画
我觉得把这些应用都罗列在一起有点儿乱,建议按应用场景分类更加清晰明了。这样读者更容易理解和记忆。
有15位网友表示赞同!
暖栀
图像压缩方面使用SVD的确是一种常用方法,但这种方法的效率并不如最新的压缩算法。作者应该介绍一下其他更先进的图像压缩技术。
有16位网友表示赞同!
﹎℡默默的爱
这篇文章对一些复杂的数学公式解释不够详细,对于没有深入学习矩阵分解基础知识的人来说,可能有些难以理解。
有11位网友表示赞同!
轨迹!
奇异值分解的确是一个强大的降维工具,但是它并不是万能的。在某些情况下,其他的降维方法可能更合适。作者应该多介绍一些其他降维算法的区别和应用场景。
有10位网友表示赞同!
几妆痕
SVD这个算法学习起来还挺难的,这篇博文写的比较简单易懂,很有帮助!
有14位网友表示赞同!
幸好是你
这篇文章让我对SVD有了初步的了解,后续我会继续深入学习它的理论知识和实践应用。
有20位网友表示赞同!
烟花巷陌
我一直在尝试使用SVD来处理一些文本数据,但是效果并不是很好。希望作者能够分享一下一些使用SVD进行文本挖掘的技巧和经验。
有7位网友表示赞同!
灼痛
这篇文章提到的几个应用场景都很有意思,我也想尝试在自己的项目中应用SVD看看效果如何。
有17位网友表示赞同!
隔壁阿不都
写的不错啊,帮我解决了困扰我很久的奇异值分解应用问题!
有5位网友表示赞同!
眷恋
对图像压缩部分的描述太简单了,希望能更加详细介绍SVD在图像重建和压缩中的原理以及具体实现步骤。
有8位网友表示赞同!
志平
文章缺少一些实际案例分析,这样更容易理解SVD在各领域的应用方式。例如,可以介绍一到两个具体的项目,说明如何使用SVD解决实际问题。
有18位网友表示赞同!
封锁感觉
我觉得这篇博文还可以在编程部分多加一些内容,比如可以用python代码展示如何使用SVD进行降维或者图像压缩之类的操作。
有20位网友表示赞同!