SVD(奇异值分解)简化数据

SVD优点:简化数据、去除噪声、提高算法的结果

SVD是一个强大的降维工具,我们可以利用SVD来逼近矩阵并从中提取重要特征。通过保留矩阵80%~90%的能量,就可以得到重要的特征并去掉噪声。其中一个重要应用案例就是推荐引擎。

协同过滤的核心式相似度计算方法,有很多相似度计算方法都可以用于计算物品和用户之间的相似度。

3. 原理——矩阵分解

将原始的数据集矩阵data(m*n)分解成三个矩阵U(m*n), Sigma(n*m), VT(m*n):

对于Sigma矩阵:

  •  该矩阵只用对角元素,其他元素均为零
  • 对角元素从大到小排列。这些对角元素称为奇异值,它们对应了原始数据集矩阵的奇异值
  • 这里的奇异值就是矩阵data特征值的平方根。 
  • 在某个奇异值的数目( 1个 )之后,其他的奇异值都置为0。这就意味着数据集中仅有r个重要特征,而其余特征则都是噪声或冗余特征。 
    • 确认r——启发式策略
      • 保留矩阵中90%的能量信息,将奇异值平方和累加加到90%
      • 若有上万奇异值,则保留2-3k

svd分解计算公式在numpy中会有

输入:

import numpy as np
from numpy import linalg as la

data = np.array(
           [[4, 4, 0, 2, 2],
           [4, 0, 0, 3, 3],
           [4, 0, 0, 1, 1],
           [1, 1, 1, 2, 0],
           [2, 2, 2, 0, 0],
           [1, 1, 1, 0, 0],
           [5, 5, 5, 0, 0]])

U, Sigma, VT  = la.svd(data)
print('Sigma:',Sigma)
print(U.shape,Sigma.shape,VT.shape)
Sig = np.mat([
        [Sigma[0],0,0,0,0],
        [0,Sigma[1],0,0,0],
        [0,0,Sigma[2],0,0],
        [0,0,0,Sigma[3],0],
        [0,0,0,0,Sigma[4]]])

arr = U[:,:5] * Sig * VT[:5,:]
print(arr)

输出:

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 奇异分解(Singular Value Decomposition,SVD)是一种非常有用的矩阵分解方法,可以将一个矩阵分解为三个矩阵的乘积,分别是U、Σ和V的转置。 具体实现奇异分解的算法有很多种,其中一种较为常用的是基于Jacobi迭代的算法。下面是一个简单的C语言实现奇异分解的示例代码: ```c #include <stdio.h> #include <math.h> // 定义矩阵的行数和列数 #define M 3 #define N 3 // 执行奇异分解的函数 void svd_decomposition(float matrix[M][N], float U[M][M], float sigma[M][N], float V[N][N]) { // 先对矩阵进行转置 float matrix_t[N][M]; for(int i=0; i<N; i++){ for(int j=0; j<M; j++){ matrix_t[i][j] = matrix[j][i]; } } // 计算矩阵的乘积 matrix * matrix_t,并保存结果在 sigma 矩阵中 float product[M][N]; for(int i=0; i<M; i++){ for(int j=0; j<N; j++){ product[i][j] = 0; for(int k=0; k<N; k++){ product[i][j] += matrix[i][k] * matrix_t[k][j]; } } } // 对 product 矩阵进行奇异分解,得到 U、sigma 和 V 的转置 // 这里省略了具体的奇异分解算法 // 打印结果 printf("U 矩阵:\n"); for(int i=0; i<M; i++){ for(int j=0; j<M; j++){ printf("%.2f ", U[i][j]); } printf("\n"); } printf("sigma 矩阵:\n"); for(int i=0; i<M; i++){ for(int j=0; j<N; j++){ printf("%.2f ", sigma[i][j]); } printf("\n"); } printf("V 矩阵:\n"); for(int i=0; i<N; i++){ for(int j=0; j<N; j++){ printf("%.2f ", V[i][j]); } printf("\n"); } } int main() { // 示例矩阵 float matrix[M][N] = {{1, 2, 3}, {4, 5, 6}, {7, 8, 9}}; // 定义 U、sigma 和 V 矩阵 float U[M][M], sigma[M][N], V[N][N]; // 执行奇异分解 svd_decomposition(matrix, U, sigma, V); return 0; } ``` 以上示例代码实现了奇异分解的关键步骤,包括矩阵的转置、矩阵乘法和奇异分解算法。需要注意的是,这里只是简单地演示了奇异分解的实现思路,实际应用中可能需要根据具体的需求优化代码的性能和稳定性。 ### 回答2: 奇异分解(Singular Value Decomposition,简称SVD)是一种常用的矩阵分解方法,它可以将一个复杂的矩阵分解为三个简单的矩阵相乘的形式。SVD分解有很多应用领域,比如降维、推荐系统、图像处理等。 要用C语言实现奇异分解,首先需要理解SVD的原理和数学公式。以下是实现步骤的概括: 1. 读取需要分解的矩阵,可以使用二维数组来表示矩阵。 2. 对矩阵进行奇异分解,使用迭代或其他数计算方法计算矩阵的奇异、左奇异向量和右奇异向量。 3. 根据计算得到的奇异奇异向量,将原始矩阵分解为三个矩阵相乘的形式。 4. 可以根据需要选择保留的奇异个数,进而实现矩阵降维。 5. 具体应用时,可以根据需要对矩阵进行重构、推荐算法等。 在C语言中实现SVD需要适当的数学库和算法支持。可以使用已有的数学库,如LAPACK(Linear Algebra PACKage)等。这些库提供了一些矩阵运算函数和数计算算法,可以帮助我们完成SVD的计算过程。 整体而言,C语言实现奇异分解需要一定的数学背景和编程能力,需要了解奇异分解的原理和数学公式,并使用合适的数学库和算法实现计算过程。 ### 回答3: 奇异分解(Singular Value Decomposition,SVD) 是一种重要的矩阵分解方法,可以将一个矩阵分解为三个简化的矩阵之积,其中包括一个左奇异矩阵、一个奇异矩阵和一个右奇异矩阵。SVD 在很多应用中都有广泛的应用,比如推荐系统、图像处理和自然语言处理等领域。 要在 C 语言中实现奇异分解,可以按照以下步骤进行: 1. 导入所需的库,比如数计算库和线性代数库。 2. 定义需要分解的矩阵,并将其读入内存。 3. 利用数计算库提供的函数,计算矩阵的奇异分解。这些函数通常包括计算特征和特征向量以及矩阵相乘的功能。 4. 将计算得到的奇异矩阵和左右奇异矩阵保存到内存中,以备后续使用。 5. 进行进一步的数据处理和分析。比如根据需要,选择保留较大奇异,并相应地截断左奇异矩阵和右奇异矩阵。 最后,需要考虑的是,为了提高计算效率,还可以将 C 语言中的循环或者递归等常用技巧应用于奇异分解的实现过程中。 总之,奇异分解是一种重要的数学工具,在 C 语言中实现奇异分解可以通过调用相关的数计算库来完成。这样就能得到矩阵的奇异、左奇异矩阵和右奇异矩阵,为进一步的数据分析和处理提供了基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值