一.PCA

PCA通过正交变换将一组由线性相关变量表示的数据转换为少数几个由线性无关变量表示的数据,这几个线性无关的变量就是主成分。PCA通过将高维数据维度减少到少数几个维度,本质上属于一种数据降维方法,也可以用来探索数据的内在结构。

可看出如果两个随机变量的分布相似,它们的协方差很大。

import numpy as npclass PCA():# 计算协方差矩阵def calculate_covariance_matrix(self, X):m = X.shape[0]# 数据标准化X = X - np.mean(X, axis=0)#(x1 - Ex1) (x2 - Ex2)return 1 / m * np.matmul(X.T, X)def compute_feature(self, X, n_components):# 计算协方差矩阵covariance_matrix = self.calculate_covariance_matrix(X)print('==covariance_matrix:', covariance_matrix.shape)# 计算协方差矩阵的特征值和对应特征向量eigenvalues, eigenvectors = np.linalg.eig(covariance_matrix)print('=eigenvectors.shape:', eigenvectors.shape)# 对特征值排序idx = eigenvalues.argsort()[::-1]# 取最大的前n_component组eigenvectors = eigenvectors[:, idx]eigenvectors = eigenvectors[:, :n_components]# Y=PX转换return np.matmul(X, eigenvectors)#两个样本 一个样本有三维
X = np.array([[4, 1, 3],[2, 2, 4]])
print('X:', X)
pca = PCA()
Y = pca.compute_feature(X, 2)#降到2维
print('Y:', Y)

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import load_digits
from sklearn.decomposition import PCA
from mpl_toolkits.mplot3d import Axes3Ddef plot_digits(images, y, max_n=10):"""显示手写数字的图像"""# 设置图像尺寸fig = plt.figure(figsize=(2. * n_col, 2.26 * n_row))i = 0while i < max_n and i < images.shape[0]:p = fig.add_subplot(n_row, n_col, i + 1, xticks=[], yticks=[])p.imshow(images[i], cmap=plt.cm.bone, interpolation='nearest')# 添加标签p.text(0, -1, str(y[i]))i = i + 1plt.show()# 显示8*8数字
# plot_digits(digits.images, digits.target, max_n=10)def plot_pca_scatter_three(digits, X_pca, y_digits, class_nums):"""主成分显示"""##显示3Dfig = plt.figure()ax = fig.add_subplot(111, projection='3d')for i in range(len(class_nums)):# print('==y_digits == i:', y_digits == i)print(X_pca[:, 0][y_digits == i].shape)print(X_pca[:, 1][y_digits == i].shape)print(X_pca[:, 2][y_digits == i].shape)ax.scatter(X_pca[:, 0][y_digits == i], X_pca[:, 1][y_digits == i], X_pca[:, 2][y_digits == i], label = class_nums[i])plt.legend(digits.target_names)ax.set_xlabel('First Principal Component')ax.set_ylabel('Second Principal Component')ax.set_zlabel('Third Principal Component')plt.savefig('./three.jpg')plt.show()def plot_pca_scatter_two(digits, X_pca, y_digits, class_nums):# 显示2Dfor i in range(len(class_nums)):px = X_pca[:, 0][y_digits == i]py = X_pca[:, 1][y_digits == i]plt.scatter(px, py, label=class_nums[i])plt.legend(digits.target_names)plt.xlabel('First Principal Component')plt.ylabel('Second Principal Component')plt.savefig('./two.jpg')plt.show()def pca_aysis_two_components():digits = load_digits()X_digits, y_digits = digits.data, digits.target# n_row, n_col = 2, 5print('=X_digits.shape:', X_digits.shape)print('==y_digits:', y_digits[:10])print(len(y_digits))class_nums = [i for i in range(10)]n_components = 2  # 取前2个主成分pca = PCA(n_components=n_components)# fit_transform表示做完训练以后并进行转换X_pca = pca.fit_transform(X_digits)print('==X_pca.shape:', X_pca.shape)plot_pca_scatter_two(digits, X_pca, y_digits, class_nums)def pca_aysis_three_components():digits = load_digits()X_digits, y_digits = digits.data, digits.targetprint('=X_digits.shape:', X_digits.shape)print('==y_digits:', y_digits[:10])print(len(y_digits))class_nums = [i for i in range(10)]n_components = 3  # 取前2个主成分pca = PCA(n_components=n_components)# fit_transform表示做完训练以后并进行转换X_pca = pca.fit_transform(X_digits)print('==X_pca.shape:', X_pca.shape)plot_pca_scatter_three(digits, X_pca, y_digits, class_nums)if __name__ == '__main__':# pca_aysis_two_components()pca_aysis_three_components()

可视化二维的时候:

可视化三维的时候:

二.SVD

numpy案例

A = np.array([[4, 1, 3],[2, 2, 4]])
print('A:\n', A)# 对其进行SVD分解 s是对角矩阵的值
u, s, vt = np.linalg.svd(A, full_matrices=True)
print('u.shape, s.shape, vt.shape:', u.shape, s.shape, vt.shape)
res = np.dot(u*s, vt[:2, :])
print('res:', res)
#U UT=I
print('np.dot(u, u.T):\n', np.dot(u, u.T))
#v vT=I
print('np.dot(vt, vt.T):\n', np.dot(vt, vt.T))

将SVD用于图像的压缩算法。其原理就是保存像素矩阵的前k个奇异值,并在此基础上做图像恢复。由SVD的原理我们可以知道,在SVD分解中越靠前的奇异值越重要,代表的信息含量越大。


import cv2
import numpy as np
import os
from tqdm import tqdm# 定义恢复函数,由分解后的矩阵恢复到原矩阵
def restore(u, s, v, K):'''u:左奇异矩阵 u uT=Iv:右奇异矩阵 v vT=Is:奇异值矩阵 对角矩阵K:奇异值个数'''m, n = len(u), len(v)a = np.zeros((m, n))for k in range(K):uk = u[:, k].reshape(m, 1)vk = v[k].reshape(1, n)# 前k个奇异值的加总a += np.dot(uk * s[k], vk)a = a.clip(0, 255)return np.rint(a).astype('uint8')img = cv2.imread("./111.png")
print('==img.shape:', img.shape)
h,w,_ = img.shape
# 对RGB图像进行奇异值分解
u_b, s_b, v_b = np.linalg.svd(img[:, :, 0])
u_g, s_g, v_g = np.linalg.svd(img[:, :, 1])
u_r, s_r, v_r = np.linalg.svd(img[:, :, 2])print('==u_b.shape, s_b.shape, v_b.shape:', u_b.shape, s_b.shape, v_b.shape)
B = np.dot(u_b * s_b, v_b[:h, :])
print('B:', B.shape)G = np.dot(u_g * s_g, v_g[:h, :])
print('G:', G.shape)R = np.dot(u_r * s_r, v_r[:h, :])
print('R:', R.shape)# # 使用前短边个奇异值
K = min(img.shape[:2])
new_img = cv2.merge([B, G, R])
cv2.imwrite('./test_svd.jpg', new_img)# # 恢复图像
ouput_path = './svd'
os.makedirs(ouput_path, exist_ok=True)
for k in tqdm(range(1, K + 1)):B = restore(u_b, s_b, v_b, k)R = restore(u_r, s_r, v_r, k)G = restore(u_g, s_g, v_g, k)new_img = cv2.merge([B, G, R])cv2.imwrite(os.path.join(ouput_path, '{}.jpg'.format(k)), new_img)

协方差理解,PCA以及奇异值分解(SVD)相关推荐

  1. 机器学习-Sklearn(第三版)Day4 主成分分析PCA与奇异值分解SVD

    目录 一.简介 什么是维度 sklearn中的降维算法 二.PCA与SVD 0.如何实现降维算法 思考:PCA和特征选择技术都是特征工程的一部分,它们有什么不同? 1.重要参数n_components ...

  2. 稀疏学习、稀疏表示、稀疏自编码神经网络、字典学习、主成分分析PCA、奇异值分解SVD 等概念的梳理,以及常用的特征降维方法

    稀疏学习.稀疏表示.稀疏自编码神经网络.字典学习.主成分分析PCA.奇异值分解SVD 等概念的梳理,以及常用的特征降维方法 关于稀疏 稀疏编码 Sparse Coding 与字典学习 神经网络的正则化 ...

  3. 主成份(PCA)与奇异值分解(SVD)的通俗解释

    主成份(PCA)与奇异值分解(SVD)的通俗解释 1. 问题描述 在许多领域的研究与应用中,往往需要对反映事物的多个变量进行大量观测,收集大量数据以便进行分析,寻找规律.多变量大样本无疑会为研究和应用 ...

  4. 降维 ---- 主成分分析 (PCA)、奇异值分解 (SVD)

    降维 在机器学习或数据处理中,经常会碰到一些高维数据,而高维数据情形下经常出现样本稀疏.计算困难等问题,称之为"维度灾难". 对于一个高维数据数 D={X1,X2,...,XN}D ...

  5. 矩阵分解之: 特征值分解(EVD)、奇异值分解(SVD)、SVD++

    目录: 1.矩阵分解 1.1 矩阵分解的产生原因 1.2 矩阵分解作用 1.3 矩阵分解的方法 1.4 推荐学习的经典矩阵分解算法 2. 特征值分解(EVD) 3. 奇异值分解(SVD) 4. SVD ...

  6. 主成分分析(PCA)与矩阵奇异值分解(SVD)

    1 矩阵奇异值分解SVD 1.1 矩阵奇异值分解的数学原理 在关于SVD(Singular Value Decomposition)的讲解中将涉及稍微多一点的数学推导. 定义:设 A A A是秩为 r ...

  7. 【AI绘图学习笔记】奇异值分解(SVD)、主成分分析(PCA)

    这节的内容需要一些线性代数基础知识,如果你没听懂本文在讲什么,强烈建议你学习[官方双语/合集]线性代数的本质 - 系列合集 文章目录 奇异值分解 线性变换 特征值和特征向量的几何意义 什么是奇异值分解 ...

  8. 【机器学习】这次终于彻底理解了奇异值分解(SVD)原理及应用

    奇异值分解(Singular Value Decomposition,以下简称SVD)是在机器学习领域广泛应用的算法,有相当多的应用与奇异值都可以扯上关系,它不光可以用于降维算法中的特征分解,比如做f ...

  9. 主成分分析PCA和矩阵的奇异值分解SVD

    PCA和SVD   引言:在机器学习中,因为高纬空间样本具有稀疏性,导致模型比较难找到数据特征等原因.所以需要进行高维数据样本的降维,其中比较常使用的一种降维方法就是PCA.PCA主要是用于数据的降维 ...

最新文章

  1. ArrayList源码学习
  2. 网络推广团队分享新手必看的长尾关键词挖掘技巧!
  3. 使用JDOM解析XML
  4. 套接字有哪些类型?socket有哪些类型?
  5. 【软考-软件设计师】解释程序实现高级语言的三种方式
  6. Mysql(4)——数据库相关操作
  7. mac https本地跨域配置
  8. 面试题:彻底搞懂 Cookie 和 Session
  9. Get value from agent failed:cannot connect to [[192.168.121.128]:10050]:[111Connection refused]]
  10. 白话区块链 之4: 区块链分类与架构
  11. tomcat 虚拟目录配置appBase和docBase的区别 导致redis session异常SEVERE: Unable to deserialize into session
  12. Python | 程序查找列表中最小和最大元素的位置
  13. 【LeetCode】347. Top K Frequent Elements 前 K 个高频元素(Medium)(JAVA)
  14. 湖南大学计算机学院陈浩,杨圣洪-湖大信息科学与工程学院
  15. 如何将高效设计应用于 DAO?
  16. React 生成二维码
  17. 调css p 段落间距,CSS段落第一个文字空两格缩进text-indent 和 文字之间间距调整letter-spacing...
  18. vue3的setup的使用和原理解析
  19. Android的Schema
  20. CF1765M Minimum LCM

热门文章

  1. 技术动态 | 知识图谱从哪里来:实体关系抽取的现状与未来
  2. 如何使用ListView实现一个带有网络请求,解析,分页,缓存的公共的List页面来大大的提高工作效率
  3. 使用ngModel创建组件
  4. 01.MyBatis入门
  5. 剑指Offer——求1+2..+n的和
  6. [js] 渲染树构建、布局及绘制
  7. 基于原版Hadoop的YDB部署(转)
  8. 【转载】Java中各种修饰符与访问修饰符的说明
  9. C#语言之“中英文混合字符串对齐”的方法
  10. 不够优秀就不要腆着脸继续占便宜——作者:杨毅