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天前
|
机器学习/深度学习 算法 数据挖掘
机器学习第五次作业
机器学习第五次作业包含三个题目。第一题实现高斯贝叶斯分类和高斯朴素贝叶斯分类,分别用于判断瓜的好坏。第二题使用EM算法对数据进行聚类,输出两个类别的均值、方差和先验概率。第三题内容未完整展示。
15 0
机器学习第五次作业
|
5天前
|
机器学习/深度学习 人工智能 自然语言处理
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
阿里云人工智能平台 PAI 团队发表的图像编辑算法论文在 MM2024 上正式亮相发表。ACM MM(ACM国际多媒体会议)是国际多媒体领域的顶级会议,旨在为研究人员、工程师和行业专家提供一个交流平台,以展示在多媒体领域的最新研究成果、技术进展和应用案例。其主题涵盖了图像处理、视频分析、音频处理、社交媒体和多媒体系统等广泛领域。此次入选标志着阿里云人工智能平台 PAI 在图像编辑算法方面的研究获得了学术界的充分认可。
【MM2024】阿里云 PAI 团队图像编辑算法论文入选 MM2024
|
1天前
|
机器学习/深度学习 人工智能 算法
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
玉米病害识别系统,本系统使用Python作为主要开发语言,通过收集了8种常见的玉米叶部病害图片数据集('矮花叶病', '健康', '灰斑病一般', '灰斑病严重', '锈病一般', '锈病严重', '叶斑病一般', '叶斑病严重'),然后基于TensorFlow搭建卷积神经网络算法模型,通过对数据集进行多轮迭代训练,最后得到一个识别精度较高的模型文件。再使用Django搭建Web网页操作平台,实现用户上传一张玉米病害图片识别其名称。
9 0
【玉米病害识别】Python+卷积神经网络算法+人工智能+深度学习+计算机课设项目+TensorFlow+模型训练
|
9天前
|
机器学习/深度学习 算法 决策智能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
【机器学习】揭秘深度学习优化算法:加速训练与提升性能
|
5天前
|
机器学习/深度学习 算法 Python
探索机器学习中的决策树算法:从理论到实践
【10月更文挑战第5天】本文旨在通过浅显易懂的语言,带领读者了解并实现一个基础的决策树模型。我们将从决策树的基本概念出发,逐步深入其构建过程,包括特征选择、树的生成与剪枝等关键技术点,并以一个简单的例子演示如何用Python代码实现一个决策树分类器。文章不仅注重理论阐述,更侧重于实际操作,以期帮助初学者快速入门并在真实数据上应用这一算法。
|
2天前
|
机器学习/深度学习 计算机视觉 Python
坐标下降求解人脸表示(机器学习作业04)
这是机器学习第四次作业的解答,包含两道题目。第一题涉及数学推导,给出了详细的求解过程。第二题则通过 Python 代码实现图像处理,包括读取单张图片和批量读取文件夹中的图片,并将图像数据转换为矩阵形式。
8 0
坐标下降求解人脸表示(机器学习作业04)
|
1月前
|
机器学习/深度学习 算法 TensorFlow
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
交通标志识别系统。本系统使用Python作为主要编程语言,在交通标志图像识别功能实现中,基于TensorFlow搭建卷积神经网络算法模型,通过对收集到的58种常见的交通标志图像作为数据集,进行迭代训练最后得到一个识别精度较高的模型文件,然后保存为本地的h5格式文件。再使用Django开发Web网页端操作界面,实现用户上传一张交通标志图片,识别其名称。
66 6
交通标志识别系统Python+卷积神经网络算法+深度学习人工智能+TensorFlow模型训练+计算机课设项目+Django网页界面
|
10天前
|
机器学习/深度学习 算法
机器学习入门(三):K近邻算法原理 | KNN算法原理
机器学习入门(三):K近邻算法原理 | KNN算法原理
|
10天前
|
机器学习/深度学习 算法 大数据
机器学习入门:梯度下降算法(下)
机器学习入门:梯度下降算法(下)