首页 > 编程语言 >支持向量机算法之鸢尾花特征分类【机器学习】

支持向量机算法之鸢尾花特征分类【机器学习】

时间:2022-10-24 17:38:52浏览次数:52  
标签:svm 特征 分类 算法 向量 鸢尾花 gamma

一.前言

1.1 本文原理

支持向量机(SVM)是一种二元分类模型。它的基本模型是在特征空间中定义最大区间的线性分类器,这使它不同于感知器;支持向量机还包括核技术,这使得它本质上是一个非线性分类器。支持向量机的学习策略是区间最大化,它可以形式化为求解凸二次规划的问题,等价于正则化铰链损失函数的最小化。支持向量机的学习算法是求解凸二次规划的优化算法。Scikit learn(sklearn)是机器学习中常见的第三方模块。它封装了常见的机器学习方法,包括回归、降维、分类、聚类等。

1.2 本文目的

  1. List item使用scikit-learn机器学习包的支持向量机算法,使用全部特征对鸢尾花进行分类;
  2. 使用scikit-learn机器学习包的支持向量机算法,设置SVM对象的参数,包括kernel、gamma和C,分别选择一个特征、两个特征、三个特征,写代码对鸢尾花进行分类;
  3. 使用scikit-learn机器学习包的支持向量机算法,选择特征0和特征2对鸢尾花分类并画图,gamma参数分别设置为1、10、100,运行程序并截图,观察gamma参数对训练分数(score)的影响,请说明如果错误调整gamma参数会产生什么问题?

二.实验过程

2.1 支持向量机算法SVM

实例的特征向量(以2D为例)映射到空间中的一些点,如下图中的实心点和空心点,它们属于两个不同的类别。支持向量机的目的是画一条线来“最好”区分这两类点,这样,如果将来有新的点,这条线也可以很好地进行分类。

在这里插入图片描述

2.2List item使用scikit-learn机器学习包的支持向量机算法,使用全部特征对鸢尾花进行分类;

首先引入向量机算法svm模块:

from sklearn import svm

还是老样子,使用load_iris模块,里面有150组鸢尾花特征数据,我们可以拿来进行学习特征分类。 如下代码:

from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
print(X.shape, X)
y = iris.target
print(y.shape, y)

下面使用sklearn.svm.SVC()函数。 C-支持向量分类器如下:

svm=svm.SVC(kernel='rbf',C=1,gamma='auto')

使用全部特征对鸢尾花进行分类

svm.fit(X[:,:4],y)

输出训练得分:

print("training score:",svm.score(X[:,:4],y))
print("predict: ",svm.predict([[7,5,2,0.5],[7.5,4,7,2]]))

使用全部特征对鸢尾花进行分类训练得分如下: 在这里插入图片描述

2.3 使用scikit-learn机器学习包的支持向量机算法,设置SVM对象的参数,包括kernel、gamma和C,分别选择一个特征、两个特征、三个特征,写代码对鸢尾花进行分类;

2.3.1 使用一个特征对鸢尾花进行分类

上面提过的基础就不再写了。如下代码: 在这里插入图片描述 使用一个特征对鸢尾花进行分类,如下代码:

svm=svm.SVC()
svm.fit(X,y)

输出训练得分:

print("training score:",svm.score(X,y))
print("predict: ",svm.predict([[7,5,2,0.5],[7.5,4,7,2]]))

使用一个特征对鸢尾花进行分类训练得分如下: 在这里插入图片描述

2.3.2 使用两个特征对鸢尾花进行分类

使用两个特征对鸢尾花进行分类,如下代码:

svm=svm.SVC()
svm.fit(X[:,:1],y)

输出训练得分:

print("training score:",svm.score(X[:,:1],y))
print("predict: ",svm.predict([[7],[7.5]]))

使用两个特征对鸢尾花进行分类训练得分如下: 在这里插入图片描述

2.3.3 使用三个特征对鸢尾花进行分类

使用三个特征对鸢尾花进行分类,如下代码:

svm=svm.SVC(kernel='rbf',C=1,gamma='auto')
svm.fit(X[:,1:3],y)

输出训练得分:

print("training score:",svm.score(X[:,1:3],y))
print("predict: ",svm.predict([[7,5],[7.5,4]]))

使用三个特征对鸢尾花进行分类训练得分如下: 在这里插入图片描述

2.3.4 可视化三个特征分类结果

使用plt.subplot()函数用于直接指定划分方式和位置进行绘图。

x_min,x_max=X[:,1].min()-1,X[:,1].max()+1
v_min,v_max=X[:,2].min()-1,X[:,2].max()+1
h=(x_max/x_min)/100
xx,vy =np.meshgrid(np.arange(x_min,x_max,h),np.arange(v_min,v_max,h))
plt.subplot(1,1,1)
Z=svm.predict(np.c_[xx.ravel(),vy.ravel()])
Z=Z.reshape(xx.shape)

绘图,输出可视化。如下代码

plt.contourf(xx,vy,Z,cmap=plt.cm.Paired,alpha=0.8)
plt.scatter(X[:, 1], X[:, 2], c=y, cmap=plt.cm.Paired)
plt.xlabel('Sepal width')
plt.vlabel('Petal length')
plt.xlim(xx.min(), xx.max())
plt.title('SVC with linear kernel')
plt.show()

可视化三个特征分类结果图: 在这里插入图片描述

2.4使用scikit-learn机器学习包的支持向量机算法,选择特征0和特征2对鸢尾花分类并画图,gamma参数分别设置为1、10、100,运行程序并截图,观察gamma参数对训练分数(score)的影响,请说明如果错误调整gamma参数会产生什么问题?

2.4.1当gamma为1时:

讲上文的gamma='auto‘ 里的auto改为1,得如下代码:

svm=svm.SVC(kernel='rbf',C=1,gamma='1')
svm.fit(X[:,1:3],y)

运行上文可视化代码,得如下结果: 在这里插入图片描述 在这里插入图片描述

2.4.2当gamma为10时:

讲上文的gamma='auto‘ 里的auto改为10,得如下代码:

svm=svm.SVC(kernel='rbf',C=1,gamma='10')
svm.fit(X[:,:3:2],y)

运行上文可视化代码,得如下结果: 在这里插入图片描述 在这里插入图片描述

2.4.3当gamma为100时:

讲上文的gamma='auto‘ 里的auto改为100,得如下代码:

svm=svm.SVC(kernel='rbf',C=1,gamma='100')
svm.fit(X[:,:3:2],y)

运行上文可视化代码,得如下结果: 在这里插入图片描述 在这里插入图片描述

2.4.4 结论

参数gamma主要是对低维的样本进行高度度映射,gamma值越大映射的维度越高,训练的结果越好,但是越容易引起过拟合,即泛化能力低。通过上面的图可以看出gamma值越大,分数(score)越高。错误使用gamma值可能会引起过拟合,太低可能训练的结果太差。 在这里插入图片描述

标签:svm,特征,分类,算法,向量,鸢尾花,gamma
From: https://blog.51cto.com/u_15568258/5786219

相关文章

  • 实验一:决策树算法实验
    博客班级https://edu.cnblogs.com/campus/czu/classof2020BigDataClass3-MachineLearning作业要求https://edu.cnblogs.com/campus/czu/classof2020BigDataClass......
  • EM算法
    #1,求观测序列的概率#2,已知状态序列求观测序列#3,已知观测序列求模型参数#设状态值概率#pA=0.6#pB=0.5classEM():def__init__(self):self.t=0.6......
  • DFA算法C#实现
    ///<summary>///过滤词DFA算法实现///</summary>publicclassForbiddentWordLibrary{///<summary>///用分行过滤词文件来初......
  • 常用限流算法总结
    一、限流是什么?限流,也称流量控制。是指系统在面临高并发,或者大流量请求的情况下,限制新的请求对系统的访问,从而保证系统的稳定性。限流会导致部分用户请求处理不及时或者被......
  • 巡路算法
    比较闲,看了网上的思路后写了一个玩玩publicclassMapManager{privateintmapMaxX=0;privateintmapMaxY=0;privateint[,]mapInfo;//终点......
  • 贝叶斯过滤算法
    朴素贝叶斯分类是一种十分简单的分类算法,叫它朴素贝叶斯分类是因为这种方法的思想真的很朴素,朴素贝叶斯的思想基础是这样的:对于给出的待分类项,求解在此项出现的条件下各个类......
  • EMA算法的C#实现
    EMA表示的是指数平滑移动平均,其函数的定义为Y=EMA(X,N)则Y=[2*X+(N-1)*Y']/(N+1),其中Y'表示上一周期Y值。求X的N日指数平滑移动平均,它真正的公式表达是:当日指数平均值=平......
  • python | 算法-最小生成树-prim算法
    写在前面:我自己用python练习算法与数据结构的典型算法汇总在这里:汇总-算法与数据结构-python版,欢迎翻阅!1️⃣参考链接:https://github.com/algorithmzuo/algorithmbasic......
  • 数据挖掘算法—K-Means算法
    一位读者建议多分享一些具体算法相关的内容,这期分享一下数据挖掘相关的算法。简介又叫K-均值算法,是非监督学习中的聚类算法。基本思想k-means算法比较简单。在k-means算法中......
  • 实验一:决策树算法实验
    【实验目的】理解决策树算法原理,掌握决策树算法框架;理解决策树学习算法的特征选择、树的生成和树的剪枝;能根据不同的数据类型,选择不同的决策树算法;针对特定应用场景及......