机器学习---支持向量机(SVM)算法应用(下)

利用SVM进行人脸识别实例:

源码

# !/usr/bin/env python
# -*- coding: utf-8 -*-
# Author: Justin Chan

#在python2.x版本中要使用Python3.x的特性,可以使用__future__模块导入相应的接口,减少对当前低版本影响
#from __future__ import print_function

#计时,程序运行时间
from time import time
#打印程序进展时的一些信息
import logging
#最后识别出来的人脸通过绘图打印出来
import matplotlib.pyplot as plt

#当import 一个模块比如如下模块cross_validation时,会有删除横线,表示该模块在当前版本可能已经被删除,在新版本中改为model_selection模块
#DeprecationWarning: This module was deprecated in version 0.18 in favor of the model_selection module into which all the refactored classes and functions are moved. Also note that the interface of the new CV iterators are different from that of this module. This module will be removed in 0.20."This module will be removed in 0.20.", DeprecationWarning)
#from sklearn.cross_validation import train_test_split
from sklearn.model_selection import train_test_split
from sklearn.datasets import fetch_lfw_people
#grid_search已经被移除
#from sklearn.grid_search import GridSearchCV
from sklearn.model_selection import GridSearchCV
from sklearn.metrics import classification_report
from sklearn.decomposition import RandomizedPCA
from sklearn.svm import SVC
#导入混淆矩阵模块confusion_matrix()
from sklearn.metrics import confusion_matrix

print(__doc__)

# Display progress logs on stdout程序进展的信息打印出来
logging.basicConfig(level=logging.INFO, format='%(asctime)s %(message)s')

###############################################################################
# Download the data, if not already on disk and load it as numpy arrays
#下载人脸库 http://vis-www.cs.umass.edu/lfw/

lfw_people = fetch_lfw_people(min_faces_per_person=70, resize=0.4)

# introspect the images arrays to find the shapes (for plotting)
n_samples, h, w = lfw_people.images.shape

# for machine learning we use the 2 data directly (as relative pixel
# positions info is ignored by this model)
#获取特征向量矩阵
X = lfw_people.data
#特征向量的维度(列数)或者称特征点的个数
n_features = X.shape[1]

# the label to predict is the id of the person
#返回每一组的特征标记
y = lfw_people.target
target_names = lfw_people.target_names
#返回多少类(多少行),也就是多少个人进行人脸识别
n_classes = target_names.shape[0]

print("Total dataset size:")
print("n_samples: %d" % n_samples)
print("n_features: %d" % n_features)
print("n_classes: %d" % n_classes)


###############################################################################
# Split into a training set and a test set using a stratified k fold
# split into a training and testing set
#将数据集拆分成四个部分
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)


###############################################################################
#PCA降维方法,减少特征值,降低复杂度。
# Compute a PCA (eigenfaces) on the face dataset (treated as unlabeled
# dataset): unsupervised feature extraction / dimensionality reduction
n_components = 150

print("Extracting the top %d eigenfaces from %d faces" % (n_components, X_train.shape[0]))
t0 = time()
pca = RandomizedPCA(n_components=n_components, whiten=True).fit(X_train)

print("done in %0.3fs" % (time() - t0))

#提取特征值
eigenfaces = pca.components_.reshape((n_components, h, w))

print("Projecting the input data on the eigenfaces orthonormal basis")
t0 = time()
X_train_pca = pca.transform(X_train)
X_test_pca = pca.transform(X_test)
print("done in %0.3fs" % (time() - t0))


###############################################################################
# Train a SVM classification model

print("Fitting the classifier to the training set")
t0 = time()
param_grid = {'C': [1e3, 5e3, 1e4, 5e4, 1e5],'gamma': [0.0001, 0.0005, 0.001, 0.005, 0.01, 0.1], }
#clf = GridSearchCV(SVC(kernel='rbf', class_weight='auto'), param_grid)
clf = GridSearchCV(SVC(kernel='rbf'), param_grid)
clf = clf.fit(X_train_pca, y_train)
print("done in %0.3fs" % (time() - t0))
print("Best estimator found by grid search:")
print(clf.best_estimator_)


###############################################################################
# Quantitative evaluation of the model quality on the test set

print("Predicting people's names on the test set")
t0 = time()
y_pred = clf.predict(X_test_pca)
print("done in %0.3fs" % (time() - t0))

print(classification_report(y_test, y_pred, target_names=target_names))
print(confusion_matrix(y_test, y_pred, labels=range(n_classes)))


###############################################################################
# Qualitative evaluation of the predictions using matplotlib

def plot_gallery(images, titles, h, w, n_row=3, n_col=4):
    """Helper function to plot a gallery of portraits"""
    plt.figure(figsize=(1.8 * n_col, 2.4 * 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)
        plt.imshow(images[i].reshape((h, w)), cmap=plt.cm.gray)
        plt.title(titles[i], size=12)
        plt.xticks(())
        plt.yticks(())


# plot the result of the prediction on a portion of the test set

def title(y_pred, y_test, target_names, i):
    pred_name = target_names[y_pred[i]].rsplit(' ', 1)[-1]
    true_name = target_names[y_test[i]].rsplit(' ', 1)[-1]
    return 'predicted: %s\ntrue:      %s' % (pred_name, true_name)

prediction_titles = [title(y_pred, y_test, target_names, i)
                     for i in range(y_pred.shape[0])]

plot_gallery(X_test, prediction_titles, h, w)

# plot the gallery of the most significative eigenfaces

eigenface_titles = ["eigenface %d" % i for i in range(eigenfaces.shape[0])]
plot_gallery(eigenfaces, eigenface_titles, h, w)

plt.show()

运行结果

None
Total dataset size:
n_samples: 1288
n_features: 1850
n_classes: 7
Extracting the top 150 eigenfaces from 966 faces
/usr/local/lib/python3.5/dist-packages/sklearn/utils/deprecation.py:58: DeprecationWarning: Class RandomizedPCA is deprecated; RandomizedPCA was deprecated in 0.18 and will be removed in 0.20. Use PCA(svd_solver='randomized') instead. The new implementation DOES NOT store whiten ``components_``. Apply transform to get them.
  warnings.warn(msg, category=DeprecationWarning)
done in 0.077s
Projecting the input data on the eigenfaces orthonormal basis
done in 0.010s
Fitting the classifier to the training set
done in 23.559s
Best estimator found by grid search:
SVC(C=1000.0, cache_size=200, class_weight=None, coef0=0.0,
  decision_function_shape='ovr', degree=3, gamma=0.005, kernel='rbf',
  max_iter=-1, probability=False, random_state=None, shrinking=True,
  tol=0.001, verbose=False)
Predicting people's names on the test set
done in 0.056s
                   precision    recall  f1-score   support

     Ariel Sharon       1.00      0.60      0.75        20
     Colin Powell       0.80      0.85      0.82        55
  Donald Rumsfeld       0.96      0.71      0.81        31
    George W Bush       0.79      0.99      0.88       128
Gerhard Schroeder       0.83      0.83      0.83        24
      Hugo Chavez       1.00      0.59      0.74        27
       Tony Blair       1.00      0.73      0.84        37

      avg / total       0.86      0.84      0.84       322

[[ 12   2   1   5   0   0   0]
 [  0  47   0   8   0   0   0]
 [  0   4  22   5   0   0   0]
 [  0   1   0 127   0   0   0]
 [  0   1   0   3  20   0   0]
 [  0   2   0   6   3  16   0]
 [  0   2   0   7   1   0  27]]

预测与真实结果

这里写图片描述

生成结果

这里写图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
作为结构风险最小化准则的具体实现,支持向量机方法具有全局最优、结构简单、推广能力强等优点,近几年得到了广泛的研究。本文仔细研究了支持向量机理论,并针对目前一些支持向量机算法存在的缺陷,分析了产生的原因,提出了两种新的支持向量机算法。针对支持向量机算法难以处理大规模数据的问题,提出了两种新的支持向量机分类方法。并就多类别分类问题等方面开展了初步的理论研究。 本文主要工作包括: (1)讨论了支持向量机理论中各种变形的支持向量机算法,对常规支持向量机公式进行变形的算法主要有C-SVM系列、ν-SVM系列、One-class SVM、RSVM、WSVM和LS-SVM算法,通过增加函数项、变量或系数等方法使公式变形,产生出各种有某一方面优势或者一定应用范围的算法。通过比较它们各自的优缺点等情况,为提出新的支持向量机算法做了理论准备。 (2)介绍了超球面支持向量机算法的思想,以及超球面和超平面的区别。研究了目前超球面支持向量机算法,它们的目标函数中缺少了使分类间隔尽量大这个条件,而这个条件是统计学习理论中结构风险最小化的体现,直接反映了算法的推广能力。因此,提出了一种新的超球面支持向量机算法,具有较好的推广能力,成功地解决了现有超球面支持向量机算法在推广能力的缺陷。 (3)针对某些支持向量机算法不能解决样本类别之间差异造成的不良影响的缺陷,提出了一种新的加权支持向量机算法,该算法具有补偿类别差异的优点,可应用于解决多类别分类问题。并且从另外一个角度对加权C-SVM算法和加权ν-SVM算法的类别补偿性能进行了分析。 (4)提出了基于粗糙集理论和支持向量机理论的粗SVM分类方法。该方法采用粗糙集属性约简的思想减少属性个数,且在属性约简过程中选出几组合适的属性集组成新的属性集,使模型具有一定的抗信息丢失能力。同时充分利用支持向量机理论的良好推广性能,提高了预测分类精度。 (5)提出了基于主成分分析方法和支持向量机理论的去噪声加权SVM分类方法。该方法通过引入主成分分析方法来降维去噪声,同时补偿类别差异造成的不利影响,提高了预测分类精度。 (6)把支持向量机理论应用到污水处理过程运行状态监控中去。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值