支持向量机SVM代码详解——多分类/降维可视化/参数优化【python】

这篇具有很好参考价值的文章主要介绍了支持向量机SVM代码详解——多分类/降维可视化/参数优化【python】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

篇1:SVM原理及多分类python代码实例讲解(鸢尾花数据)

SVM原理

支持向量机(Support Vector Machine,SVM),主要用于小样本下的二分类、多分类以及回归分析,是一种有监督学习的算法。基本思想是寻找一个超平面来对样本进行分割,把样本中的正例和反例用超平面分开,其原则是使正例和反例之间的间隔最大。

SVM学习的基本想法是求解能够正确划分训练数据集并且几何间隔最大的分离超平面。如下图所示,wx+b=0即为分离超平面,对于线性可分的数据集来说,这样的超平面有无穷多个(即感知机),但是几何间隔最大的分离超平面却是唯一的。

svm分类代码,数学建模常见算法模型,python,机器学习,数学建模,支持向量机

SVM实现分类代码 

1.数据集介绍——鸢尾花数据集

下载方式:通过UCI Machine Learning Repository下载或者直接使用代码

from sklearn.datasets import load_iris

数据展示与介绍(iris.data)

svm分类代码,数学建模常见算法模型,python,机器学习,数学建模,支持向量机

Iris.data中有5个属性,包括4个预测属性(萼片长度、萼片宽度、花瓣长度、花瓣宽度)和1个类别属性(Iris-setosa、Iris-versicolor、Iris-virginica三种类别)。首先,需要将第五列类别信息转换为数字,再选择输入数据和标签。

 2.多分类python代码(二分类可看做只有两类的多分类)

from sklearn import svm #引入svm包
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from sklearn.model_selection import train_test_split
#定义字典,将字符与数字对应起来
def Iris_label(s):
    it={b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2}
    return it[s]
#读取数据,利用np.loadtxt()读取text中的数据
path='iris.data'              #将下载的原始数据放到项目文件夹,即可不用写路径
data= np.loadtxt(path, dtype=float, delimiter=',', converters={4:Iris_label}) #分隔符为‘,'
#确定输入和输出
x,y=np.split(data,(4,),axis=1)   #将data按前4列返回给x作为输入,最后1列给y作为标签值
x=x[:,0:2]              #取x的前2列作为svm的输入,为了便于可视化展示
#划分数据集和标签:利用sklearn中的train_test_split对原始数据集进行划分,本实验中训练集和测试集的比例为7:3。
train_data,test_data,train_label,test_label=train_test_split(x,y,random_state=1,train_size=0.7,test_size=0.3)
#创建svm分类器并进行训练:首先,利用sklearn中的SVC()创建分类器对象,其中常用的参数有C(惩罚力度)、kernel(核函数)、gamma(核函数的参数设置)、decision_function_shape(因变量的形式),再利用fit()用训练数据拟合分类器模型。
'''C越大代表惩罚程度越大,越不能容忍有点集交错的问题,但有可能会过拟合(defaul C=1);
kernel常规的有‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ ,默认的是rbf;
gamma是核函数为‘rbf’, ‘poly’ 和 ‘sigmoid’时的参数设置,其值越小,分类界面越连续,其值越大,分类界面越“散”,分类效果越好,但有可能会过拟合,默认的是特征个数的倒数;
decision_function_shape='ovr'时,为one v rest(一对多),即一个类别与其他类别进行划分,等于'ovo'时,为one v one(一对一),即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
'''
model=svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')
model.fit(train_data,train_label.ravel())    #ravel函数在降维时默认是行序优先
#利用classifier.score()分别计算训练集和测试集的准确率。
train_score = model.score(train_data,train_label)
print("训练集:",train_score)
test_score = model.score(test_data,test_label)
print("测试集:",test_score)
#决策函数的查看(可省略)
#print('train_decision_function:\n',model.decision_function(train_data))#(90,3)

输出结果:

svm分类代码,数学建模常见算法模型,python,机器学习,数学建模,支持向量机

分类结果的可视化(由于只选取了2个维度的输入数据,所以可视化可直接进行二维平面作图)

#训练集和测试集的预测结果
trainPredict = (model.predict(train_data).reshape(-1, 1))
testPredict = model.predict(test_data).reshape(-1, 1)
#将预测结果进行展示,首先画出预测点,再画出分类界面
#预测点的画法,可参考https://zhuanlan.zhihu.com/p/81006952
#画图例和点集
x1_min,x1_max=x[:,0].min(),x[:,0].max()   #x轴范围
x2_min,x2_max=x[:,1].min(),x[:,1].max()   #y轴范围
matplotlib.rcParams['font.sans-serif']=['SimHei']   #指定默认字体
cm_dark=matplotlib.colors.ListedColormap(['g','r','b'])  #设置点集颜色格式
cm_light=matplotlib.colors.ListedColormap(['#A0FFA0','#FFA0A0','#A0A0FF'])  #设置边界颜色
plt.xlabel('length',fontsize=13)        #x轴标注
plt.ylabel('width',fontsize=13)        #y轴标注
plt.xlim(x1_min,x1_max)                   #x轴范围
plt.ylim(x2_min,x2_max)                   #y轴范围
plt.title('SVM result')          #标题
plt.scatter(x[:,0],x[:,1],c=y[:,0],s=30,cmap=cm_dark)  #画出测试点
plt.scatter(test_data[:,0],test_data[:,1],c=test_label[:,0],s=30,edgecolors='k',zorder=2,cmap=cm_dark) #画出预测点,并将预测点圈出 
#画分类界面
x1,x2=np.mgrid[x1_min:x1_max:200j,x2_min:x2_max:200j]#生成网络采样点
grid_test=np.stack((x1.flat,x2.flat),axis=1)#测试点
grid_hat=model.predict(grid_test)# 预测分类值
grid_hat=grid_hat.reshape(x1.shape)# 使之与输入的形状相同
plt.pcolormesh(x1,x2,grid_hat,cmap=cm_light)# 预测值的显示
plt.show()

可视化绘图结果:

svm分类代码,数学建模常见算法模型,python,机器学习,数学建模,支持向量机

 根据结果,发现分类的效果并不好。接着,将输入鸢尾花的所有特征进行训练,并将分类结果降维后可视化展示。

篇2:SVM实现高维数据多分类及其可视化

多维特征svm的python代码实现

多特征的SVM代码实现只需要将前述代码中的

#x=x[:,0:2]              #取x的前2列作为svm的输入,为了便于可视化展示

此句注释掉即可

训练输出结果如下:

svm分类代码,数学建模常见算法模型,python,机器学习,数学建模,支持向量机 

由于全部的特征共有四个维度,不方便直接进行可视化展示,所以需要利用PCA降维后再绘制可视化图。

PCA——主成分分析法

PCA设法将原来众多具有一定相关性的属性(比如p个属性),重新组合成一组相互无关的综合属性来代替原属性。通常数学上的处理就是将原来p个属性做线性组合,作为新的综合属性。

PCA 中的线性变换等价于坐标变换,变换的目的是使n个样本点在新坐标轴 y 1上的离散程度(方差)最大,这样变量 y 1就代表了原始数据的绝大部分信息,即使忽略 y 2也无损大局,从而把两个指标压缩成一个指标。从几何上看,找主成分的问题就是找出 N 维空间中椭球体的主轴问题。从数学上也可以证明,它们分别是相关矩阵的 k 个较大的特征值所对应的特征向量。

Python实现代码

#pca降维
#直接使用sklearn中的PCA进行降维
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(x)
xx=pca.transform(x) # 降维后的结果
train_data_2,test_data_2,train_label_2,test_label_2=train_test_split(xx,y,random_state=1,train_size=0.7,test_size=0.3)#降维后的测试集划分

降维后的分类训练结果可视化展示

#训练集和测试集的预测结果
trainPredict = (model.predict(train_data).reshape(-1, 1))
testPredict = model.predict(test_data).reshape(-1, 1)
#将预测结果进行展示,首先画出预测点,再画出分类界面
#预测点的画法,可参考https://zhuanlan.zhihu.com/p/81006952
#画图例和点集
xx1_min,xx1_max=xx[:,0].min(),xx[:,0].max()   #x轴范围
xx2_min,xx2_max=xx[:,1].min(),xx[:,1].max()   #y轴范围
matplotlib.rcParams['font.sans-serif']=['SimHei']   #指定默认字体
cm_dark=matplotlib.colors.ListedColormap(['g','r','b'])  #设置点集颜色格式
cm_light=matplotlib.colors.ListedColormap(['#A0FFA0','#FFA0A0','#A0A0FF'])  #设置边界颜色
plt.xlabel('fea1',fontsize=13)        #x轴标注
plt.ylabel('fea2',fontsize=13)        #y轴标注
plt.xlim(xx1_min,xx1_max)                   #x轴范围
plt.ylim(xx2_min,xx2_max)                   #y轴范围
plt.title('SVM result')          #标题
plt.scatter(xx[:,0],xx[:,1],c=y[:,0],s=30,cmap=cm_dark)  #画出测试点
plt.scatter(test_data_2[:,0],test_data_2[:,1],c=testPredict[:,0],s=80,edgecolors='k',marker='+',zorder=2,cmap=cm_dark) #画出测试点,并将预测点圈出(注意这里是测试集的预测标签值) 
plt.show()

输出结果

svm分类代码,数学建模常见算法模型,python,机器学习,数学建模,支持向量机

这里由于分类界面降维后难以直观展示,所以采用预测值和实际值点来展示分类效果。

其中,绿、红、蓝三种颜色代表花的三个品种,横纵坐标为pca降维后的两个特征维度,没有实际意义。圆点指真实分类,包含训练集和测试集。“+”形状的点为模型输出的预测值,仅含测试集。

从图中可以看出,降维后三类花的分布具有明显的聚类特性,而绝大多数测试集预测值都与真实值重合(即同颜色的圆点与十字形状重合),仅有少量样本出现预测误差。文章来源地址https://www.toymoban.com/news/detail-706947.html

 总代码

from sklearn import svm #引入svm包
import numpy as np
import matplotlib.pyplot as plt
import matplotlib
from sklearn.model_selection import train_test_split
#定义字典,将字符与数字对应起来
def Iris_label(s):
    it={b'Iris-setosa':0, b'Iris-versicolor':1, b'Iris-virginica':2}
    return it[s]
#读取数据,利用np.loadtxt()读取text中的数据
path='iris.data'              #将下载的原始数据放到项目文件夹,即可不用写路径
data= np.loadtxt(path, dtype=float, delimiter=',', converters={4:Iris_label}) #分隔符为‘,'
#确定输入和输出
x,y=np.split(data,(4,),axis=1)   #将data按前4列返回给x作为输入,最后1列给y作为标签值
#划分数据集和标签:利用sklearn中的train_test_split对原始数据集进行划分,本实验中训练集和测试集的比例为7:3。
train_data,test_data,train_label,test_label=train_test_split(x,y,random_state=1,train_size=0.7,test_size=0.3)
#创建svm分类器并进行训练:首先,利用sklearn中的SVC()创建分类器对象,其中常用的参数有C(惩罚力度)、kernel(核函数)、gamma(核函数的参数设置)、decision_function_shape(因变量的形式),再利用fit()用训练数据拟合分类器模型。
'''C越大代表惩罚程度越大,越不能容忍有点集交错的问题,但有可能会过拟合(defaul C=1);
kernel常规的有‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’ ,默认的是rbf;
gamma是核函数为‘rbf’, ‘poly’ 和 ‘sigmoid’时的参数设置,其值越小,分类界面越连续,其值越大,分类界面越“散”,分类效果越好,但有可能会过拟合,默认的是特征个数的倒数;
decision_function_shape='ovr'时,为one v rest(一对多),即一个类别与其他类别进行划分,等于'ovo'时,为one v one(一对一),即将类别两两之间进行划分,用二分类的方法模拟多分类的结果。
'''
model=svm.SVC(C=2,kernel='rbf',gamma=10,decision_function_shape='ovo')
model.fit(train_data,train_label.ravel())    #ravel函数在降维时默认是行序优先
#利用classifier.score()分别计算训练集和测试集的准确率。
train_score = model.score(train_data,train_label)
print("训练集:",train_score)
test_score = model.score(test_data,test_label)
print("测试集:",test_score)
#决策函数的查看(可省略)
#print('train_decision_function:\n',model.decision_function(train_data))#(90,3)
#pca降维
#直接使用sklearn中的PCA进行降维
from sklearn.decomposition import PCA
pca = PCA(n_components=2)
pca.fit(x)
xx=pca.transform(x) # 降维后的结果
train_data_2,test_data_2,train_label_2,test_label_2=train_test_split(xx,y,random_state=1,train_size=0.7,test_size=0.3)#降维后的测试集划分

#训练集和测试集的预测结果
trainPredict = (model.predict(train_data).reshape(-1, 1))
testPredict = model.predict(test_data).reshape(-1, 1)
#将预测结果进行展示,首先画出预测点,再画出分类界面
#预测点的画法,可参考https://zhuanlan.zhihu.com/p/81006952
#画图例和点集
xx1_min,xx1_max=xx[:,0].min(),xx[:,0].max()   #x轴范围
xx2_min,xx2_max=xx[:,1].min(),xx[:,1].max()   #y轴范围
matplotlib.rcParams['font.sans-serif']=['SimHei']   #指定默认字体
cm_dark=matplotlib.colors.ListedColormap(['g','r','b'])  #设置点集颜色格式
cm_light=matplotlib.colors.ListedColormap(['#A0FFA0','#FFA0A0','#A0A0FF'])  #设置边界颜色
plt.xlabel('fea1',fontsize=13)        #x轴标注
plt.ylabel('fea2',fontsize=13)        #y轴标注
plt.xlim(xx1_min,xx1_max)                   #x轴范围
plt.ylim(xx2_min,xx2_max)                   #y轴范围
plt.title('SVM result')          #标题
plt.scatter(xx[:,0],xx[:,1],c=y[:,0],s=30,cmap=cm_dark)  #画出测试点
plt.scatter(test_data_2[:,0],test_data_2[:,1],c=testPredict[:,0],s=80,edgecolors='k',marker='+',zorder=2,cmap=cm_dark) #画出测试点,并将预测点圈出(注意这里是测试集的预测标签值) 
plt.show()

到了这里,关于支持向量机SVM代码详解——多分类/降维可视化/参数优化【python】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • SVM(支持向量机)进行分类的原理和python代码----通俗易懂

    SVM(支持向量机,Support Vector Machine)是一种非常流行的机器学习算法,可用于二分类和多分类问题。其基本思想是通过在不同类别的样本之间构建最大化分类间隔的线性或非线性超平面来实现分类。 SVM分类的基本步骤如下: 根据训练集数据,选取最优的超平面(通常为线性

    2024年02月11日
    浏览(44)
  • 【数据分类】基于蜣螂优化算法优化支持向量机的数据分类方法 DBO-SVM分类算法【Matlab代码#47】

    详细介绍此处略,可参考DBO算法介绍 支持向量机(Support Vector Machine,SVM)是一种常用的监督学习算法,用于二分类和多分类问题。它的目标是找到一个超平面或者决策边界,将不同类别的样本点分开,并使得离决策边界最近的样本点的间隔最大化。 SVM的基本思想是将样本点

    2024年02月15日
    浏览(51)
  • 直接写一区! ZOA-PCNN-AT-SVM斑马优化并行卷积-支持向量机融合注意力机制的故障识别程序,特征可视化,实验多!图多!

    适用平台:Matlab2023版本及以上 本原创程序提出的ZOA-PCNN-AT-SVM故障识别模型还没有人写!在此基础上进一步对参考模型进行多重改进,程序注释清晰,干货满满,下面对文章和程序做简要介绍! ①识别模型部分 参考中文EI期刊《电力自动化设备》12月29号网络首发文献:《基于

    2024年01月16日
    浏览(35)
  • 使用SimpleMKL算法实现多核支持向量机(SVM)的Python代码详解

    在本文中,我们将详细介绍如何使用SimpleMKL算法实现多核支持向量机(SVM)的Python代码。我们将首先介绍SimpleMKL算法的基本原理,然后通过实例代码来演示如何在Python中实现该算法。最后,我们将讨论该算法的优缺点以及可能的改进方法。 1. SimpleMKL算法简介 多核学习(Mult

    2024年02月14日
    浏览(101)
  • 一文全解经典机器学习算法之支持向量机SVM(关键词:SVM,对偶、间隔、支持向量、核函数、特征空间、分类)

    之前所介绍的逻辑回归是基于似然度的分类方法,通过对数据概率进行建模来得到软输出。但这种分类方法其实稍加“繁琐”,因为要 估计数据的概率分布作为中间步骤 。这就像当一个人学习英语时,他只要直接报个班或者自己看书就行了,而不需要先学习诘屈聱牙的拉丁

    2024年02月03日
    浏览(36)
  • 第29步 机器学习分类实战:支持向量机(SVM)建模

    支持向量机(SVM)建模。 先复习一下参数(传送门),需要调整的参数有: ① kernel:{‘linear’, ‘poly’, ‘rbf’, ‘sigmoid’, ‘precomputed’},默认为’rbf’。使用的核函数,必须是“linear”,“poly”,“rbf”,“sigmoid”,“precomputed”或者“callable”中的一个。 ② c:浮点

    2024年02月02日
    浏览(41)
  • 支持向量机(SVM)进行文本分类的Python简单示例实现

    支持向量机(Support Vector Machine,SVM)是一种常用的机器学习算法,主要用于分类和回归问题。它的基本思想是将数据映射到高维空间中,使得数据在该空间中线性可分,然后在该空间中寻找最优的超平面,将不同类别的数据分开。 SVM的优点在于可以处理高维数据,具有较好

    2024年01月25日
    浏览(43)
  • 支持向量机svm分类、回归、网格搜索 基于sklearn(python)实现

    由于水平有限 支持向量机(support vector machine)的数学原理和证明就不讲了 想知道可以去看李航的机器学习或者西瓜书 1、读入数据,将数据调成该库能够识别的格式 2、 将数据标准化 ,防止样本中不同特征的数值差别较大,对分类结果产生较大影响 3、利用网格搜索和k折交

    2023年04月11日
    浏览(35)
  • 支持向量机(support vector machine, SVM)的分类(matlab实现)

            支持向量机(support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,最小化结构风险,提高了模型的泛化能力,且

    2024年02月02日
    浏览(27)
  • (转载)支持向量机(support vector machine, SVM)的分类(matlab实现)

            支持向量机(support vector machine,SVM)是一种新的机器学习方法,其基础是Vapnik 创建的统计学习理论(statistical learning theory,STL)。统计学习理论采用结构风险最小化(structural risk minimization,SRM)准则,在最小化样本点误差的同时,最小化结构风险,提高了模型的泛化能力,且

    2024年02月11日
    浏览(30)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包