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

目录
相关文章
|
2月前
|
机器学习/深度学习 算法 数据挖掘
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构
K-means聚类算法是机器学习中常用的一种聚类方法,通过将数据集划分为K个簇来简化数据结构。本文介绍了K-means算法的基本原理,包括初始化、数据点分配与簇中心更新等步骤,以及如何在Python中实现该算法,最后讨论了其优缺点及应用场景。
152 4
|
5天前
|
机器学习/深度学习 数据采集 算法
机器学习在生物信息学中的创新应用:解锁生物数据的奥秘
机器学习在生物信息学中的创新应用:解锁生物数据的奥秘
76 36
|
10天前
|
机器学习/深度学习 人工智能 算法
机器学习算法的优化与改进:提升模型性能的策略与方法
机器学习算法的优化与改进:提升模型性能的策略与方法
100 13
机器学习算法的优化与改进:提升模型性能的策略与方法
|
12天前
|
机器学习/深度学习 人工智能
Diff-Instruct:指导任意生成模型训练的通用框架,无需额外训练数据即可提升生成质量
Diff-Instruct 是一种从预训练扩散模型中迁移知识的通用框架,通过最小化积分Kullback-Leibler散度,指导其他生成模型的训练,提升生成性能。
38 11
Diff-Instruct:指导任意生成模型训练的通用框架,无需额外训练数据即可提升生成质量
|
6天前
|
人工智能 Kubernetes Cloud Native
跨越鸿沟:PAI-DSW 支持动态数据挂载新体验
本文讲述了如何在 PAI-DSW 中集成和利用 Fluid 框架,以及通过动态挂载技术实现 OSS 等存储介质上数据集的快速接入和管理。通过案例演示,进一步展示了动态挂载功能的实际应用效果和优势。
|
26天前
|
算法
PAI下面的gbdt、xgboost、ps-smart 算法如何优化?
设置gbdt 、xgboost等算法的样本和特征的采样率
48 2
|
1月前
|
机器学习/深度学习 人工智能 自然语言处理
模型训练数据-MinerU一款Pdf转Markdown软件
MinerU是由上海人工智能实验室OpenDataLab团队开发的开源智能数据提取工具,专长于复杂PDF文档的高效解析与提取。它能够将含有图片、公式、表格等多模态内容的PDF文档转化为Markdown格式,同时支持从网页和电子书中提取内容,显著提升了AI语料准备的效率。MinerU具备高精度的PDF模型解析工具链,能自动识别乱码,保留文档结构,并将公式转换为LaTeX格式,广泛适用于学术、财务、法律等领域。
195 4
|
2月前
|
机器学习/深度学习 算法 数据挖掘
C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出
本文探讨了C语言在机器学习中的应用及其重要性。C语言以其高效性、灵活性和可移植性,适合开发高性能的机器学习算法,尤其在底层算法实现、嵌入式系统和高性能计算中表现突出。文章还介绍了C语言在知名机器学习库中的作用,以及与Python等语言结合使用的案例,展望了其未来发展的挑战与机遇。
58 1
|
2月前
|
机器学习/深度学习 自然语言处理 算法
深入理解机器学习算法:从线性回归到神经网络
深入理解机器学习算法:从线性回归到神经网络
|
2月前
|
机器学习/深度学习 人工智能 算法
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型
手写数字识别系统,使用Python作为主要开发语言,基于深度学习TensorFlow框架,搭建卷积神经网络算法。并通过对数据集进行训练,最后得到一个识别精度较高的模型。并基于Flask框架,开发网页端操作平台,实现用户上传一张图片识别其名称。
116 0
【手写数字识别】Python+深度学习+机器学习+人工智能+TensorFlow+算法模型