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

目录
相关文章
|
24天前
|
传感器 机器学习/深度学习 算法
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
【使用 DSP 滤波器加速速度和位移】使用信号处理算法过滤加速度数据并将其转换为速度和位移研究(Matlab代码实现)
111 1
|
29天前
|
机器学习/深度学习 算法 调度
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
14种智能算法优化BP神经网络(14种方法)实现数据预测分类研究(Matlab代码实现)
183 0
|
2月前
|
机器学习/深度学习 Dragonfly 人工智能
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
基于蜻蜓算法优化支持向量机(DA-SVM)的数据多特征分类预测研究(Matlab代码实现)
|
3月前
|
传感器 机器学习/深度学习 分布式计算
卡尔曼滤波的多传感器数据融合算法
卡尔曼滤波的多传感器数据融合算法
348 0
|
1月前
|
机器学习/深度学习 数据采集 算法
量子机器学习入门:三种数据编码方法对比与应用
在量子机器学习中,数据编码方式决定了量子模型如何理解和处理信息。本文详解角度编码、振幅编码与基础编码三种方法,分析其原理、实现及适用场景,帮助读者选择最适合的编码策略,提升量子模型性能。
139 8
|
21天前
|
存储 监控 算法
企业电脑监控系统中基于 Go 语言的跳表结构设备数据索引算法研究
本文介绍基于Go语言的跳表算法在企业电脑监控系统中的应用,通过多层索引结构将数据查询、插入、删除操作优化至O(log n),显著提升海量设备数据管理效率,解决传统链表查询延迟问题,实现高效设备状态定位与异常筛选。
65 3
|
24天前
|
机器学习/深度学习 算法 Java
基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
基于灰狼优化算法(GWO)解决柔性作业车间调度问题(Matlab代码实现)
112 1
|
24天前
|
供应链 算法 Java
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
【柔性作业车间调度问题FJSP】基于非支配排序的多目标小龙虾优化算法求解柔性作业车间调度问题FJSP研究(Matlab代码实现)
|
1月前
|
供应链 算法 调度
基于非支配吸血水蛭优化算法 (NSBSLO)求解多目标柔性作业车间调度问题(FJSP)研究(Matlab代码实现)
基于非支配吸血水蛭优化算法 (NSBSLO)求解多目标柔性作业车间调度问题(FJSP)研究(Matlab代码实现)
|
1月前
|
算法 数据挖掘 定位技术
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)
基于密度的聚类算法能够在含有噪声的数据集中识别出任意形状和大小的簇(Matlab代码实现)

热门文章

最新文章