EM算法对人脸数据降维(机器学习作业06)

简介: 本文介绍了使用EM算法对人脸数据进行降维的机器学习作业。首先通过加载ORL人脸数据库,然后分别应用SVD_PCA、MLE_PCA及EM_PCA三种方法实现数据降维,并输出降维后的数据形状。此作业展示了不同PCA变种在人脸数据处理中的应用效果。

EM算法对人脸数据降维(机器学习作业06)

第一题

image-20210319210048485

第一题推导

第二题

代码如下:

import numpy as np
import os
from PIL import Image
from scipy.linalg import sqrtm


def loadFile(filepath):
    sample_list = np.zeros((0, 112 * 92))
    for root, dirs, files in os.walk(filepath):
        for file in files:
            if os.path.splitext(file)[1] == '.pgm':
                # print(os.path.join(root, file))
                im = Image.open(os.path.join(root, file))
                im = np.array(im).flatten()  # 展开数组
                sample_list = np.vstack((sample_list, im))  # 将数组水平拼接
    X = sample_list.T

    return X


def SVD_PCA(X, k=8):
    # 数据中心化
    x_mean = np.sum(X, axis=1) / X.shape[1]
    X = X - x_mean[:, np.newaxis]
    p = X.shape[0]  # 原始特征数量
    m = X.shape[1]  # 样本个数
    # 先求解XTX的协方差矩阵
    c = np.dot(X.T, X)  # 协方差矩阵
    # 求解协方差矩阵的特征向量和特征值
    eigenvalue, featurevector = np.linalg.eig(c)
    # 对特征值索引排序 从大到小
    aso = np.argsort(eigenvalue)
    indexs = aso[::-1]
    # print("特征值:", eigenvalue)
    # print("特征向量:", featurevector)
    # print("降为", k, "维")
    eigenvalue_sum = np.sum(eigenvalue)
    W = []
    for i in range(k):
        # print("第", indexs[i], "特征的解释率为:", (eigenvalue[indexs[i]] / eigenvalue_sum))
        W.append(np.dot(X, featurevector[:, indexs[i]]) / np.sqrt(eigenvalue[indexs[i]]))  # 取前k个特征值大的特征向量作为基向量
    W = np.array(W).T
    # print('W.shape:',W.shape)
    X_trans = np.dot(W.T, X)

    return X_trans


def MLE_PCA(X, k=8):
    # 数据中心化
    x_mean = np.sum(X, axis=1) / X.shape[1]
    X = X - x_mean[:, np.newaxis]
    p = X.shape[0]  # 原始特征数量
    m = X.shape[1]  # 样本个数
    # 先求解XXT的协方差矩阵特征向量与特征值
    c = (1 / m) * np.dot(X, X.T)  # 协方差矩阵
    # 求解协方差矩阵的特征向量和特征值
    eigenvalue, featurevector = np.linalg.eig(c)
    # 对特征值索引排序 从大到小
    aso = np.argsort(eigenvalue)
    indexs = aso[::-1]  # 特征值从大到小的索引列表
    eigenvalue_sum = np.sum(eigenvalue)
    U = []
    A = []
    for i in range(k):
        # print("第", indexs[i], "特征的解释率为:", (eigenvalue[indexs[i]] / eigenvalue_sum))
        U.append(featurevector[:, indexs[i]])  # 取前k个特征值大的特征向量作为基向量
        A.append(eigenvalue[indexs[i]])  # 保存对应特征值
    U = np.array(U).T
    A = np.diag(A)  # 将特征值列表变为对应对角矩阵
    # 计算σ sigma2
    sigma2 = 0
    for j in indexs[k:]:
        sigma2 = j + sigma2
    sigma2 = 1 / (p - k) * sigma2
    # 计算Wml
    W = np.dot(U, np.sqrt(A - sigma2 * np.eye(A.shape[0])))
    # 计算z
    Z = []
    for i in range(m):
        zi = np.dot(np.dot(np.linalg.inv(np.dot(W.T, W) + sigma2 * np.eye(k)), W.T), X[:, i])
        Z.append(zi)
    Z = np.array(Z).T

    return Z


def EM_PCA(X, k=8, iter_num=20):
    # 数据中心化
    x_mean = np.sum(X, axis=1) / X.shape[1]
    X = X - x_mean[:, np.newaxis]
    W = np.random.random([X.shape[0], k])
    for i in range(iter_num):
        # E步
        Z = np.dot(np.dot(np.linalg.inv(np.dot(W.T, W)), W.T), X)
        # M步
        W = np.dot(np.dot(X, Z.T), np.linalg.inv(np.dot(Z, Z.T)))

    return Z


if __name__ == '__main__':
    filepath = r"orl_faces"
    X = loadFile(filepath)
    X_trans = SVD_PCA(X, 8)
    print("SVD_PCA_shape:", X_trans.shape)
    Z = MLE_PCA(X, 8)
    print("MLE_PCA_shape:", Z.shape)
    Z1 = EM_PCA(X)
    print("EM_PCA_shape:", Z1.shape)

结果如下:

MLE_PCA(X, 8)
print("MLE_PCA_shape:", Z.shape)
Z1 = EM_PCA(X)
print("EM_PCA_shape:", Z1.shape)

```

结果如下:

image-20210319210207148

目录
相关文章
|
19天前
|
机器学习/深度学习 数据采集 JSON
Pandas数据应用:机器学习预处理
本文介绍如何使用Pandas进行机器学习数据预处理,涵盖数据加载、缺失值处理、类型转换、标准化与归一化及分类变量编码等内容。常见问题包括文件路径错误、编码不正确、数据类型不符、缺失值处理不当等。通过代码案例详细解释每一步骤,并提供解决方案,确保数据质量,提升模型性能。
140 88
|
3月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
172 4
|
24天前
|
机器学习/深度学习 数据采集 算法
机器学习在生物信息学中的创新应用:解锁生物数据的奥秘
机器学习在生物信息学中的创新应用:解锁生物数据的奥秘
155 36
|
29天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
159 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
30天前
|
机器学习/深度学习 人工智能
Diff-Instruct:指导任意生成模型训练的通用框架,无需额外训练数据即可提升生成质量
Diff-Instruct 是一种从预训练扩散模型中迁移知识的通用框架,通过最小化积分Kullback-Leibler散度,指导其他生成模型的训练,提升生成性能。
53 11
Diff-Instruct:指导任意生成模型训练的通用框架,无需额外训练数据即可提升生成质量
|
19天前
|
机器学习/深度学习 算法 网络安全
CCS 2024:如何严格衡量机器学习算法的隐私泄露? ETH有了新发现
在2024年CCS会议上,苏黎世联邦理工学院的研究人员提出,当前对机器学习隐私保护措施的评估可能存在严重误导。研究通过LiRA攻击评估了五种经验性隐私保护措施(HAMP、RelaxLoss、SELENA、DFKD和SSL),发现现有方法忽视最脆弱数据点、使用较弱攻击且未与实际差分隐私基线比较。结果表明这些措施在更强攻击下表现不佳,而强大的差分隐私基线则提供了更好的隐私-效用权衡。
45 14
|
25天前
|
人工智能 Kubernetes Cloud Native
跨越鸿沟:PAI-DSW 支持动态数据挂载新体验
本文讲述了如何在 PAI-DSW 中集成和利用 Fluid 框架,以及通过动态挂载技术实现 OSS 等存储介质上数据集的快速接入和管理。通过案例演示,进一步展示了动态挂载功能的实际应用效果和优势。
|
2月前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
69 2
|
2月前
|
机器学习/深度学习 人工智能 自然语言处理
模型训练数据-MinerU一款Pdf转Markdown软件
MinerU是由上海人工智能实验室OpenDataLab团队开发的开源智能数据提取工具,专长于复杂PDF文档的高效解析与提取。它能够将含有图片、公式、表格等多模态内容的PDF文档转化为Markdown格式,同时支持从网页和电子书中提取内容,显著提升了AI语料准备的效率。MinerU具备高精度的PDF模型解析工具链,能自动识别乱码,保留文档结构,并将公式转换为LaTeX格式,广泛适用于学术、财务、法律等领域。
256 4
|
3月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
69 1