引言

主成分分析(PCA)是一种线性降维技术(算法),可将一组相关变量(p)转换为较小的k(k<p)个不相关变量,称为主成分,同时保持变量的最大可变性。

主成分分析的一个用例是它可以用于图像压缩分析-- 这种技术可以最小化图像的字节大小,同时尽可能保持图像的质量。在这篇文章中,我们将通过使用 MNIST 手写数字的数据集来讨论这种技术。

让我们开始吧!

加载数据集

MNIST 数据集包含手写数字的图像数据。因为它是 CSV 文件格式,所以让我们使用 Pandas 的 read_CSV()函数来加载它。

import pandas as pd
mnist = pd.read_csv('mnist.csv')
mnist.head()

每一行包含一个图像的像素值。构成图像的像素可视为图像数据的尺寸(列/变量)。“ label”列包含数字(0-9)的值。我们的分析不需要这一栏,因为主成分分析是一个非监督式学习任务,不处理标签数据。所以,我们可以简单地删掉这一栏。

mnist.drop(columns='label', inplace=True)
mnist.head()

现在,数据集的维度是:

mnist.shape
#(60000, 784)

这个数据集包含60,000张28x28(784)像素的图像!

显示图像

让我们显示 MNIST 数据集中的第二个图像(行)。此图像应包含数字“0”,因为第二行的标签列值为“0”。

import matplotlib.pyplot as pltsecond_image = mnist.iloc[1].values.reshape([28,28])
plt.imshow(second_image, cmap='gray_r')
plt.title('Second image: Digit 0', fontsize=15, pad=15)
plt.savefig("Second image.png")

缩放

由于主成分分析对数据的尺度非常敏感,如果数据不是在相似尺度上测量的,那么在应用主成分分析之前必须进行特征尺度缩放。

在 MNIST 数据集中,每个图像的像素值范围从0到255(类似比例)。例如:

#2nd image
print(mnist.iloc[1].min())
print(mnist.iloc[1].max())
#0
#255

因为我们的数据是在一个相似的尺度上测量的,所以我们不需要为 PCA 做特征缩放。

应用 PCA

选择合适的尺寸

首先,我们需要选择正确的维度数(主成分数)。为此,我们将主成分分析应用于原始维度数(即784),并创建scree图,以查看主成分分析如何很好地捕获数据的方差。

import numpy as np
from sklearn.decomposition import PCApca_784 = PCA(n_components=784)
pca_784.fit(mnist)plt.grid()
plt.plot(np.cumsum(pca_784.explained_variance_ratio_ * 100))
plt.xlabel('Number of components')
plt.ylabel('Explained variance')
plt.savefig('Scree plot.png')

让我们尝试使用前10个分量来压缩图像。这些分量不能捕获原始数据中的大部分可变性。所以,我们不会得到一个清晰的图像。

pca_10 = PCA(n_components=10)
mnist_pca_10_reduced = pca_10.fit_transform(mnist)
mnist_pca_10_recovered = pca_10.inverse_transform(mnist_pca_10_reduced)image_pca_10 = mnist_pca_10_recovered[1,:].reshape([28,28])
plt.imshow(image_pca_10, cmap='gray_r')
plt.title('Compressed image with 10 components', fontsize=15, pad=15)
plt.savefig("image_pca_10.png")

将此与我们之前获得的原始图像进行比较。该图像不是很清晰,并且缺少信息。

让我们尝试使用前184个分量来压缩图像。前184个分量捕获了原始数据中约96%的可变性。因此,这次,我们将获得非常清晰的图像,与原始图像非常相似。

pca_184 = PCA(n_components=184)
mnist_pca_184_reduced = pca_184.fit_transform(mnist)
mnist_pca_184_recovered = pca_184.inverse_transform(mnist_pca_184_reduced)image_pca_184 = mnist_pca_184_recovered[1,:].reshape([28,28])
plt.imshow(image_pca_184, cmap='gray_r')
plt.title('Compressed image with 184 components', fontsize=15, pad=15)
plt.savefig("image_pca_184.png")

我们还可以计算184个分量的解释方差:

np.cumsum(pca_184.explained_variance_ratio_ * 100)[-1]
#96.11980535398752

是96.1% 。

将压缩图像与原始图像进行比较:

这就是我们如何使用 PCA 的图像压缩。左边的图像是784维的原始图像。右边的图像是184维的压缩图像。将 PCA 应用于图像数据后,维数降低了600维,同时保持了原始图像数据变异性的96% 左右!通过比较这两个图像,你可以看到有一个轻微的图像质量损失,但内容的压缩图像仍然是可见的!

总结

我们讨论了如何使用PCA进行图像压缩。当维度或分量的数量增加时,图像质量损失会降低。我们应始终尝试保持最佳数量的分量,以平衡解释的可变性和图像质量。pca对象的inverse_transform() 方法用于将缩小的数据集解压缩回784维。

·  END  ·

HAPPY LIFE

使用主成分分析进行图像压缩相关推荐

  1. python 图像压缩pca_在Python中使用K-Means聚类和PCA主成分分析进行图像压缩

    AI 人工智能 在Python中使用K-Means聚类和PCA主成分分析进行图像压缩 各位读者好,在这片文章中我们尝试使用sklearn库比较k-means聚类算法和主成分分析(PCA)在图像压缩上的 ...

  2. 【OpenCV 例程 300篇】235. 特征提取之主成分分析(sklearn)

    『youcans 的 OpenCV 例程300篇 - 总目录』 [youcans 的 OpenCV 例程 300篇]235. 特征提取之主成分分析(sklearn) 特征提取是指从原始特征中通过数学变 ...

  3. SVD分解及应用的直观理解

    转载自: http://blog.csdn.net/zhaoxinfan/article/details/8248637 这篇论文是矩阵分析课上老师布置的一项作业,主要内容来自于http://www. ...

  4. matlab软件及基础实验第8单元,《MATLAB统计分析与应用:40个案例分析》程序与数据(内含彩蛋)...

    [实例简介]Matlab教材及随书光盘,超实用的好书,强烈推荐! MATLAB统计分析与应用 40个案例分析.pdf <MATLAB统计分析与应用:40个案例分析>程序与数据.rar 第1 ...

  5. 计算机视觉相关学习项目(上)——附MATLAB源代码

    一.基于直方图优化的图像去雾系统 [系统介绍]该系统采用全局直方图均衡化.局部直方图均衡化算法进行图像去雾实验,并选择Retinex增强算法作为直方图去雾算法的延伸.通过GUI交互界面显示处理前后的图 ...

  6. matlab案例分析总结,MATLAB统计分析与应用:40个案例分析

    第章编程简介 1.1MATLAB工作界面布局与路径设置 1.1.1MATLAB工作界面布局 1.1.2MATLAB路径设置 1.2变量的定义与数据类型 1.2.1变量的定义与赋值 1.2.2MATLA ...

  7. 图像压缩算法构造最优解c语言,基于Handel-C的CCSDS图像压缩算法实现研究

    基于Handel-C的CCSDS图像压缩算法实现研究 [摘要]:伴随着航天遥感技术的迅猛发展,采集空间图像的需求也日益增长.为了解决有限的卫星通信信道容量和海量数据下传的矛盾,应用卫星数传系统在图像数 ...

  8. python图像压缩主成分分析实例_python机器学习API介绍13: 数据降维及主成分分析...

    数据降维概述:数据降维是机器学习领域中重要的内容,所谓的降维就是采用某种映射方法,将高维空间中的数据点映射到低维的空间中.其本质是学习一个映射函数f: x->y.其中x是原始数据点的表述,目前多 ...

  9. python图像压缩主成分分析实例_PCA - 主成分分析(Python实现图像压缩)

    PCA(Principal Component Analysis) PCA的本质就是找一些投影方向,使得数据在这些投影方向上的方差最大,而且这些投影方向是相互正交的. 这其实就是找新的正交基的过程,计 ...

  10. 奇异值分解和图像压缩

    奇异值分解和图像压缩 from: http://cos.name/2014/02/svd-and-image-compression/ [2.18更新]:楠神写了一个非常gelivable的Shiny ...

最新文章

  1. 在SharePoint 2010使用OWA查看自己邮箱的内容
  2. Graph + AI 2021中国峰会:TigerGraph与行业共探图与AI应用前景
  3. 从汉诺塔讲递归的思考方式
  4. 沉浸式模式与沉浸式状态栏
  5. Oracle查看锁表
  6. php 获取浏览器时区,获取用户时区
  7. 线程休眠 sleep
  8. Android中的savedInstanceState
  9. [bzoj] 2049 洞穴勘探 || LCT
  10. 牛腩新闻发布系统——触发器使用
  11. Android开发相关操作
  12. Verilog编写FSM有限状态机来检测序列11011,则输出1;可对序列进行重复检测
  13. excel自动调整列宽_如何以厘米为单位精确设置Excel表格的行高列宽?
  14. SecureCRT破解版安装
  15. 自学备考CKA攻略-考试信息及准备
  16. 携程2019秋招面经
  17. access函数的用法
  18. 火焰传感器与 Arduino 连接
  19. hadoop3.3.1搭建过程遇到的坑
  20. Mac安装Jadx反编译工具

热门文章

  1. GitHub使用指南
  2. 【突破次元壁】谁说二次元离我们遥远?Python特效火遍全网,关键技术原来是它。
  3. gitbub.com设置协作者提交代码步骤
  4. 最新Apple苹果开发者账号AppleID注册流程
  5. 内存卡格式化了怎么办?能恢复吗?
  6. Excel - Office Excel 多表无法多窗口问题
  7. 计算机无法添加网络位置,win10系统无法设置网络位置的操作办法
  8. 5财务分析的基本方法-盈利能力分析
  9. java计算机毕业设计网上商城系统源码+系统+数据库+lw文档+mybatis+运行部署
  10. 花生壳内网穿透图文教程