KNN和SVM实现对LFW人像图像数据集的分类应用

简介: KNN和SVM实现对LFW人像图像数据集的分类应用

本文使用KNN和SVM实现对LFW人像图像数据集的分类应用,并尝试使用PCA和LDA这两种数据降维方法对原始特征进行处理再分类,并试评估比较这些分类结果。

参考链接: http://vis-www.cs.umass.edu/lfw/#explore

KNN和SVM介绍

KNN

K最近邻(K-Nearest Neighbors,简称KNN)是一种常见的监督学习算法,用于分类和回归问题。它基于一个简单的思想:如果一个样本在特征空间中的k个最相似(即距离最近)的样本中的大多数属于某一个类别,那么该样本也属于这个类别。

以下是KNN算法的基本步骤:

  1. 确定邻居的数量(k值): 选择一个合适的k值,即要考虑的最近邻居的数量。
  2. 计算距离: 使用适当的距离度量(如欧氏距离、曼哈顿距离、闵可夫斯基距离等),计算待分类样本与训练集中每个样本的距离。
  3. 找到最近的邻居: 根据计算的距离找到离待分类样本最近的k个训练样本。
  4. 投票决策: 对于分类问题,采用多数投票原则,即将待分类样本归类为k个最近邻居中出现次数最多的类别。对于回归问题,可以计算k个最近邻居的平均值作为预测结果。

SVM

支持向量机(Support Vector Machine,SVM)是一种用于分类和回归的监督学习算法。下面是SVM的算法步骤:

算法步骤:

  1. 数据准备: 收集并准备带有标签的训练数据,其中每个样本包括一组特征和对应的类别标签。
  2. 选择核函数: 选择适当的核函数,用于将数据映射到高维空间。常见的核函数有线性核、多项式核、径向基函数(RBF)核等。选择核函数的目标是在高维空间中更容易找到一个线性可分的超平面。
  3. 特征缩放: 对特征进行缩放,以确保不同特征的数值范围相近。这有助于避免某些特征对模型的影响过大。
  4. 构建并训练模型: 使用训练数据来构建SVM模型。算法的目标是找到一个能够将不同类别分开的超平面,并使得间隔最大化。
    a. 对于线性SVM,目标是找到最大间隔超平面,可以通过求解优化问题实现。
    b. 对于非线性SVM,采用核函数将数据映射到高维空间,然后在该空间中寻找最大间隔超平面。
  5. 决策函数: 根据训练好的模型,对新的未标记样本进行分类。通过计算新样本到超平面的距离,决定样本属于哪个类别。

降维方法

PCA降维

主成分分析(Principal Component Analysis,PCA)是一种常用的降维技术,用于减少数据集中的维度。PCA通过找到数据中最重要的方向(主成分),将数据投影到这些方向上,从而减少数据的维度。这样可以保留大部分原始数据的信息,同时减少数据的冗余和噪声。

LDA降维

线性判别分析(Linear Discriminant Analysis,LDA)是一种用于数据降维和分类的监督学习方法。LDA的主要目标是找到一个投影方向,使得在这个方向上类别之间的差异最大化,同时类别内的差异最小化。

数据集介绍

LFW (Labeled Faces in the Wild) 人脸数据库是由美国马萨诸塞州立大学阿默斯特分校计算机视觉实验室整理完成的数据库,主要用来研究非受限情况下的人脸识别问题。LFW 数据库主要是从互联网上搜集图像,而不是实验室,一共含有13000 多张人脸图像,每张图像都被标识出对应的人的名字,其中有1680 人对应不只一张图像,即大约1680个人包含两个以上的人脸。

LFW数据集主要测试人脸识别的准确率,该数据库从中随机选择了6000对人脸组成了人脸辨识图片对,其中3000对属于同一个人2张人脸照片,3000对属于不同的人每人1张人脸照片。测试过程LFW给出一对照片,询问测试中的系统两张照片是不是同一个人,系统给出“是”或“否”的答案。通过6000对人脸测试结果的系统答案与真实答案的比值可以得到人脸识别准确率。

案例代码

加载数据,分别使用knn和svm进行分类,输出他们的准确率

再分别使用两种降维方法,对比knn和svm在降维之后的准确率

最后发现knn在LAD降维后准确率上升,在pca降维后准确率下降,svm在LAD降维后准确率下降,在pca降维后准确率上升

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis
from sklearn.model_selection import train_test_split
from sklearn.decomposition import PCA
import numpy as np
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score
from sklearn.datasets import fetch_lfw_people

# 加载LFW人像数据集
lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)
X, y = lfw_people.data, lfw_people.target

# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)

# 使用KNN分类器
knn_classifier = KNeighborsClassifier(n_neighbors=5)
knn_classifier.fit(X_train, y_train)
y_pred_knn = knn_classifier.predict(X_test)
accuracy_knn = accuracy_score(y_test, y_pred_knn)
print(f'KNN Accuracy: {accuracy_knn}')

# 使用SVM分类器
svm_classifier = SVC(kernel='linear')
svm_classifier.fit(X_train, y_train)
y_pred_svm = svm_classifier.predict(X_test)
accuracy_svm = accuracy_score(y_test, y_pred_svm)
print(f'SVM Accuracy: {accuracy_svm}')

# 使用PCA进行数据降维
pca = PCA(n_components=100)  # 选择降维后的维度
X_train_pca = pca.fit_transform(X_train)
X_test_pca = pca.transform(X_test)

# 使用LDA进行数据降维
lda = LinearDiscriminantAnalysis(n_components=min(X_train.shape[1], len(np.unique(y_train)) - 1))
X_train_lda = lda.fit_transform(X_train, y_train)
X_test_lda = lda.transform(X_test)

# 使用KNN分类器(PCA降维)
knn_classifier_pca = KNeighborsClassifier(n_neighbors=5)
knn_classifier_pca.fit(X_train_pca, y_train)
y_pred_knn_pca = knn_classifier_pca.predict(X_test_pca)
accuracy_knn_pca = accuracy_score(y_test, y_pred_knn_pca)
print(f'KNN with PCA Accuracy: {accuracy_knn_pca}')

# 使用SVM分类器(PCA降维)
svm_classifier_pca = SVC(kernel='linear')
svm_classifier_pca.fit(X_train_pca, y_train)
y_pred_svm_pca = svm_classifier_pca.predict(X_test_pca)
accuracy_svm_pca = accuracy_score(y_test, y_pred_svm_pca)
print(f'SVM with PCA Accuracy: {accuracy_svm_pca}')

# 使用KNN分类器(LDA降维)
knn_classifier_lda = KNeighborsClassifier(n_neighbors=5)
knn_classifier_lda.fit(X_train_lda, y_train)
y_pred_knn_lda = knn_classifier_lda.predict(X_test_lda)
accuracy_knn_lda = accuracy_score(y_test, y_pred_knn_lda)
print(f'KNN with LDA Accuracy: {accuracy_knn_lda}')

# 使用SVM分类器(LDA降维)
svm_classifier_lda = SVC(kernel='linear')
svm_classifier_lda.fit(X_train_lda, y_train)
y_pred_svm_lda = svm_classifier_lda.predict(X_test_lda)
accuracy_svm_lda = accuracy_score(y_test, y_pred_svm_lda)
print(f'SVM with LDA Accuracy: {accuracy_svm_lda}')

结果

目录
相关文章
|
3天前
|
机器学习/深度学习 存储 算法
用kNN算法诊断乳腺癌--基于R语言
用kNN算法诊断乳腺癌--基于R语言
|
1天前
|
算法 Python
利用贝叶斯算法对简单应用实现预测分类
利用贝叶斯算法对简单应用实现预测分类
4 0
|
1天前
|
机器学习/深度学习 算法 API
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
【Paddle】PCA线性代数基础 + 领域应用:人脸识别算法(1.1w字超详细:附公式、代码)
6 0
|
1天前
|
机器学习/深度学习 数据采集 算法
深入理解并应用机器学习算法:支持向量机(SVM)
【5月更文挑战第13天】支持向量机(SVM)是监督学习中的强分类算法,用于文本分类、图像识别等领域。它寻找超平面最大化间隔,支持向量是离超平面最近的样本点。SVM通过核函数处理非线性数据,软间隔和正则化避免过拟合。应用步骤包括数据预处理、选择核函数、训练模型、评估性能及应用预测。优点是高效、鲁棒和泛化能力强,但对参数敏感、不适合大规模数据集且对缺失数据敏感。理解SVM原理有助于优化实际问题的解决方案。
|
2天前
|
机器学习/深度学习 算法
理解并应用机器学习算法:决策树
【5月更文挑战第12天】决策树是直观的分类与回归机器学习算法,通过树状结构模拟决策过程。每个内部节点代表特征属性,分支代表属性取值,叶子节点代表类别。构建过程包括特征选择(如信息增益、基尼指数等)、决策树生成和剪枝(预剪枝和后剪枝)以防止过拟合。广泛应用在信贷风险评估、医疗诊断等领域。理解并掌握决策树有助于解决实际问题。
|
3天前
|
机器学习/深度学习 人工智能 算法
【机器学习】K-means和KNN算法有什么区别?
【5月更文挑战第11天】【机器学习】K-means和KNN算法有什么区别?
|
3天前
|
机器学习/深度学习 算法
应用规则学习算法识别有毒的蘑菇
应用规则学习算法识别有毒的蘑菇
|
8天前
|
存储 机器学习/深度学习 算法
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
R语言贝叶斯Metropolis-Hastings采样 MCMC算法理解和应用可视化案例
|
4天前
|
算法 数据安全/隐私保护 计算机视觉
基于二维CS-SCHT变换和LABS方法的水印嵌入和提取算法matlab仿真
该内容包括一个算法的运行展示和详细步骤,使用了MATLAB2022a。算法涉及水印嵌入和提取,利用LAB色彩空间可能用于隐藏水印。水印通过二维CS-SCHT变换、低频系数处理和特定解码策略来提取。代码段展示了水印置乱、图像处理(如噪声、旋转、剪切等攻击)以及水印的逆置乱和提取过程。最后,计算并保存了比特率,用于评估水印的稳健性。
|
1天前
|
算法 计算机视觉
基于高斯混合模型的视频背景提取和人员跟踪算法matlab仿真
该内容是关于使用MATLAB2013B实现基于高斯混合模型(GMM)的视频背景提取和人员跟踪算法。算法通过GMM建立背景模型,新帧与模型比较,提取前景并进行人员跟踪。文章附有程序代码示例,展示从读取视频到结果显示的流程。最后,结果保存在Result.mat文件中。