机器学习
四、SVM支持向量机
- github地址:https://github.com/lawlite19/MachineLearning_Python
- 由于公式使用的是LaTex,解析使用的google的Chart API,所以显示有问题,可以移步github(可以翻墙就不用了)
1、代价函数
- 在逻辑回归中,我们的代价为:
,
其中:, - 如图所示,如果
y=1
,cost
代价函数如图所示
我们想让,即z>>0
,这样的话cost
代价函数才会趋于最小(这是我们想要的),所以用途中红色的函数代替逻辑回归中的cost - 当
y=0
时同样,用代替
- 最终得到的代价函数为:
最后我们想要 - 之前我们逻辑回归中的代价函数为:
可以认为这里的,只是表达形式问题,这里C
的值越大,SVM的决策边界的margin
也越大,下面会说明
2、Large Margin
- 如下图所示,SVM分类会使用最大的
margin
将其分开
先说一下向量内积
- ,
- 表示
u
的欧几里得范数(欧式范数), 向量V
在向量u
上的投影的长度记为p
,则:向量内积:
根据向量夹角公式推导一下即可,
前面说过,当
C
越大时,margin
也就越大,我们的目的是最小化代价函数J(θ)
,当margin
最大时,C
的乘积项要很小,所以近似为:
,
我们最后的目的就是求使代价最小的θ
- 由
可以得到:
,p
即为x
在θ
上的投影 - 如下图所示,假设决策边界如图,找其中的一个点,到
θ
上的投影为p
,则或者,若是p
很小,则需要很大,这与我们要求的θ
使最小相违背,所以最后求的是large margin
3、SVM Kernel(核函数)
- 对于线性可分的问题,使用线性核函数即可
- 对于线性不可分的问题,在逻辑回归中,我们是将
feature
映射为使用多项式的形式,SVM
中也有多项式核函数,但是更常用的是高斯核函数,也称为RBF核 - 高斯核函数为:
假设如图几个点,
令:
.
.
. - 可以看出,若是
x
与距离较近,==》,(即相似度较大)
若是x
与距离较远,==》,(即相似度较低) 高斯核函数的
σ
越小,f
下降的越快
如何选择初始的
- 训练集:
- 选择:
- 对于给出的
x
,计算f
,令:所以: - 最小化
J
求出θ
,
- 如果,==》预测
y=1
4、使用scikit-learn
中的SVM
模型代码
- 全部代码
- 线性可分的,指定核函数为
linear
:
'''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) # 指定核函数为线性核函数
- 非线性可分的,默认核函数为
rbf
'''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为核函数的系数,值越大拟合的越好
5、运行结果
- 线性可分的决策边界:
- 线性不可分的决策边界: