PCA人脸识别

news2024/11/26 11:31:00

目录

一、PCA主成分分析

二、PCA人脸识别

三、结果


一、PCA主成分分析

PCA(主成分分析)是一种非常常用的数据降维技术。它通过线性变换将原始数据变换到一个新的坐标系统中,使得在这个新坐标系统的第一个坐标轴上的数据方差最大,第二个坐标轴上的数据方差次之,依此类推,以达到降维的目的。下面是更详细的步骤和解释:

  1. 中心化数据:首先将数据的每一维度都减去其均值,这样每一维的均值变为0。

  2. 计算协方差矩阵:在中心化后的数据基础上,计算协方差矩阵。协方差矩阵反映了数据中各维度间的相关性。

  3. 求解特征值和特征向量:计算协方差矩阵的特征值和对应的特征向量。这些特征向量代表了数据中的主要变化方向,而特征值的大小表示了各个方向上变化的程度。

  4. 选择主成分:一般会根据特征值的大小,从大到小选择前几个特征向量,这些特征向量称为“主成分”。通常选择的主成分数量取决于所需保留的原始数据信息量的百分比。

  5. 投影到新的空间:将原始数据投影到这些主成分构成的空间中,即可实现数据的降维。

二、PCA人脸识别

import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
import matplotlib.image as mpimg  # 读入图片
import mpl_toolkits.mplot3d as Axes3D  # 用来画三维图

'''============================part1 数据导入及可视化========================='''

data = scio.loadmat('data_sets/ex7data1.mat')
x = data['X']
plt.scatter(x[:, 0], x[:, 1], marker='o', facecolors='none', edgecolors='b')

'''============================part2 PCA===================================='''
'''数据标准化'''


def featureNormalize(x):
    mu = x.mean(axis=0)  # 求每列的
    sigma = x.std(axis=0, ddof=1)  # 无偏的标准差,自由度为n-1
    x_norm = (x - mu) / sigma
    return x_norm, mu, sigma


x_norm, mu, sigma = featureNormalize(x)

'''得到特征向量和特征值'''


def pca(x):
    m, n = x.shape
    Sigma = (x.T @ x) / m  # 协方差矩阵
    U, S, V = np.linalg.svd(Sigma)  # SVD奇异值分解
    return U, S


U, S = pca(x_norm)

# 画出特征向量
plt.figure(figsize=(6, 6))
plt.scatter(x[:, 0], x[:, 1], marker='o', facecolors='none', edgecolors='b')
plt.plot([mu[0], mu[0] + 1.5 * S[0] * U[0, 0]], [mu[1], mu[1] + 1.5 * S[0] * U[1, 0]], 'k')  # 两个点的连线
plt.plot([mu[0], mu[0] + 1.5 * S[1] * U[0, 1]], [mu[1], mu[1] + 1.5 * S[1] * U[1, 1]], 'k')  # 这里的1.5和S表示特征向量的长度
plt.title('Computed eigenvectors of the dataset')

'''============================part3 降维========================='''
'''降维,数据投影到特征向量上'''


def projectData(x, U, K):
    U_reduce = U[:, 0:K]
    return x @ U_reduce


# 降维后的数据,(50, 1)
z = projectData(x_norm, U, 1)
z[0]  # 1.48127391

'''重建数据'''


def recoverData(z, U, K):
    U_reduce = U[:, 0:K]
    return z @ U_reduce.T  # 因为U是特征向量矩阵,由标准正交基组成,U.T@U为单位矩阵


# 重建后的数据
x_rec = recoverData(z, U, 1)
x_rec[0, :]  # [-1.04741883, -1.04741883]

# 可视化投影
plt.figure(figsize=(6, 6))
plt.xlim((-4, 3))
plt.ylim((-4, 3))
plt.scatter(x_norm[:, 0], x_norm[:, 1], marker='o', facecolors='none', edgecolors='b')
plt.scatter(x_rec[:, 0], x_rec[:, 1], marker='o', facecolors='none', edgecolors='r')
for i in range(len(x_norm)):
    plt.plot([x_norm[i, 0], x_rec[i, 0]], [x_norm[i, 1], x_rec[i, 1]], 'k--')
plt.title('The normalized and projected data after PCA')

'''保留了多少差异性'''


def retained_variance(S, K):
    rv = np.sum(S[:K]) / np.sum(S)
    return print('{:.2f}%'.format(rv * 100))


# 看看降维后保留了多少差异性
retained_variance(S, 1)  # 86.78%

'''============================part4 人脸数据导入及可视化========================='''
data = scio.loadmat('data_sets/ex7faces.mat')
x = data['X']

'''人脸可视化'''


def displayData(x):
    plt.figure()
    n = np.round(np.sqrt(x.shape[0])).astype(int)
    # 定义n*n的子画布
    fig, a = plt.subplots(nrows=n, ncols=n, sharex=True, sharey=True, figsize=(6, 6))
    # 在每个子画布中画出一个图像
    for row in range(n):
        for column in range(n):
            a[row, column].imshow(x[n * row + column].reshape(32, 32).T, cmap='gray')
    plt.xticks([])  # 去掉坐标轴
    plt.yticks([])


# 可视化前100个人脸
displayData(x[0:100, :])

'''============================part5 在人脸数据上实施PCA========================='''
# 数据标准化
x_norm, mu, sigma = featureNormalize(x)
# 特征向量
U, S = pca(x_norm)
# 可视化前36个特征向量
displayData(U[:, 0:36].T)

'''============================part6 人脸数据降维以及可视化========================='''
# 将原始数据降至100维
K = 100
z = projectData(x_norm, U, K)
z.shape  # (5000, 100)
# 重建后的数据
x_rec = recoverData(z, U, K)  # (5000, 1024)

# 画图对比
displayData(x[0:100, :])
displayData(x_rec[0:100, :])

# 看看降维后保留了多少差异性
retained_variance(S, K)  # 93.19%

'''============================part7 PCA用在数据可视化========================='''
# 读取图片
A = mpimg.imread('data_sets/bird_small.png')  # 读取图片

'''k-means的代码'''


def findClosestCentroids(x, centroids):
    idx = np.zeros(len(x))
    for i in range(len(x)):
        c = np.sqrt(np.sum(np.square((x[i, :] - centroids)), axis=1))  # 行求和
        idx[i] = np.argmin(c) + 1
    return idx


def computeCentroids(x, idx, K):
    mu = np.zeros((K, x.shape[1]))
    for i in range(1, K + 1):
        mu[i - 1] = x[idx == i].mean(axis=0)  # 列求均值
    return mu


def kMeansInitCentroids(x, K):
    randidx = np.random.permutation(x)  # 随机排列
    centroids = randidx[:K, :]  # 选前K个
    return centroids


# 运行k-means
def runKmeans(x, centroids, max_iters):
    for i in range(max_iters):
        idx = findClosestCentroids(x, centroids)  # 簇分配
        centroids = computeCentroids(x, idx, len(centroids))  # 移动聚类中心
    return centroids, idx


# k-means部分
X = A.reshape(A.shape[0] * A.shape[1], 3)
K = 16  # 聚类数量
max_iters = 10  # 最大迭代次数
initial_centroids = kMeansInitCentroids(X, K)  # 初始化聚类中心
centroids, idx = runKmeans(X, initial_centroids, max_iters)  # 得到聚类中心和索引
sel = np.random.randint(X.shape[0], size=1000)  # 随机选择1000个样本
cm = plt.cm.get_cmap('Accent')  # 设置颜色

# 画三维图
fig = plt.figure(figsize=(8, 6))
ax = fig.add_subplot(111, projection='3d')  # “111”表示“1×1网格,第一子图”
ax.scatter(X[sel, 0], X[sel, 1], X[sel, 2], c=idx[sel], cmap=cm, s=6)
plt.title('Pixel dataset plotted in 3D. Color shows centroid memberships')

# PCA部分
X_norm, mu, sigma = featureNormalize(X)  # 标准化
U, S = pca(X_norm)  # 特征向量
Z = projectData(X_norm, U, 2)  # 投影降维

# 画二维图
plt.figure(figsize=(8, 6))
plt.scatter(Z[sel, 0], Z[sel, 1], c=idx[sel], cmap=cm, s=7)
plt.title('Pixel dataset plotted in 2D, using PCA for dimensionality reduction')

# 看看降维后保留了多少差异性
retained_variance(S, 2)  # 99.34%
plt.show()  #可视化

三、结果

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1606895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Python | Leetcode Python题解之第36题有效的数独

题目: 题解: class Solution:def isValidSudoku(self, board: List[List[str]]) -> bool:uni (defaultdict(set), defaultdict(set), defaultdict(set))for i in range(9):for j in range(9):s board[i][j]if s .: continueif s in uni[0][i] or …

uniapp:小白1分钟学会使用webSocket(可无脑复制)

uni.connectSocket() uni.$emit页面通信 项目中使用uni.connectSocket()创建webSocket的总结,代码可无脑复制,直接使用。 1、main.js 引入vuex import store from ./store; Vue.prototype.$store store;vuex中封装webSocket 2、vuex的:index…

SpringBoot整合PDF动态填充数据并下载

目录 目录 一、准备环境 二、iTextPDF介绍 三、步骤 四、访问查看结果 五、源代码参考 一、准备环境 ①下载一个万兴pdf软件 ②准备一个pdf 文件 二、iTextPDF介绍 这是一个用于生成PDF文档的Java库, 文档创建与修改:iTextPDF能够从零开始创建…

数据结构(共享栈

目录 1. 讲解:2. C代码实现:小结: 1. 讲解: 两个指针,一个将0作为栈底,一个将maxsize作为栈底,向里面填充。栈满的判断条件为:S.top0 S.top1 - 1 2. C代码实现: #incl…

2、MATLAB入门常用命令

一、退出和中断 exit和quit:结束MATLAB会话。程序完成,如果没有明确保存,则变量中的数据丢失。 Ctrl c:中断一个MATLAB任务。例如,当MATLAB正在计算或打印时,中断一个任务,但会话并没有结束。…

【Unity】申请D-U-N-S邓氏编码流程

标题 在使用苹果开发者账号的时候,我们需要用到D-U-N-S邓氏编码,那如何申请呢?最近正好帮朋友申请了一个,接下来我来演示一下申请流程。 1.登录苹果开发者账号 登录连接:Apple Developer 没有账号的自己注册一个 2…

2024上海国际特种电子暨军民两用技术展览会

2024上海国际特种电子暨军民两用技术展览会 2024 Shanghai International Special Electronics and Military Civilian Dual Use Technology Exhibition 时间:2024年11月18日-20日 地点:上海新国际博览中心 详询主办方陆先生 I38(前三位…

数据可视化-ECharts Html项目实战(12)

在之前的文章中,我们深入学习ECharts特殊图表中的矩形树图以及Echarts中高级功能的多图表联动。想了解的朋友可以查看这篇文章。同时,希望我的文章能帮助到你,如果觉得我的文章写的不错,请留下你宝贵的点赞,谢谢。 数…

Linux标准c库操作(4.15)

fopen函数“const char *mode”参数选项。 结果&#xff1a; 标准库c写入结构体到文件&#xff1a; #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <stdio.h> #include <unistd.h> #include <string.h> #in…

L2-2 病毒溯源 坑点

病毒容易发生变异。某种病毒可以通过突变产生若干变异的毒株&#xff0c;而这些变异的病毒又可能被诱发突变产生第二代变异&#xff0c;如此继续不断变化。 现给定一些病毒之间的变异关系&#xff0c;要求你找出其中最长的一条变异链。 在此假设给出的变异都是由突变引起的&a…

【Java框架】Spring框架(四)——Spring中的Bean的创建与生命周期

目录 SpringBean的创建步骤后置处理器(PostProcessor)BeanFactoryPostProcessorBeanPostProcessorInstantiationAwareBeanPostProcessorpostProcessBeforeInstantiationpostProcessAfterInstantiationpostProcessProperties SmartInstantiationAwareBeanPostProcessordetermine…

【Python_PySide6学习笔记(三十六)】基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox(分组框)

基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox分组框 基于QGroupBox和QScrollArea实现带有滚动条的QGroupBox(分组框)前言正文1、创建QGroupBox并创建其内部布局2、创建QScrollArea并将QGroupBox设置为其内容3、将QScrollArea添加到主窗口的中心部件的布局中4、完整代码…

HTML的超链接

前言&#xff1a; 如图&#xff0c;我们在浏览网页时经常可以看到这样的字体&#xff08;点击便跳转到了别的地方了&#xff09;&#xff0c;今日就和各位一起学习一下超链接的相关知识。 相关知识1&#xff1a; 超链接的标签为&#xff1a;a ~使用格式为&#xff1a; <a h…

智慧城市可视化,山海鲸引领未来

随着信息技术的迅猛发展&#xff0c;智慧城市已成为城市发展的必然趋势。在这一背景下&#xff0c;山海鲸智慧城市可视化解决方案应运而生&#xff0c;以其独特的可视化技术和智能化管理功能&#xff0c;为城市管理者提供了全新的决策支持手段。 山海鲸智慧城市可视化解决方案…

docker的安装以及docker中nginx配置

机器 test3 192.168.23.103 1机器初始化配置 1.1关闭防火墙&#xff0c;清空防火墙规则 systemctl stop firewalld iptables -F setenforce 01.2部署时间同步 yum install ntp ntpdate -y1.3安装基础软件包 yum install -y wget net-tools nfs-utils lrzsz gcc gcc-c make…

如何访问内网?

在互联网万维网上&#xff0c;我们可以轻松访问各种网站和资源。但是&#xff0c;有时我们需要访问局域网内的资源&#xff0c;例如公司内部的文件共享、打印机等。本文将介绍几种方法&#xff0c;帮助您实现访问内网的需求。 内网穿透技术 内网穿透技术是一种通过互联网将局域…

人工智能论文GPT-3(1):2020.5 Language Models are Few-Shot Learners;摘要;引言;scaling-law

摘要 近期的工作表明&#xff0c;在大量文本语料库上进行预训练&#xff0c;然后针对特定任务进行微调&#xff0c;可以在许多NLP任务和基准测试中取得实质性进展。虽然这种方法在架构上通常是与任务无关的&#xff0c;但仍然需要包含数千或数万示例的针对特定任务的微调数据集…

STM32G431RBT6移植FreeRTOS

引言&#xff1a; 本文专门为参加了蓝桥杯嵌入式赛道的同学准备&#xff0c; 大家可能会有这样一个问题&#xff0c; 比完赛之后&#xff0c; 对于像继续使用STM32G431RBT6学习FreeRTOS的&#xff0c; 发现网上的教程使用的板子基本上都是F1和F4的&#xff0c; 其实呢&#xff…

多系统源代码暴露在互联网,超四百万公民个人信息存在泄露的风险

#哈尔滨等保# 一 安全事件阐述 截至2024年3月&#xff0c;绿盟科技创新研究院监测到上万个互联网中暴露的DevOps资产存在未授权访问情况。其中&#xff0c;源代码仓库成为未授权访问的“重灾区”。这些允许未授权访问的源代码仓库暴露了境内多家机构的重要系统源代码&#x…

html公众号页面实现点击按钮跳转到导航

实现效果&#xff1a; 点击导航自动跳转到&#xff1a; html页面代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>跳转导航</title><meta name"keywords" conten…