支持向量机(Support Vector Machine, SVM)是一类按监督学习(supervised learning)方式对数据进行二元分类的广义线性分类器(generalized linear classifier),其决策边界是对学习样本求解的最大边距超平面(maximum-margin hyperplane)
SVM使用铰链损失函数(hinge loss)计算经验风险(empirical risk)并在求解系统中加入了正则化项以优化结构风险(structural risk),是一个具有稀疏性和稳健性的分类器。SVM可以通过核方法(kernel method)进行非线性分类,是常见的核学习(kernel learning)方法之一。
SVM被提出于1964年,在二十世纪90年代后得到快速发展并衍生出一系列改进和扩展算法,在人像识别、文本分类等模式识别(pattern recognition)问题中有得到应用。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
|
import numpy as np from scipy import io as spio from matplotlib import pyplot as plt from sklearn import svm def SVM(): '''data1——线性分类''' data1 = spio.loadmat( 'data1.mat' ) X = data1[ 'X' ] y = data1[ 'y' ] y = np.ravel(y) plot_data(X, y) model = svm.SVC(C = 1.0 , kernel = 'linear' ).fit(X, y) # 指定核函数为线性核函数 plot_decisionBoundary(X, y, model) # 画决策边界 '''data2——非线性分类''' data2 = spio.loadmat( 'data2.mat' ) X = data2[ 'X' ] y = data2[ 'y' ] y = np.ravel(y) plt = plot_data(X, y) plt.show() model = svm.SVC(gamma = 100 ).fit(X, y) # gamma为核函数的系数,值越大拟合的越好 plot_decisionBoundary(X, y, model, class_ = 'notLinear' ) # 画决策边界 # 作图 def plot_data(X, y): plt.figure(figsize = ( 10 , 8 )) pos = np.where(y = = 1 ) # 找到y=1的位置 neg = np.where(y = = 0 ) # 找到y=0的位置 p1, = plt.plot(np.ravel(X[pos, 0 ]), np.ravel(X[pos, 1 ]), 'ro' , markersize = 8 ) p2, = plt.plot(np.ravel(X[neg, 0 ]), np.ravel(X[neg, 1 ]), 'g^' , markersize = 8 ) plt.xlabel( "X1" ) plt.ylabel( "X2" ) plt.legend([p1, p2], [ "y==1" , "y==0" ]) return plt # 画决策边界 def plot_decisionBoundary(X, y, model, class_ = 'linear' ): plt = plot_data(X, y) # 线性边界 if class_ = = 'linear' : w = model.coef_ b = model.intercept_ xp = np.linspace(np. min (X[:, 0 ]), np. max (X[:, 0 ]), 100 ) yp = - (w[ 0 , 0 ] * xp + b) / w[ 0 , 1 ] plt.plot(xp, yp, 'b-' , linewidth = 2.0 ) plt.show() else : # 非线性边界 x_1 = np.transpose(np.linspace(np. min (X[:, 0 ]), np. max (X[:, 0 ]), 100 ).reshape( 1 , - 1 )) x_2 = np.transpose(np.linspace(np. min (X[:, 1 ]), np. max (X[:, 1 ]), 100 ).reshape( 1 , - 1 )) X1, X2 = np.meshgrid(x_1, x_2) vals = np.zeros(X1.shape) for i in range (X1.shape[ 1 ]): this_X = np.hstack((X1[:, i].reshape( - 1 , 1 ), X2[:, i].reshape( - 1 , 1 ))) vals[:, i] = model.predict(this_X) plt.contour(X1, X2, vals, [ 0 , 1 ], color = 'blue' ) plt.show() if __name__ = = "__main__" : SVM() |
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。
原文链接:https://blog.csdn.net/s0302017/article/details/103947043