山东大学计算机科学与技术学院机器学习实验7
发布时间
阅读量:
阅读量
山东大学计算机科学与技术学院机器学习实验7(A Python Version)
实验目的:
实验步骤与内容:
这个实验大致包括以下步骤和内容:
- 数据准备: 基于ORL人脸数据库开展研究工作。该数据库包含40个子目录,在每一组中存储有10张不同的人脸照片。这些图片被系统采用并加以分析。
- 训练集和测试集划分: 在训练与测试阶段需要对每组图片进行分类处理。具体而言,在每组图片中随机选取5至7张图像用于训练样本,并将剩余的图片则用于测试评估。
- 图像读取和处理: 在图像处理流程中首先需要完成文件的读取操作。我们采用PGM文件格式来进行操作,并将其转化为二维矩阵形式进行后续运算。预处理步骤包括图片去噪、尺寸统一以及特征提取等多步操作。

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

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

- SVM分类: 采用支持向量机(SVM)作为分类模型。针对每一个 k 值,在选定主成分的基础上将数据通过主成分分析映射至低维空间,并将其划分为训练集与测试集两部分进行处理。利用训练集对SVM分类器进行参数优化,并对测试集中样本进行预测精度评估以验证模型性能。

- 准确性记录: 记录每个 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

全部评论 (0)
还没有任何评论哟~
