当前位置: 首页 > news >正文

【Python机器学习】利用SVD简化数据——示例:基于SVD的图像压缩

通过可视化的方式,我们可以很容易的看到SVD对数据近似的效果。在代码库中,有一张手写的数字图像。原始的图形大小是32*32=1024像素,我们可以尝试对图像进行压缩,那么就可以节省空间或带宽开销了。

我们可以使用SVD来对数据降维,从而实现图像的压缩。下面我们可以看到利用SVD的手写数字图像的压缩过程:

def printMat(inMat,thresh=0.8):for i in range(32):for k in range(32):if float(inMat[i,k])>thresh:print(1, end=' ')else:print(0, end=' ')print('')
def imgCompress(numSV=3,thresh=0.8):myl=[]for line in open('test/0_5.txt').readlines():newRow=[]for i in range(32):newRow.append(int(line[i]))myl.append(newRow)myMat=mat(myl)print('*****original matrix*****')printMat(myMat,thresh)U,Sigma,VT=la.svd(myMat)SigRecon=mat(zeros((numSV,numSV)))for k in range(numSV):SigRecon[k,k]=Sigma[k]reconMat=U[:,:numSV]*SigRecon*VT[:numSV,:]print('*****reconstruced matrix using %d singular values*****' % numSV)printMat(reconMat,thresh)

上述代码中第一个函数printMat()的作用是打印矩阵。由于矩阵包含了浮点数,因此必须定义浅色和深色。这里通过一个阈值来界定,后面也可以调节该值。该函数遍历所有的矩阵元素,当元素大于阈值时打印1,否则打印0。

第二个函数实现了图像的压缩。它允许基于任意给定的奇异值数目来重构图像。该函数构建了一个列表,然后打开文本文件,并从文件中以数值方式读入字符。在矩阵调入之后,我们就可以在屏幕上输出该矩阵了。接下来就开始对原始图像进行SVD分解并重构图像。在代码中,通过将Sigma重新构成SigRecon来实现这一点。Sigma是一个对角矩阵,因此需要建立一个全0矩阵,然后将前面的那些奇异值填充到对角线上,最后通过截断的U和V^{T}矩阵,用SigRecon得到重构后的矩阵,该矩阵通过printMat()函数输出。

下面看实际运行效果:

可以看到,只需要两个奇异值就能相当准确地对图像实现重构。U和V^{T}都是32*2的矩阵,有两个奇异值,因此总数字数目是64+64+2=130,和原数目1024相比,压缩比是接近10倍。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 倍增算法 最近公共祖先(LCA)C++
  • 低代码开发:机遇与挑战并存的技术革新
  • 大数据系列之:Doris Kafka Connector,实时消费Kafka Topic中的数据同步到Doris数据库
  • 【sql】MySQL中的 JOIN 操作
  • react-redux的使用
  • Java编程中接口与实现分离的七种关键技术和设计模式
  • 【OpenHarmony4.1 之 U-Boot 2024.07源码深度解析】019 - RK3568 Uboot 完整流程梳理
  • plantUML介绍和使用
  • python:画由两条抛物线所围成的图形
  • Vue 3 深入指南:`watch` 属性监控与响应式处理
  • 深入理解java web分层架构的高内聚低耦合
  • 力扣热题100_二分查找_74_搜索二维矩阵
  • WPF学习(8) --Windows API函数的使用
  • SSM环保知识普及平台—计算机毕业设计源码20330
  • JavaScript AI 编程助手
  • “寒冬”下的金三银四跳槽季来了,帮你客观分析一下局面
  • 【译】理解JavaScript:new 关键字
  • 77. Combinations
  • const let
  • Java|序列化异常StreamCorruptedException的解决方法
  • ng6--错误信息小结(持续更新)
  • node和express搭建代理服务器(源码)
  • oschina
  • php的插入排序,通过双层for循环
  • Python实现BT种子转化为磁力链接【实战】
  • Redux 中间件分析
  • Vim Clutch | 面向脚踏板编程……
  • 前端 CSS : 5# 纯 CSS 实现24小时超市
  • 双管齐下,VMware的容器新战略
  • 微信支付JSAPI,实测!终极方案
  • 详解NodeJs流之一
  • 小试R空间处理新库sf
  • 学习HTTP相关知识笔记
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • ​configparser --- 配置文件解析器​
  • ​猴子吃桃问题:每天都吃了前一天剩下的一半多一个。
  • !! 2.对十份论文和报告中的关于OpenCV和Android NDK开发的总结
  • #pragam once 和 #ifndef 预编译头
  • #pragma预处理命令
  • $.each()与$(selector).each()
  • (MIT博士)林达华老师-概率模型与计算机视觉”
  • (纯JS)图片裁剪
  • (分享)一个图片添加水印的小demo的页面,可自定义样式
  • (七)微服务分布式云架构spring cloud - common-service 项目构建过程
  • (原创)Stanford Machine Learning (by Andrew NG) --- (week 9) Anomaly DetectionRecommender Systems...
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • * 论文笔记 【Wide Deep Learning for Recommender Systems】
  • ./configure,make,make install的作用(转)
  • .aanva
  • .java 指数平滑_转载:二次指数平滑法求预测值的Java代码
  • .net core 源码_ASP.NET Core之Identity源码学习
  • .NET delegate 委托 、 Event 事件,接口回调
  • .NET 同步与异步 之 原子操作和自旋锁(Interlocked、SpinLock)(九)
  • .NET牛人应该知道些什么(2):中级.NET开发人员
  • /etc/apt/sources.list 和 /etc/apt/sources.list.d