模式识别(4)SVM分类Iris和Sonar数据集

SVM分类Iris和Sonar数据集

       本文的重点是SVM的使用,所以并未从零开始实现SVM算法,只是关注其应用,具体实现调用SKlearn库中的函数,着重分析其中参数对结果的影响。

一、问题说明

       在iris数据集和sonar数据集上使用SVM算法进行分类。

二、数据说明

       UCI数据库是加州大学欧文分校(University of CaliforniaIrvine)提出的用于机器学习的数据库,这个数据库目前共有488个数据集,其数目还在不断增加,UCI数据集是一个常用的标准测试数据集。
每个数据文件(.data)包含以“属性-值”对形式描述的很多个体样本的记录。对应的.info文件包含的大量的文档资料。有些文件_generate_ databases;他们不包含*.data文件。作为数据集和领域知识的补充,在utilities目录里包含了一些在使用这一数据集时的有用资料。

三、原理分析

3.1 相关概念

       线性可分:给出训练数据集,存在向量和位移,使得其构造的超平面可以将数据集中的不同类别的样例正确的划分,则称该数据集为线性可分数据集,否则为线性不可分。
       超平面:即在n维的样本空间中找到一个划分超平面。
       函数间隔:给定一个样本,定义单个样本的函数间隔为:
在这里插入图片描述
在这里插入图片描述
       几何间隔:

在这里插入图片描述

3.2 基本思想

       Vapnik等人在多年研究统计学习理论基础上对线性分类器提出了另一种设计最佳准则。其原理也从线性可分说起,然后扩展到线性不可分的情况。甚至扩展到使用非线性函数中去,这种分类器被称为支持向量机(Support Vector Machine,简称SVM)。SVM的主要思想可以概括为两点:
       1)它是针对线性可分情况进行分析,对于线性不可分的情况,通过使用非线性映射算法将低维输入空间线性不可分的样本转化为高维特征空间使其线性可分,从而使得高维特征空间采用线性算法对样本的非线性特征进行线性分析成为可能。
       2)它基于结构风险最小化理论之上在特征空间中构建最优超平面,使得学习器得到全局最优化,并且在整个样本空间的期望以某个概率满足一定上界。
       在高维空间中的分类问题实际上是寻找一个超平面,将两类样本分开,这个超平面就叫做分类面。两类样本中离分类面最近的样本到分类面的距离称为分类间隔。最优超平面指的是分类间隔最大的超平面。支持向量机实质上提供了一种利用最优超平面进行分类的方法。由最优分类面可以确定两个与其平行的边界超平面。通过拉格朗日法求解最优分类面,最终可以得出结论:实际决定最优分类面位置的只是那些离分类面最近的样本。这些样本就被称为支持向量,它们可能只是训练样本中很少的一部分。支持向量如图所示:
在这里插入图片描述
       图中,H是最优分类面,H1和H2别是两个边界超平面。实心样本就是支持向量。由于最优超平面完全是由这些支持向量决定的,所以这种方法被称作支持向量机(SVM)。
       以上是线性可分的情况,对于线性不可分问题,可以在错分样本上增加一个惩罚因子来干预最优分类面的确定。这样一来,最优分类面不仅由离分类面最近的样本决定,还要由错分的样本决定。这种情况下的支持向量就由两部分组成:一部分是边界支持向量;另一部分是错分支持向量。
       对于非线性的分类问题,可以通过特征变换将非线性问题转化为新空间中的线性问题。但是这样做的代价是会造成样本维数增加,进而导致计算量急剧增加,这就是所谓的“维度灾难”。为了避免高维空间中的计算,可以引入核函数的概念。这样一来,无论变换后空间的维数有多高,这个新空间中的线性支持向量机求解都可以在原空间通过核函数来进行。常用的核函数有多项式核、高斯核(径向基核)、Sigmoid函数。

3.3 核函数

       核函数是一种映射,核技巧并不显式的定义映射函数,通过在学习和预测中定义核函数,特征空间的维度往往很高,甚至是无穷维的,并且对于给定的核函数,特征空间与映射函数的取法不唯一。
在这里插入图片描述
       核函数的有效性:K一定是一个对称矩阵。
       以下为部分常用的核函数:
在这里插入图片描述

四、结果求解

4.1 sonar数据集

       针对sonar数据集,采用高斯核函数,并随便其惩罚函数的值,得到其准确率随着惩罚函数的变化的曲线图,如下图所示:

在这里插入图片描述

4.2 Iris数据集

       针对iris数据集,分别采用高斯核函数,线性核函数和多项式核函数来观察其在不同的核函数的情况下的分类情况:
                                                                    高斯核函数
在这里插入图片描述
                                                                    线性核函数
在这里插入图片描述
                                                                    多项式核函数
在这里插入图片描述

五、结果分析

       根据求解结果可知,同样的数据集在使用不同的惩罚函数和不同的核函数时都会使得其分类准确率发生改变,因此针对不同的情况,应该选择合适的参数可以达到更高的分类准确率。

文章的pdf文件:link

六、附录

import numpy as np
import matplotlib.pyplot as plt
from sklearn import svm
import pandas as pd
sonar=pd.read_csv("D:\\Sonar.csv",header=None)
sonar_data=sonar.values[0:208,0:61]
# 训练集
# 第一类取0:60为训练集 ,第二类取97:180为训练集
sonar_train_data=sonar_data[range(0,61),0:61]
sonar_train_data=np.vstack((sonar_train_data,sonar_data[range(97,180),0:61]))
sonar_train_data=np.array(sonar_train_data)
sonar_train_label=sonar_train_data[:,0]
sonar_train_data=sonar_train_data[:,1:61]
print(sonar_train_data)
print(sonar_train_label)

# 测试集
# 第一类取61:97为测试集 ,第二类取180:208为测试集
sonar_test_data=sonar_data[range(61,97),0:61]
sonar_test_data=np.vstack((sonar_test_data,sonar_data[range(180,208),0:61]))
sonar_test_data=np.array(sonar_test_data)
sonar_test_label=sonar_test_data[:,0]
sonar_test_data=sonar_test_data[:,1:61]
print(sonar_test_data)
print(sonar_test_label)
b = []
a = []
for num in range(1,11):
    clf = svm.SVC(C=num/10, kernel='rbf', decision_function_shape='ovr')
    rf = clf.fit(sonar_train_data, sonar_train_label)
    #C:惩罚函数,默认是1(相当于惩罚松弛变量)
    #kernel:核函数,默认是rbf高斯核,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
    #ovr:一对多
    c = clf.score(sonar_train_data,sonar_train_label)
    print("训练次数:", num, "交叉验证验证准确率:", c)
    a.append(c)   #交叉验证准确率
    c = clf.score(sonar_test_data,sonar_test_label)
    print("训练次数:", num, "测试集准确率:", c)
b.append(c)  #测试集准确率
plt.figure(1)
plt.plot(range(1,11),a)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')

iris = pd.read_csv("D:\\iris.csv", header=0)
# 数据集分类,分训练集和测试集
iris_data=iris.values[0:150,0:6]
iris_data=np.array(iris_data[0:150,0:6])
# 训练集
iris_train_data=iris_data[range(0,30),0:6]
iris_train_data=np.vstack((iris_train_data,iris_data[range(50,80),0:6]))
iris_train_data=np.vstack((iris_train_data,iris_data[range(100,130),0:6]))
iris_train_data=np.array(iris_train_data)
iris_train_label=iris_train_data[:,5]
iris_train_data=iris_train_data[:,0:4]
iris_train_data=iris_train_data.astype('float64')
iris_train_label=iris_train_label.astype('float64')
print(iris_train_data.shape)
print(iris_train_label.shape)

# 测试集
iris_test_data=iris_data[range(30,50),0:6]
iris_test_data=np.vstack((iris_test_data,iris_data[range(80,100),0:6]))
iris_test_data=np.vstack((iris_test_data,iris_data[range(130,149),0:6]))
iris_test_data=np.array(iris_test_data)
iris_test_label=iris_test_data[:,5]
iris_test_data=iris_test_data[:,0:4]
iris_test_data=iris_test_data.astype('float64')
iris_test_label=iris_test_label.astype('float64')
print(iris_test_data.shape)
print(iris_test_label.shape)
b = []
a = []
for num in range(1,11):
    clf = svm.SVC(C=num/10, kernel='rbf', decision_function_shape='ovr')
    rf = clf.fit(iris_train_data, iris_train_label)
    #C:惩罚函数,默认是1(相当于惩罚松弛变量)
    #kernel:核函数,默认是rbf高斯核,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
    #ovr:一对多
    c = clf.score(iris_train_data,iris_train_label)
    print("训练次数:", num, "交叉验证验证准确率:", c)
    a.append(c)   #交叉验证准确率
    c = clf.score(iris_test_data,iris_test_label)
    print("训练次数:", num, "测试集准确率:", c)
b.append(c)  #测试集准确率
plt.figure(4)
plt.subplot(1,2,1)
plt.plot(range(1,11),a)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')
plt.subplot(1,2,2)
plt.plot(range(1,11),b)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')

b = []
a = []
for num in range(1,11):
    clf = svm.SVC(C=num/10, kernel='linear', decision_function_shape='ovr')
    rf = clf.fit(iris_train_data, iris_train_label)
    #C:惩罚函数,默认是1(相当于惩罚松弛变量)
    #kernel:核函数,默认是rbf高斯核,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
    #ovr:一对多
    c = clf.score(iris_train_data,iris_train_label)
    print("训练次数:", num, "交叉验证验证准确率:", c)
    a.append(c)   #交叉验证准确率
    c = clf.score(iris_test_data,iris_test_label)
    print("训练次数:", num, "测试集准确率:", c)
b.append(c)  #测试集准确率
plt.figure(4)
plt.subplot(1,2,1)
plt.plot(range(1,11),a)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')
plt.subplot(1,2,2)
plt.plot(range(1,11),b)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')

b = []
a = []
for num in range(1,11):
    clf = svm.SVC(C=num/10, kernel='poly', decision_function_shape='ovr')
    rf = clf.fit(iris_train_data, iris_train_label)
    #C:惩罚函数,默认是1(相当于惩罚松弛变量)
    #kernel:核函数,默认是rbf高斯核,可以是‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’
    #ovr:一对多
    c = clf.score(iris_train_data,iris_train_label)
    print("训练次数:", num, "交叉验证验证准确率:", c)
    a.append(c)   #交叉验证准确率
    c = clf.score(iris_test_data,iris_test_label)
    print("训练次数:", num, "测试集准确率:", c)
b.append(c)  #测试集准确率
plt.figure(5)
plt.subplot(1,2,1)
plt.plot(range(1,11),a)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')
plt.subplot(1,2,2)
plt.plot(range(1,11),b)
plt.grid()
plt.xlabel('C/10')
plt.ylabel('acc')
  • 7
    点赞
  • 74
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值