机器学习 - SVD

本文介绍了奇异值分解(SVD)的基本概念,包括矩阵分解、奇异值及其作用。通过实例展示了SVD如何用于矩阵压缩和数据降维,指出SVD与PCA的密切关系。同时,讨论了SVD在协同过滤推荐系统中的应用,说明SVD如何帮助减少计算量并提升推荐效果。
摘要由CSDN通过智能技术生成

1. SVD

1.1 分解

如下图,一个矩阵可以分解为两个方阵和一个对角矩阵的乘积:


C = m * n;u = m * m;sigma = m * n;v' = n * n


1.2 奇异值

sigma是一个对角矩阵,但通常不是方阵。sigma的对角元素被称为奇异值,与特征值类似。因此与PCA类似,我们可以取sigma中最大的k个,来简化数据:

u' = m * k;sigma' = k * k;v'' = k * v


1.3 重构C矩阵

利用新的三个矩阵u',sigma',v''相乘仍然得到一个m * n的矩阵。如果你选择的k个奇异值所占的所有奇异值比例足够大,那么新得到的m * n的矩阵将与C非常接近。


2. SVD实践 - 矩阵压缩

# -*- coding: utf-8 -*-
"""
arr = 
    [[0, 0, 0, 2, 2], 
     [0, 0, 0, 3, 3], 
     [0, 0, 0, 1, 1],
     [1, 1, 1, 0, 0], 
     [2, 2, 2, 0, 0], 
     [5, 5, 5, 0, 0], 
     [1, 1, 1, 0, 0]]
    
u = 7 * 7

sigma = 7 * 5, 只返回了对角元素, 其余0元素被省略

V = 5 * 5
"""

import numpy as np

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

# 1. 分解
u, sigma, v = np.linalg.svd(arr)

# 2. 重构
new_arr = np.mat(u[:, 0:2]) * np.mat(np.diag(sigma[0:2])) * np.mat(v[0:2, :])

new_arr与arr非常接近,几乎相等。这其实是类似于图像压缩,只保留图像分解后的两个方阵和一个对角阵的对角元素,就可以恢复原图像。

  • 7
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 5
    评论
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值