Advertisement

山东大学计算机科学与技术学院机器学习实验7

阅读量:

山东大学计算机科学与技术学院机器学习实验7(A Python Version)

实验目的:

实验步骤与内容:
这个实验大致包括以下步骤和内容:

  1. 数据准备: 基于ORL人脸数据库开展研究工作。该数据库包含40个子目录,在每一组中存储有10张不同的人脸照片。这些图片被系统采用并加以分析。
  2. 训练集和测试集划分: 在训练与测试阶段需要对每组图片进行分类处理。具体而言,在每组图片中随机选取5至7张图像用于训练样本,并将剩余的图片则用于测试评估。
  3. 图像读取和处理: 在图像处理流程中首先需要完成文件的读取操作。我们采用PGM文件格式来进行操作,并将其转化为二维矩阵形式进行后续运算。预处理步骤包括图片去噪、尺寸统一以及特征提取等多步操作。
在这里插入图片描述

4. 标签分配: 为每张图像分配标签,以便知道它属于哪个目录。

在这里插入图片描述

5. PCA降维: 对图像数据实施标准化处理后,在此基础上计算其协方差矩阵。通过对协方差矩阵求解其特征值与特征向量,并基于此执行主成分分析(PCA)。为了有效降低数据维度,在分析结果中选取前k个具有显著意义的主成分来进行后续处理。

在这里插入图片描述
  1. SVM分类: 采用支持向量机(SVM)作为分类模型。针对每一个 k 值,在选定主成分的基础上将数据通过主成分分析映射至低维空间,并将其划分为训练集与测试集两部分进行处理。利用训练集对SVM分类器进行参数优化,并对测试集中样本进行预测精度评估以验证模型性能。
在这里插入图片描述
  1. 准确性记录: 记录每个 k 下的分类准确性,并将结果打印出来。
在这里插入图片描述

可视化结果: 通过matplotlib库生成一个图表来展示不同主成分数量下准确率的变化趋势。
整个实验的核心思想是基于PCA降维技术将人脸图像表示为低维特征向量,并通过SVM分类器实现人脸识别系统。该实验的主要目标是研究不同主成分数量对系统识别性能的影响。

在这里插入图片描述

结论分析与体会

体会

复制代码
    import numpy as np
    import matplotlib.pyplot as plt
    from sklearn import svm
    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    
    
    def read_pgm(file_path):
    with open(file_path, 'rb') as f:
        # 读取文件的第一行,通常是 P2 或 P5,表示文件类型
        magic_number = f.readline().decode('utf-8').strip()
    
        # 跳过以 # 开头的注释行
        while True:
            line = f.readline().decode('utf-8').strip()
            if not line.startswith('#'):
                break
    
        # 读取图像的宽度和高度
        width, height = map(int, line.split())
    
        # 读取最大像素值
        max_val = int(f.readline().decode('utf-8').strip())
    
        # 读取图像数据
        if magic_number == 'P2':
            # 对于ASCII格式的PGM文件
            image_data = [list(map(int, line.split())) for line in f.readlines()]
        elif magic_number == 'P5':
            # 对于二进制格式的PGM文件
            image_data = list(f.read())
    
        return magic_number, width, height, max_val, image_data
    
    
    n = 400
    X = np.zeros((400, 10304))
    for i in range(1, 40 + 1):
    for j in range(1, 11):
        file_path = f"orl_faces/s{i}/{j}.pgm"
        magic_number, width, height, max_val, image_data = read_pgm(file_path)
        image_data = np.array(image_data)
        X[i * 10 + j - 11] = image_data
    
    # 给每一张照片都打一个label
    Y = np.zeros((400))
    for i in range(400):
    Y[i] = i // 10 + 1
    
    eigenvalues = np.load('eigenvalues.npy')
    eigenvectors = np.load('eigenvectors.npy')
    
    data = X
    
    # Step 1: 标准化数据
    mean = np.mean(data, axis=0)
    std_dev = np.std(data, axis=0)
    normalized_data = (data - mean) / std_dev
    
    # Step 2: 计算协方差矩阵
    cov_matrix = np.cov(normalized_data, rowvar=False)
    
    # # Step 3: 计算特征值和特征向量
    # eigenvalues, eigenvectors = np.linalg.eigh(cov_matrix)
    # np.save('eigenvalues.npy', eigenvalues)
    # np.save('eigenvectors.npy', eigenvectors)
    
    # Step 4: 选择主成分(假设选择前 k 个主成分)
    
    accuracies = []
    k_values = list(range(1,100))
    for k in k_values:
    top_eigenvectors = eigenvectors[:, -k:]
    
    # Step 5: 数据投影
    reduced_data = np.dot(normalized_data, top_eigenvectors)
    
    # SVM
    X = reduced_data
    X_train, X_test, y_train, y_test = train_test_split(X, Y, test_size=0.2, random_state=42)
    clf = svm.SVC()
    clf.fit(X_train, y_train)
    y_pred = clf.predict(X_test)
    accuracy = accuracy_score(y_test, y_pred)
    accuracies.append(accuracy)
    print("Accuracy:", accuracy * 100, "%\n")
    
    # 绘制准确率随k变化的图表
    plt.plot(k_values, accuracies, marker='o')
    plt.title('Accuracy vs. k')
    plt.xlabel('k')
    plt.ylabel('Accuracy')
    plt.grid(True)
    plt.show()
    plt.savefig('accuracy_vs_k.png')
    
    
    
    python
    
    
![](https://ad.itadn.com/c/weblog/blog-img/images/2025-08-18/pK5dwu3hsEnfYVzyPBvLeq6k1ZOr.png)

全部评论 (0)

还没有任何评论哟~