svm多分类__人脸识别

18人阅读 评论(0) 收藏 举报
分类:
# -*-encoding: utf-8 -*-
"""
@version: 3.6
@time: 2018/4/16 22:45
@author: SunnyYang
"""
from __future__  import print_function

from time import time   #计算每个步骤花费多长时间
from matplotlib import pyplot as plt
import logging
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_lfw_people
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.metrics import confusion_matrix
from sklearn.decomposition import RandomizedPCA
from sklearn.decomposition import PCA
from sklearn.svm import SVC
#打印输出日志信息
logging.basicConfig(format='%(asctime)s : %(levelname)s : %(message)s', level=logging.INFO,filename='svmFaceRecongnize.log') #打印时间,日志级别以及日志信息

#数据采集
lfw_people = fetch_lfw_people(min_faces_per_person=70,resize=0.2)   #fetch_lfw_people()用来下载名人数据
#数据预处理
n_samples, h, w = lfw_people.images.shape   #数据集共有多少个样本,以及每一张图片的high 和width
print('共有 %s 个样本,height=%s,width=%s'%(n_samples,h,w))   #注意占位符的使用是用%()的形式,而不是每一个都用占位符
X = lfw_people.data  #data属性是取出所有特征值,每一行是一个样本,每一列是一个特征
# e = X[0:5,:] #切片操作取出矩阵的0到5行,和所有列
# print(e)
n_features = X.shape[1]  # 450个特征值,1表示的是列 0表示的是行数
n_sampless = X.shape[0]  #1288行 实例的个数
print('特征数量%s,样本数量%s'%(n_features,n_sampless))  #450,1288
y = lfw_people.target #每一个实例的类别标记
target_names = lfw_people.target_names  #提取不同人的身份,就是真实的名字是什么
n_class = target_names.shape[0] #总共有多少个人=多少类=多少行进行人脸识别
print(len(y))
print('总共有多少个人进行训练',n_class)
print('用于训练的人名称如下:',target_names)

#拆分成训练集和测试集
x_train,x_test,y_train,y_test = train_test_split(X,y,test_size=0.25) #x_train,x_test是一个特征矩阵,y_train,y_test是对应的标记向量
#数据降维及模型训练
n_components = 150 #组成元素的数量,也就是降维后的维度
print('从%s个样本中抽取%s个样本:' %(x_train.shape[0],n_components))
t0 = time() #定义一个起始时间
pca = RandomizedPCA(n_components=n_components,whiten=True).fit(x_train)  #采用经典的pca主成分降维方法
# pca = PCA(svd_solver='ranomized',n_components=n_components,whiten=True).fit(x_train)  #
print('训练pca模型的时间%0.3fs:'%(time()-t0))
eigenfaces = pca.components_.reshape((n_components,h,w)) #从一张人脸上提取一些特征 ,对于人脸的一张照片上提取的特征值名为eigenfaces
x_train_pca = pca.transform(x_train) #将训练集中的所有特征值通过pca转换成低纬特征量
x_test_pca = pca.transform(x_test) #同理将测试集也降维

#核函数的构造,c惩罚因子也有人说是权重,gamma是特征值的对应的比例也就是有多少个特征点被使用 ,参数中共有6*6=36中不同的组合
param_grid = {'C':[1e3,5e3,1e4,5e4,1e5,5e5],
              'gamma':[0.0001,0.0005,0.01,0.05,0.1,0.5]
              }
clf = GridSearchCV( SVC(kernel='rbf',class_weight='balanced'),param_grid) #将参数的各种组合均放到svc中进行计算,最后看哪一组参数的效果好
clf = clf.fit(x_train_pca,y_train) #建模,找到使得边际最大的超平面
print(clf.best_estimator_) #打印输出最好的模型所对应的参数
#预测
y_pred = clf.predict(x_test_pca)
print('测试集的预测结果查看准确率',classification_report(y_test,y_pred,target_names=target_names)) #预测的准确率是多少
print(confusion_matrix(y_test,y_pred,labels=range(n_class))) #预测矩阵,对角线上的值越多,则说明预测的准确率越高,行和列分别是真实的和预测的标记,如果两者相等则值加一,所以对角线上的值是最有效的
#可视化预测结果和特征矩阵
def plot_galley(images,titles,h,w,n_row=3,n_col=4):
    plt.figure(figsize=(1.8 * n_col,2.5 * n_row))
    plt.subplots_adjust(bottom=0,left=.01,right=.99,top=.90,hspace=.35)
    for i in range(n_row * n_col):
        plt.subplot(n_row,n_col,i+1) #subplot()三个参数,分别是几行几列子图的位置在第几个
        plt.imshow(images[i].reshape((h,w)),cmap=plt.cm.gray) #imshow()展示的是一个矩阵images重新按照h,w来重构,reshape是np中的一个数组重构的方法,cmap=colormap
        plt.title(titles[i],size=12)
        plt.xticks(())  #x轴刻度
        plt.yticks(())  #y轴刻度

def title(y_pred,y_test,target_names,i):
    pre_name = target_names[y_pred[i]].rsplit(' ',1)[-1]   #预测的名字
    true_name = target_names[y_test[i]].rsplit(' ',1)[-1]   #真实的名字
    return 'predict %s\ntrue    %s'%(pre_name,true_name)    #

prediction_titles = [title(y_pred,y_test,target_names,i) for i in range(y_pred.shape[0])] #预测的人名字
plot_galley(x_test,prediction_titles,h,w)   #
eigenface_titles = ['eigenface %d '% i for i in range(eigenfaces.shape[0])]     #
plot_galley(eigenfaces,eigenface_titles,h,w)  #提取的特征向量组成的脸是什么样子的
plt.show()



查看评论

使用支持向量机(SVM) 算法进行模式识别实战

ython 在机器学习领域应用是非常广泛的,比如,我们可以使用机器学习进行验证码识别,使用机器学习实现计算机视觉项目,或者,我们也可以使用机器学习技术实现网页分类、文本挖掘、情感分析等等各种各样的事情。机器学习的重点在于算法,而算法的学习相对来说是比较枯燥的,所以,只有在学习的时候让算法跟实例结合,才能够让算法的学习变得不枯燥,并且也才能够更好的将理论运用与实践。
  • 2017年04月19日 11:19

OpenCV--SVM多分类问题

物体识别中经常遇到多分类器问题,svm是比较成熟和直接的想法。一般来说使用svm作为多分类器主要有以下思路: 一对多(one-vs-all)。训练时依次将目标类别作为正样本,其余样本作为负样本,以此训...
  • heroacool
  • heroacool
  • 2016-03-28 12:50:43
  • 5379

svm源码实现

  • 2018年01月02日 20:42
  • 2.09MB
  • 下载

SVM 多分类 -SVM分类opencv3.0源代码

SVM多分类的一些笔记,以及在OpenCV3.0上的SVM分类代码
  • coder_oyang
  • coder_oyang
  • 2015-08-05 19:52:28
  • 4999

SVM的matlab代码及SVM的多分类的作法

SVM是常用的一种有监督的学习模型(即给你一些输入特征,告诉你这些特征的样本是属于A类,再给你一些输入特征,告诉你这些特征的样本是属于B类,现在再来一些数据,来判断它们是属于哪一类)。 它与Kmea...
  • fengsigaoju
  • fengsigaoju
  • 2016-08-25 15:43:17
  • 16676

多分类svm程序

  • 2014年05月07日 10:49
  • 351KB
  • 下载

SVM解决多分类问题的方法

SVM解决多分类问题的方法  SVM算法最初是为二值分类问题设计的,当处理多类问题时,就需要构造合适的多类分类器。目前,构造SVM多类分类器的方法主要有两类:一类是直接法,直接在目标函数上进行修改,...
  • qing101hua
  • qing101hua
  • 2016-02-18 18:02:28
  • 5190

matlab利用hinge loss实现多分类SVM

介绍 hinge loss code1 介绍本文将介绍hinge loss E(w)E(w)以及其梯度∇E(w)\nabla E(w)。并利用批量梯度下降方法来优化hinge loss实现SVM多分类...
  • hlx371240
  • hlx371240
  • 2017-03-15 09:56:35
  • 6249

SVM如何解决多分类问题

从 SVM的那几张图可以看出来,SVM是一种典型的两类分类器,即它只回答属于正类还是负类的问题。而现实中要解决的问题,往往是多类的问题(少部分例外,例如垃圾邮件过滤,就只需要确定“是”还是“不是”垃圾...
  • keepreder
  • keepreder
  • 2015-08-07 14:41:27
  • 3008

sklearn学习笔记(3)svm多分类

SVC、NuSVC、LinearSVC都可以在一个数据集上实现多分类。 SVC和NuSVC方法类似,但是有不同的输入参数集和不同的数学表述。另一方面,linearSVC是SVC的在线性核的基础上的另...
  • BabyBirdToFly
  • BabyBirdToFly
  • 2017-06-06 19:55:45
  • 7353
    个人资料
    持之以恒
    等级:
    访问量: 10万+
    积分: 2025
    排名: 2万+
    最新评论