奇异值分解

  • 简介

    • PCA是通过特征值分解来进行特征提取的,但它要求矩阵必须是方阵,但在实际应用场景中,经常遇到的矩阵都不是方阵,如N个学生,每个学生有M门课程,其中N!=M, 这就组成了一个M*N的非方阵矩阵,这种情况下无法使用主成分分析,也限制了特征值分解方法的使用。而奇异值分解(SVD),是线性代数中重要的一种矩阵分解,该方法对矩阵的形状没有要求。
  • 原理
    • 在很多情况下,数据的一小段携带了数据集中大部分信息,而剩下的信息则要么是噪声,要么是毫不相关的信息。利用SVD实现,能够用小得多的数据集来表示原始数据集。这样做,实际上是去除了噪声和冗余数据。同样,当用户试图节省空间时,去除信息也是很有用的。
    • 假设是一个阶矩阵,则存在一个分解使得:Mm×n=Um×n∑m×nVn×nTM_{m \times n} = U_{m \times n} \sum_{m \times n} V_{n \times n}^T Mm×n​=Um×n​m×n∑​Vn×nT​
    • 式子中,为m×mm\times mm×m阶酉矩阵;∑\sum∑为半正定m×nm\times nm×n阶对角矩阵;而VTV^TVT,即V的共轭转置,是n*n阶酉矩阵。这样的分解就称为M的奇异值分解。∑\sum∑对角线上的元素∑i\sum i∑i,其中i即为M的奇异值。常见的做法是奇异值从大到小排列。
    • 奇异值的优点是:可以简化数据,压缩维度,去除噪声数据,提升算法结果。加快模型计算性能,可以针对任一普通矩阵进行分解(包括样本数小于特征数),不受限于方阵。
    • 奇异值的缺点是:转化后的数据难以理解,如何与具体业务知识对应起来是难点。
    • 那么在解决实际问题时如何知道保留多少个奇异值呢?
      • 一个典型的做法就是保留矩阵中90%的能量信息。为了计算总能量信息,将所有的奇异值求其平方和。于是可以将奇异值的平方和累加到总值的90%为止。
  • 实战
    • 使用奇异值分解进行图像压缩
    • u, sigma, v = np.linalg.svd(M)
      • 其中u和v返回矩阵M的左右奇异向量,sigma返回奇异值从大到小排列的一个向量。
    • 前置知识
      • 一般彩色图像就是RGB三个图层上矩阵的叠加,每个元素值为0~255,plt可以直接读取图像,对三个图层一一处理即可。
    • SVD进行压缩步骤
      • 读取图片,分解为RGB三个矩阵。
      • 对三个矩阵分别进行SVD分解,得到对应的奇异值和奇异向量。
      • 按照一定的标准进行奇异值筛选(整体数量的一定百分比,或者奇异值和的一定百分比)。
      • 恢复矩阵。
      • 保存图像。
    • 代码
      •   # -*-coding:utf-8-*-import numpy as npfrom matplotlib import pyplot as pltdef svdimage(filename, percent):"""读取原始图像数据:param filename::param percent::return:"""original = plt.imread(filename)  # 读取图像R0 = np.array(original[:, :, 0])  # 获取第一层矩阵数据G0 = np.array(original[:, :, 1])  # 获取第二层矩阵数据B0 = np.array(original[:, :, 2])  # 获取第三层矩阵数据u0, sigma0, v0 = np.linalg.svd(R0)  # 对第一层数据进行SVD分解u1, sigma1, v1 = np.linalg.svd(G0)  # 对第二层数据进行SVD分解u2, sigma2, v2 = np.linalg.svd(B0)  # 对第三层数据进行SVD分解R1 = np.zeros(R0.shape)G1 = np.zeros(G0.shape)B1 = np.zeros(B0.shape)total0 = sum(sigma0)total1 = sum(sigma1)total2 = sum(sigma2)# 对三层矩阵逐一分解sd = 0for i, sigma in enumerate(sigma0):  # 用奇异值总和的百分比来进行筛选R1 += sigma * np.dot(u0[:, i].reshape(-1, 1), v0[i, :].reshape(1, -1))sd += sigmaif sd >= percent * total0:breaksd = 0for i, sigma in enumerate(sigma1):  # 用奇异值总和的百分比来进行筛选G1 += sigma * np.dot(u1[:, i].reshape(-1, 1), v1[i, :].reshape(1, -1))sd += sigmaif sd >= percent * total1:breaksd = 0for i, sigma in enumerate(sigma2):  # 用奇异值总和的百分比来进行筛选B1 += sigma * np.dot(u2[:, i].reshape(-1, 1), v2[i, :].reshape(1, -1))sd += sigmaif sd >= percent * total2:breakfinal = np.stack((R1, G1, B1), 2)final[final > 255] = 255final[final < 0] = 0final = np.rint(final).astype('uint8')return finalif __name__ == '__main__':filename = 'data/example.jpg'for p in np.arange(.1, 1, .1):print('percent is {}'.format(p))after = svdimage(filename, p)plt.imsave('data/' + str(p) + '_1.jpg', after)
    • 运行效果(不同压缩比下)
  • 补充说明
    • 参考书为《Python3数据分析与机器学习实战》,对部分错误修改
    • 具体数据集和代码见我的Github,欢迎Star或者Fork

机器学习-降维之奇异值分解SVD算法原理及实战相关推荐

  1. 机器学习-降维之主成分分析PCA算法原理及实战

    主成分分析 前言 近年来,随着互联网和信息行业的发展,数据已经渗透到各行各业,成为重要的生产因素如数据记录和属性规模的急剧增长.社会已经进入大数据时代,数据越多越好似乎已经成为公理.然而,数据量并不是 ...

  2. 机器学习-集成之随机森林算法原理及实战

    Bagging和随机森林 前言 集成学习是目前机器学习的一大热门方向.简单来说,集成学习就是组合许多弱模型以得到一个预测结果比较好的强模型.对于常见的分类问题就是指采用多个分类器对数据集进行预测,把这 ...

  3. 机器学习-回归之逻辑回归算法原理及实战

    逻辑回归 简介 在一元回归和多元回归模型中,处理的因变量都是数值型区间变量,建立的模型描述的是因变量的期望与自变量之间的线性关系.然而,在实际的问题分析时,所研究的变量往往不全是区间变量而是顺序变量或 ...

  4. 利用计算机语言实现ID3算法,机器学习之决策树学习-id3算法-原理分析及c语言代码实现.pdf...

    机器学习之决策树学习-id3算法-原理分析及c语言代码实现.pdf 还剩 23页未读, 继续阅读 下载文档到电脑,马上远离加班熬夜! 亲,很抱歉,此页已超出免费预览范围啦! 如果喜欢就下载吧,价低环保 ...

  5. 奇异值分解SVD数学原理及代码(Python)

    奇异值分解SVD数学原理及代码(Python) 首先简单介绍一下什么是正交矩阵(酉矩阵) 如果 或 其中,E为单位矩阵,或,则n阶实矩阵A称为正交矩阵.正交矩阵是实数特殊化的酉矩阵,因此总是属于正规矩 ...

  6. 机器学习,深度学习基础算法原理详解(图的搜索、交叉验证、PAC框架、VC-维(持续更新))

    机器学习,深度学习基础算法原理详解(图的搜索.交叉验证.PAC框架.VC-维.支持向量机.核方法(持续更新)) 机器学习,深度学习基础算法原理详解(数据结构部分(持续更新)) 文章目录 1. 图的搜索 ...

  7. 奇异值分解(SVD)的原理详解及推导

    1. 写在前面 最近整理推荐系统模型的时候, 第二个模型打算整理一下隐语义模型, 这里面绕不开一种思想就是矩阵分解, 而作为矩阵分解的经典方法SVD感觉这次有必要学学了, SVD不仅是一个数学问题,在 ...

  8. 机器学习之朴素贝叶斯算法原理

    朴素贝叶斯(naive Bayes)法是基于贝叶斯定理与特征条件独立假设的分类方法.它和其他绝大多数的分类算法都不同. 对于大多数的分类算法,比如决策树,KNN,逻辑回归,支持向量机等,他们都是判别方 ...

  9. 机器学习之朴素贝叶斯算法原理+Python实现

    朴素贝叶斯 1.简介 ​ 贝叶斯分类算法是统计学中的一种概率分类方法,朴素贝叶斯分类是贝叶斯分类中最简单的一种.其分类原理就是利用贝叶斯公式根据某特征的先验概率计算出其后验概率,然后选择具有最大后验概 ...

最新文章

  1. 终于把时间序列分析的关键点全讲清楚了!
  2. GIS-001-gdal软件下载地址
  3. 【论文解读】​YOLOX: Exceeding YOLO Series in 2021
  4. SQL Tuning学习杂记
  5. 利用Windows server 2003 实现DHCP中继
  6. 资料分析-特殊增长率,综合分析
  7. 抛弃手册,开启TongWeb+TongLINK/Q的开发方式
  8. lbs与gis的计算机存储模式,什么是LBS、GIS
  9. mssql2000 mysql,MYSQL 与MSSQL2000 在修改表字段的区别
  10. 温敏壳聚糖水凝胶细胞因子复合支架/季铵盐壳聚糖水凝胶三维支架复合GNDF载间充质干细胞的制备
  11. 线极化波的matlab仿真过程,基于MATLAB的电磁波极化波仿真教学
  12. WordPress缩略图出现A TimThumb error has occured解决办法
  13. 自监督论文阅读笔记 Synergistic Self-supervised and Quantization Learning
  14. SQL Server2008从入门到精通pdf
  15. 【亲自验证】Navicat连接MySql提示无法加载身份验证插件“缓存_sha2_密码”?
  16. 现阶段云计算的市场运用
  17. 患病职工解除劳动关系可以吗
  18. 入门的Android架构师需要掌握哪些技能?
  19. Java--->Ajax(上)
  20. flutter 状态管理 flutter_bloc 的使用以及总结

热门文章

  1. 多租户(multi-tenant)
  2. Protobuf序列化的原理-varint
  3. 执行Bean 实例化
  4. Quartz框架中的Scheduler
  5. 代码演示:先来后到的特例、优劣、源码分析
  6. 算术运算符_四则与取模运算
  7. mybatis的二级缓存
  8. 拼接字符串的两种方式
  9. php将数组中元素打乱顺序,PHP公开课|学会随机打乱数组元素顺序的函数,你的PHP会学的更好...
  10. java 仿百度文库源码_java开发_模仿百度文库_SWFTools_源码下载