由于较多公式,所以我将部分内容转为图片进行上传,请见谅。清晰版请访问https://weizhixiaoyi.com查看,你也可以关注我公众号‘谓之小一’,后台直接向我要pdf版本,如有相关问题直接后台询问,随时回答。
1.知识回顾
机器学习之SVM支持向量机(一)中我们介绍了SVM损失函数、最大间隔分类、为什么SVM能形成最大间隔分类器、核函数、SVM中Gaussian Kernel的使用知识点。上文我们从Logistic Regression损失函数中推出SVM损失函数,本篇文章我们将更加直观的分析得到SVM损失函数、如何求解SVM对偶问题、如何解决outliers点,并且最终利用sklearn实现SVM。
2.函数间隔和几何间隔
机器学习之SVM支持向量机(二)公式01.png 机器学习之SVM支持向量机(二)图像01.png 机器学习之SVM支持向量机(二)公式02.png 机器学习之SVM支持向量机(二)图像02.png 机器学习之SVM支持向量机(二)公式03.png3.原始问题到对偶问题的求解
机器学习之SVM支持向量机(二)公式04.png 机器学习之SVM支持向量机(二)公式05.png 机器学习之SVM支持向量机(二)公式06.png 机器学习之SVM支持向量机(二)公式07.png 机器学习之SVM支持向量机(二)公式08.png4.松弛变量处理outliers方法
实际项目中会有数据点含有噪音,即偏离正常位置很远的数据点,我们称之为outlier。
机器学习之SVM支持向量机(二)图像03.png为了处理这种情况,SVM允许在一定程度上偏离一下超平面。为此我们稍加改变以前的约束条件,即
机器学习之SVM支持向量机(二)公式09.png分析方法和前面相同,此处不再赘述。结合机器学习之SVM支持向量机(一)中的描述我们便能更好的理解C的作用和为什么C通常设置的都较大。
5.Sklearn实现SVM支持向量机
我们常用到的核函数包括线性核、多项式核、高斯核、sigmoid核。在机器学习之SVM支持向量机(一)中我们已经利用高斯核详细介绍了核函数的意义,所以不再利用其他核函数举例,有兴趣的同学可以去(一)中看详细内容。此处我们给出线性核和多项式核函数的代码,并使用了少量数据绘制出图形。因SVM选取核函数会涉及到较多内容,介于篇幅有限,不再这篇文章中解释,后续会详细写篇SVM核函数的应用。
5.1线性
from sklearn import svm
import numpy as np
import matplotlib.pyplot as plt
np.random.seed(0)
x=np.r_[np.random.randn(20,2)-[2,2],np.random.randn(20,2)+[2,2]]#正态分布产生数字20行2列
y=[0]*20+[1]*20#20个class0,20个class1
clf=svm.SVC(kernel='linear')#使用线性核
clf.fit(x,y)
w=clf.coef_[0]#获取w
a=-w[0]/w[1]#斜率
#画图
xx=np.linspace(-5,5)
yy=a*xx-(clf.intercept_[0])/w[1]
b=clf.support_vectors_[0]
yy_down=a*xx+(b[1]-a*b[0])
b=clf.support_vectors_[-1]
yy_up=a*xx+(b[1]-a*b[0])
plt.figure(figsize=(8,4))
plt.plot(xx,yy)
plt.plot(xx,yy_down)
plt.plot(xx,yy_up)
plt.scatter(clf.support_vectors_[:,0],clf.support_vectors_[:,1],s=80)
plt.scatter(x[:,0],x[:,1],c=y,cmap=plt.cm.Paired)
plt.axis('tight')
plt.show()
机器学习之SVM支持向量机(二)图像05.png
5.2非线性
import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons
from sklearn.preprocessing import PolynomialFeatures
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
X, y = make_moons( n_samples=100, noise=0.15, random_state=42 )
def plot_dataset(X, y, axes):
plt.plot( X[:,0][y==0], X[:,1][y==0], "bs" )
plt.plot( X[:,0][y==1], X[:,1][y==1], "g^" )
plt.axis( axes )
plt.grid( True, which="both" )
plt.xlabel(r"$x_l$")
plt.ylabel(r"$x_2$")
# contour函数是画出轮廓,需要给出X和Y的网格,以及对应的Z,它会画出Z的边界(相当于边缘检测及可视化)
def plot_predict(clf, axes):
x0s = np.linspace(axes[0], axes[1], 100)
x1s = np.linspace(axes[2], axes[3], 100)
x0, x1 = np.meshgrid( x0s, x1s )
X = np.c_[x0.ravel(), x1.ravel()]
y_pred = clf.predict( X ).reshape( x0.shape )
y_decision = clf.decision_function( X ).reshape( x0.shape )
plt.contour( x0, x1, y_pred, cmap=plt.cm.winter, alpha=0.5 )
plt.contour( x0, x1, y_decision, cmap=plt.cm.winter, alpha=0.2 )
polynomial_svm_clf = Pipeline([ ("poly_featutres", PolynomialFeatures(degree=3)),
("scaler", StandardScaler()),
("svm_clf", LinearSVC(C=10, loss="hinge", random_state=42) )
])#多项式核函数
polynomial_svm_clf.fit( X, y )
plot_dataset( X, y, [-1.5, 2.5, -1, 1.5] )
plot_predict( polynomial_svm_clf, [-1.5, 2.5, -1, 1.5] )
plt.show()
机器学习之SVM支持向量机(二)图像06.png
6.推广
更多内容请关注公众号’谓之小一’,若有疑问可在公众号后台提问,随时回答,欢迎关注,内容转载请注明出处。
机器学习之SVM支持向量机(二)图片推广.png
网友评论