模式识别实验-高斯核支持向量机(SVM)在手写字符识别中的应用

一、实验目的

  1. 掌握高斯核支持向量机(SVM)在手写字符识别中的应用。
  2. 对比调用函数和非调用两种方式实现SVM的效果。
  3. 探究高斯核(RBF)参数和正则化参数C对SVM性能的影响。
  4. 分析手写字符的训练和测试误差,评估模型性能。

二、实验原理

        支持向量机是一种二分类模型,其基本模型定义为特征空间上的间隔最大的线性分类器,通过引入核函数,SVM可以处理非线性分类问题。高斯核(RBF核)是一种常用的核函数,能够将数据映射到高维空间,使得原本线性不可分的数据变得线性可分。

三、实验过程

  1. 加载数据集,划分为训练集和测试集。
  2. 对图像数据进行标准化处理。
  3. 使用scikit-learn库的SVC类,指定kernel为'rbf'(高斯核)。
  4. 通过网格搜索和交叉验证挑选最佳的高斯核参数gamma和正则化参数C。
  5. 分析不同参数组合对训练和测试误差的影响。
  6. 在测试集上进行预测,计算训练和测试误差。

四、实验代码

from sklearn.datasets import load_digits

from sklearn.model_selection import train_test_split

from sklearn.preprocessing import StandardScaler

from sklearn.svm import LinearSVC

from sklearn.svm import SVC

from sklearn.metrics import classification_report

from sklearn.model_selection import GridSearchCV

from sklearn import svm

# 导入数据

digits=load_digits()

# 分割数据集为训练集和测试集

X_train,X_test,y_train,y_test=train_test_split(digits.data,digits.target,test_size=0.25,random_state=33)

print("X_train original shape", X_train.shape)

# 标准化数据

ss=StandardScaler()

X_train=ss.fit_transform(X_train)

X_test=ss.fit_transform(X_test)

# 定义SVM模型,使用高斯核(RBF)

svm_model = svm.SVC(kernel='rbf') 

# 定义gamma值的搜索范围

param_grid = {'gamma': [0.001, 0.01, 0.1, 1, 10, 100, 1000]}

# 使用网格搜索和交叉验证来找到最佳gamma值

grid_search = GridSearchCV(estimator=svm_model, param_grid=param_grid, cv=5) 

grid_search.fit(X_train, y_train)

# 输出最佳gamma值和对应的模型性能

best_gamma = grid_search.best_params_['gamma']

best_score = grid_search.best_score_

print(f"Best gamma: {best_gamma}, Best score: {best_score}")

# 定义参数网格

param_grid = {'C': [1, 10, 100, 1000]}

# 创建SVM模型实例

svm = SVC(kernel='rbf', gamma=best_gamma)

# 使用网格搜索和交叉验证找到最佳C值,使用准确率作为评分指标

grid_search = GridSearchCV(svm, param_grid, cv=5, scoring='accuracy') 

grid_search.fit(X_train, y_train)

# 输出最佳参数和得分

best_params = grid_search.best_params_['C']

best_score = grid_search.best_score_

print(f"Best parameters: {best_params}")

print(f"Best cross-validation score: {best_score}")

# 2.2高斯核的影响:分别取gamma=0.001,0.01,0.1,1,10,100,1000

lsvc2=SVC(C=best_params,kernel='rbf',gamma=best_gamma)

lsvc2.fit(X_train,y_train)

y_predict=lsvc2.predict(X_test)

### 性能评估

print('Accuracy of SVC of rbf kernel:',lsvc2.score(X_test,y_test))

print(classification_report(y_test,y_predict,target_names=digits.target_names.astype(str)))

五、实验结果

X_train original shape (1347, 64)

Best gamma: 0.01, Best score: 0.9747680022029466

Best parameters: 1

Best cross-validation score: 0.9747680022029466

Accuracy of SVC of rbf kernel: 0.9844444444444445

              precision    recall  f1-score   support

           0       1.00      1.00      1.00        35

           1       0.98      1.00      0.99        54

           2       1.00      0.98      0.99        44

           3       1.00      0.98      0.99        46

           4       1.00      0.94      0.97        35

           5       0.96      0.98      0.97        48

           6       0.98      1.00      0.99        51

           7       1.00      1.00      1.00        35

           8       0.95      0.98      0.97        58

           9       1.00      0.98      0.99        44

    accuracy                           0.98       450

   macro avg       0.99      0.98      0.99       450

weighted avg       0.98      0.98      0.98       450

根据经验多次调整高斯核参数,发现参数为0.045 能够得到更好的结果。

X_train original shape (1347, 64)

Best gamma: 0.01, Best score: 0.9747680022029466

Best parameters: 1

Best cross-validation score: 0.9747680022029466

Accuracy of SVC of rbf kernel: 0.9933333333333333

              precision    recall  f1-score   support

           0       1.00      1.00      1.00        35

           1       1.00      1.00      1.00        54

           2       1.00      0.98      0.99        44

           3       1.00      1.00      1.00        46

           4       0.97      1.00      0.99        35

           5       0.98      0.98      0.98        48

           6       0.98      1.00      0.99        51

           7       1.00      1.00      1.00        35

           8       1.00      1.00      1.00        58

           9       1.00      0.98      0.99        44

    accuracy                           0.99       450

   macro avg       0.99      0.99      0.99       450

weighted avg       0.99      0.99      0.99       450

六、结论

        通过本次实验,我们成功地使用高斯核SVM实现了手写字符识别,调用函数实现SVM。同时,我们也探究了高斯核参数和正则化参数对SVM性能的影响,并通过交叉验证挑选了最佳参数组合。本次实验加深了我们对SVM原理和应用的理解,为后续的研究和应用提供了基础,也提升了我对于模式识别的学习兴趣。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值