【机器学习实战】10分钟学会Python怎么用SVD奇异值分解进行降维分类(八)

简介: 【机器学习实战】10分钟学会Python怎么用SVD奇异值分解进行降维分类(八)

[toc]

1 前言

1.1 奇异值分解

奇异值分解(Singular Value Decomposition,SVD)是一种重要的矩阵分解技术,它可以将一个矩阵分解为三个矩阵的乘积,分别为左奇异矩阵、奇异值矩阵和右奇异矩阵。SVD 的原理可以描述如下:

对于任意 m X n 的矩阵 A,它的 SVD 分解为:

其中 A 是待分解的矩阵,U 是一个正交矩阵,$\sigma $ 是一个对角矩阵,V^T V 的转置。这个公式表示将 A 分解为三个矩阵的乘积,其中 U 和 V^T 表示矩阵 A 在左右两个方向上的正交基,$\sigma $ 表示每个基向量上的缩放因子,称为奇异值。

优点:

  • SVD 可以处理非方阵和稠密矩阵,这是其他矩阵分解方法(如LU分解和QR分解)无法处理的情况。
  • SVD 可以有效地进行降维,保留最重要的特征,从而可以在不影响模型性能的情况下减少特征数量。
  • SVD 分解得到的三个矩阵可以分别表示原矩阵在行空间、列空间和主对角线方向的信息,有助于对矩阵的性质和特征进行分析。

缺点:

  • SVD 运算时间复杂度较高,在处理大型矩阵时需要大量的计算资源。
  • SVD 分解后得到的矩阵可能存在精度问题,特别是对于非常接近零的奇异值。
  • SVD 分解的结果可能存在多解的情况,这需要根据实际问题和领域知识进行进一步的分析和处理。

1.2 奇异值分解的应用

奇异值分解是一种重要的矩阵分解方法,具有广泛的应用。以下是一些常见的应用场景:

  1. 数据降维:SVD 可以对高维数据进行降维处理,减少数据的冗余信息和噪声,提取最重要的特征。这种方法在数据挖掘、机器学习等领域广泛应用。
  2. 图像处理:SVD 可以将图像矩阵分解成三个矩阵,其中一个矩阵可以表示图像的主要特征,从而可以实现图像压缩、降噪等处理。此外,SVD 在图像水印、图像检索等方面也有重要应用。
  3. 推荐系统:SVD 可以将用户-物品评分矩阵分解成三个矩阵,其中一个矩阵可以表示用户的偏好特征,另一个矩阵可以表示物品的属性特征。这种方法在推荐系统中广泛应用,例如Netflix竞赛中的著名算法。
  4. 自然语言处理:SVD 可以对文本矩阵进行分解,提取文本的重要主题和特征,用于文本分类、文本聚类、文本推荐等任务。
  5. 信号处理:SVD 可以将信号分解成一系列奇异值,这些奇异值表示信号的能量和频率分布等信息,从而可以实现信号分离、降噪、压缩等处理。

2 简单计算SVD

2.1 NumPy 计算 SVD

在numpy.linalg中使用 SVD 获得完整的矩阵 U、S 和 V。请注意,S 是一个对角矩阵,这意味着它的大部分条目都是零。这称为稀疏矩阵。为了节省空间,S 返回为奇异值的一维数组而不是完整的二维矩阵

import numpy as np
from numpy.linalg import svd
# 将矩阵定义为二维numpy数组
A = np.array([[4, 0], [3, -5]])
U, S, VT = svd(A)
print("Left Singular Vectors:")
print(U)
print("Singular Values:") 
print(np.diag(S))
print("Right Singular Vectors:") 
print(VT)
print(U @ np.diag(S) @ VT)

2.2 scikit-learn 计算截断 SVD

一般情况下用sklearn.decomposition中的TruncatedSVD修剪我们的矩阵。可以将输出中所需的特征数指定为n_components参数。n_components 应严格小于输入矩阵中的特征数:

import numpy as np
from sklearn.decomposition import TruncatedSVD
A = np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])
print("Original Matrix:")
print(A)
svd =  TruncatedSVD(n_components = 2)
A_transf = svd.fit_transform(A)
print("Singular values:")
print(svd.singular_values_)
print("Transformed Matrix after reducing to 2 features:")
print(A_transf)

2.3 scikit-learn 计算随机 SVD

随机 SVD 给出与截断 SVD 相同的结果,并且计算时间更快。截断 SVD 使用精确求解器 ARPACK,而随机 SVD 使用近似技术。

import numpy as np
from sklearn.utils.extmath import randomized_svd
A = np.array([[-1, 2, 0], [2, 0, -2], [0, -2, 1]])
u, s, vt = randomized_svd(A, n_components = 2)
print("Left Singular Vectors:")
print(u)
print("Singular Values:") 
print(np.diag(s))
print("Right Singular Vectors:") 
print(vt)

3 demo数据演示

3.1 导入函数

加载cv2需要下载一下,在shell中下载用以下命令,在jupyter中运行记得加,这里为了齐全下载了opencv-contrib-python

pip install opencv-python   (如果只用主模块,使用这个命令安装)
pip install opencv-contrib-python (如果需要用主模块和contrib模块,使用这个命令安装)
# !pip install opencv-contrib-python
import numpy as np
import matplotlib.pyplot as plt
import cv2

3.2 导入数据

构建一个简单矩阵

A = np.ones((6, 6))
A[:,:2] = A[:,:2]*2
A[:,2:4] = A[:,2:4]*3
A[:,4:] = A[:,4:]*4
print(A)
# 定义颜色
our_map = 'hot'
#our_map = 'gray'
# 构建完整矩阵
U, S, VT = np.linalg.svd(A)
S = np.diag(S)

3.3 计算SVD

写一个一个构建绘制矩阵函数的def,类似于R的function,定义为draw_svd

def draw_svd(A,U, S, VT, our_map):
  plt.subplot(221 )
  plt.title('Original matrix')
  plt.imshow(A, cmap =our_map)
  plt.axis('off')
  plt.subplot(222)
  plt.title('U  matrix')
  plt.imshow(U, cmap =our_map)
  plt.axis('off')
  plt.subplot(223)
  plt.title('Sigma matrix')
  plt.imshow(S, cmap =our_map)
  plt.axis('off')
  plt.subplot(224)
  plt.title('V matrix')
  plt.imshow(VT, cmap =our_map)
  plt.axis('off')

如果对角线 sigma 值太小,出于数值/美学目的,我们将删除相应的非常小的 (u ), (v ) 元素。例如,如果一个奇异值是 1e-08 它不会影响重建,所以我们将这些小值设置为零:

def truncate_u_v(S, U, VT):
  threshold = 0.001
  s = np.diag(S)
  index = s < threshold
  U[:,index] = 0
  VT[index,:]=0
  return U, VT
U, VT = truncate_u_v(S, U, VT)
draw_svd(A, U, S, VT, our_map)

这里用秩r近似值(这里r = 1),也称rank-1 近似计算有多少个求和项:

r = 1
A0_r = np.matmul(U[:,:r] , S[:r,:r]) 
A0_r = np.matmul (A0_r , VT[:r,:])
plt.imshow(A0_r, cmap =  our_map)
plt.axis('off')

对于这个例子,我们之前已经看到标志可以表示为 rank-1 近似值。在 ($\sigma $) 矩阵中,第一个上部元素是唯一的非零元素。此外,请注意,矩阵 (U ) 和 (V ) 被归一化,因此它们的 L2 范数等于 1。(V ) 矩阵有一行,其元素决定了不同的颜色值。

求解前面部分的 ($2\times2 $) 矩阵的数值示例。稍后将 Python 获得的值与我们已经计算出的值进行比较:

A = [[1, 0], [1, 1]]
U, S, VT = np.linalg.svd(A)
S = np.diag(S)
print(f"U {U}\nS {S}\nVT {VT}")

4 讨论

SVD 正在将我们的矩阵 $(A ) 分解成一组向量 (v $) 和 $(u $),以及一个对角矩阵。将有用于乘法的列向量、行向量和标量。这实际上是奇异值分解,将矩阵分解为项:

如果我们有一个 rank = (2),我们可以将矩阵分解为:

image.png

如果 rank = (1),结果应该是这样的:

image.png

稍微复杂一点的分解是添加标量 (( ) – σ ),这将存储在对角矩阵中。我们对 rank-($2 $) 矩阵 ($2 $) 的基本分解:

image.png

这里很明显的一件事是,实际上我们可以将这些  σ 值视为加权系数。稍后,我们将它们存储在对角矩阵中。

SVD最常见的应用还是关于图像的,和笔者研究方向数据分析重合度不算高,后者只需要针对数据进行简单的降维即可,但对于图像压缩图像恢复
特征量谱聚类视频背景去除等对于我这个学生物统计的真的裂开,

SVD这一部分实在难啃,建议阅读原文细品:

  1. https://datahacker.rs/009-the-singular-value-decompositionsvd-illustrated-in-python/
  2. https://scicoding.com/how-to-calculate-singular-value-decomposition-svd-in-python/
目录
相关文章
|
28天前
|
存储 数据采集 人工智能
Python编程入门:从零基础到实战应用
本文是一篇面向初学者的Python编程教程,旨在帮助读者从零开始学习Python编程语言。文章首先介绍了Python的基本概念和特点,然后通过一个简单的例子展示了如何编写Python代码。接下来,文章详细介绍了Python的数据类型、变量、运算符、控制结构、函数等基本语法知识。最后,文章通过一个实战项目——制作一个简单的计算器程序,帮助读者巩固所学知识并提高编程技能。
|
28天前
|
小程序 开发者 Python
探索Python编程:从基础到实战
本文将引导你走进Python编程的世界,从基础语法开始,逐步深入到实战项目。我们将一起探讨如何在编程中发挥创意,解决问题,并分享一些实用的技巧和心得。无论你是编程新手还是有一定经验的开发者,这篇文章都将为你提供有价值的参考。让我们一起开启Python编程的探索之旅吧!
46 10
|
2月前
|
算法 Unix 数据库
Python编程入门:从基础到实战
本篇文章将带你进入Python编程的奇妙世界。我们将从最基础的概念开始,逐步深入,最后通过一个实际的项目案例,让你真正体验到Python编程的乐趣和实用性。无论你是编程新手,还是有一定基础的开发者,这篇文章都将为你提供有价值的信息和知识。让我们一起探索Python的世界吧!
|
2月前
|
并行计算 调度 开发者
探索Python中的异步编程:从基础到实战
在Python的世界里,异步编程是一种让程序运行更加高效、响应更快的技术。本文不仅会介绍异步编程的基本概念和原理,还将通过具体代码示例展示如何在Python中实现异步操作。无论你是初学者还是有经验的开发者,都能从中获益,了解如何运用这一技术优化你的项目。
|
2月前
|
数据处理 Python
探索Python中的异步编程:从基础到实战
在Python的世界中,“速度”不仅是赛车手的追求。本文将带你领略Python异步编程的魅力,从原理到实践,我们不单单是看代码,更通过实例感受它的威力。你将学会如何用更少的服务器资源做更多的事,就像是在厨房里同时烹饪多道菜而不让任何一道烧焦。准备好了吗?让我们开始这场技术烹饪之旅。
|
2月前
|
机器学习/深度学习 数据可视化 数据处理
掌握Python数据科学基础——从数据处理到机器学习
掌握Python数据科学基础——从数据处理到机器学习
46 0
|
2月前
|
机器学习/深度学习 数据采集 人工智能
机器学习入门:Python与scikit-learn实战
机器学习入门:Python与scikit-learn实战
65 0
|
8月前
|
机器学习/深度学习 存储 搜索推荐
利用机器学习算法改善电商推荐系统的效率
电商行业日益竞争激烈,提升用户体验成为关键。本文将探讨如何利用机器学习算法优化电商推荐系统,通过分析用户行为数据和商品信息,实现个性化推荐,从而提高推荐效率和准确性。
257 14
|
8月前
|
机器学习/深度学习 算法 数据可视化
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
实现机器学习算法时,特征选择是非常重要的一步,你有哪些推荐的方法?
142 1
|
8月前
|
机器学习/深度学习 算法 搜索推荐
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)
Machine Learning机器学习之决策树算法 Decision Tree(附Python代码)