-
SVM简介
通俗的解释:
给定两组不同类别的数据点,找一个超平面把他们分割开,并希望这个超平面离这两组数据点的距离尽可能大。这样,我们就认为超平面一侧是一个类别。另一侧则是另一个类别。当新来一个数据点时,只需看它在这个分割平面的那一侧,就可以预测其类别。
任务类型:
通常用来处理有监督的分类问题,即需要一定的类别标注的训练集来确定超平面,然后对没有标注的样本进行类别预测。SVM既可以处理两类别分类问题,也可以通过对类别进行划分,处理多类别分类问题。 -
支持向量机算法的基本流程
-
代码实现
from sklearn.datasets import make_moons
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np
X,y=make_moons(n_samples=100,noise=0.3,random_state=2021)
fig1=plt.figure()
plt.plot(X[:,0][y==0],X[:,0][y==0],"bo")
plt.plot(X[:,0][y==1],X[:,1][y==1],"g^")
plt.show()
def predict_each_value(X,y,cls):
X1_min,X2_min=np.min(X,axis=0)-1
X1_max,X2_max=np.max(X,axis=0)+1
X1,X2=np.meshgrid(np.arange(X1_min,X1_max,0.01),np.arange(X2_min,X2_max,0.01))
CLS=cls.predict(np.transpose(np.array([X1.ravel(),X2.ravel()]))).reshape(X1.shape)
plt.figure()
plt.contourf(X1,X2,CLS)
plt.xlim(X1_min,X1_max)
plt.ylim(X2_min,X2_max)
plt.plot(X[:, 0][y == 0], X[:, 0][y == 0], "bo")
plt.plot(X[:, 0][y == 1], X[:, 1][y == 1], "g^")
plt.show()
#高斯核函数
clf=svm.SVC(kernel='rbf',random_state=2021,gamma=0.1,C=100.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
clf=svm.SVC(kernel='rbf',random_state=2021,gamma=0.1,C=10.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
clf=svm.SVC(kernel='rbf',random_state=2021,gamma=0.1,C=1.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
#线性核函数
clf=svm.SVC(kernel='linear',random_state=2021,gamma=0.1,C=10.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
#多项式核函数
clf=svm.SVC(kernel='poly',random_state=2021,gamma=0.1,C=10.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
#输出支持的向量个数
print(clf.n_support_)
实验结果
机器学习-----支持向量机模型
1.导入所需的包,生成本次实验的数据以及数据分布图
from sklearn.datasets import make_moons
from sklearn import svm
import matplotlib.pyplot as plt
import numpy as np
X,y=make_moons(n_samples=100,noise=0.3,random_state=2021)
fig1=plt.figure()
plt.plot(X[:,0][y0],X[:,0][y0],“bo”)
plt.plot(X[:,0][y1],X[:,1][y1],“g^”)
plt.show()
2.定义函数,该函数可以在SVM训练好之后对数据集范围的点进行预测并作图,从而显示出SVM的分界线
def predict_each_value(X,y,cls):
X1_min,X2_min=np.min(X,axis=0)-1
X1_max,X2_max=np.max(X,axis=0)+1
X1,X2=np.meshgrid(np.arange(X1_min,X1_max,0.01),np.arange(X2_min,X2_max,0.01))
CLS=cls.predict(np.transpose(np.array([X1.ravel(),X2.ravel()]))).reshape(X1.shape)
plt.figure()
plt.contourf(X1,X2,CLS)
plt.xlim(X1_min,X1_max)
plt.ylim(X2_min,X2_max)
plt.plot(X[:, 0][y == 0], X[:, 0][y == 0], “bo”)
plt.plot(X[:, 0][y == 1], X[:, 1][y == 1], “g^”)
plt.show()
3.分别使用高斯核函数和线性核函数和多项式核函数进行试验
#高斯核函数
clf=svm.SVC(kernel=‘rbf’,random_state=2021,gamma=0.1,C=100.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
clf=svm.SVC(kernel=‘rbf’,random_state=2021,gamma=0.1,C=10.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
clf=svm.SVC(kernel=‘rbf’,random_state=2021,gamma=0.1,C=1.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
#线性核函数
clf=svm.SVC(kernel=‘linear’,random_state=2021,gamma=0.1,C=10.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
print(clf.n_support_)
#多项式核函数
clf=svm.SVC(kernel=‘poly’,random_state=2021,gamma=0.1,C=10.0)
clf.fit(X,y)
predict_each_value(X,y,clf)
#输出支持的向量个数
print(clf.n_support_)
5.实验结果
1.初始数据的数据分布
2.高斯核函数C=100(C为惩罚项系数,越大表示对越界惩罚力度越大。)
高斯核函数C=10
高斯核函数C=1
线性核函数C=10
多项式核函数C=10
总结:从实验结果可以得出,惩罚项的系数越大,表示越偏向于硬间隔,因此在训练集上错分率极低,但分界面较为复杂。反之惩罚项的系数越小,则模型更简单,但是有一定集的错分率。从线性核函数和多项式函数的图可以看出,线性核函数是超平面分割,多项式核函数是曲面分割。