我们在学习过程中最容易犯的一个错误就是:看的多动手的少。今天七月在线就和你一起用python实现SVM支持向量机算法~
代价函数
在逻辑回归中,我们的代价为:
,
其中:,
如图所示,如果y=1,cost代价函数如图所示
我们想让,即z>>0,这样的话cost代价函数才会趋于最小(这是我们想要的),所以用途中红色的函数代替逻辑回归中的cost
当y=0时同样,用代替
最终得到的代价函数为:
最后我们想要
之前我们逻辑回归中的代价函数为:
可以认为这里的,只是表达形式问题,这里C的值越大,SVM的决策边界的margin也越大,下面会说明
Large Margin
如下图所示,SVM分类会使用最大的margin将其分开
先说一下向量内积
,
表示u的欧几里得范数(欧式范数),
向量V在向量u上的投影的长度记为p,则:向量内积:
根据向量夹角公式推导一下即可,
前面说过,当C越大时,margin也就越大,我们的目的是最小化代价函数J(θ),当margin最大时,C的乘积项
要很小,所以近似为:
我们最后的目的就是求使代价最小的θ
由
可以得到:
,
p即为x在θ上的投影
如下图所示,假设决策边界如图,找其中的一个点,到θ上的投影为p,则或者,若是p很小,则需要很大,这与我们要求的θ使最小相违背,所以最后求的是large margin
SVM Kernel(核函数)
对于线性可分的问题,使用线性核函数即可。
对于线性不可分的问题,在逻辑回归中,我们是将feature映射为使用多项式的形式,SVM中也有多项式核函数,但是更常用的是高斯核函数,也称为RBF核
高斯核函数为:
假设如图几个点,
令,
可以看出,若是x与距离较近,==》,(即相似度较大),若是x与距离较远,==》,(即相似度较低)
高斯核函数的σ越小,f下降的越快
如何选择初始的
训练集:
选择:
对于给出的x,计算f,令:,
所以:
最小化J求出θ,
如果,==》预测y=1
使用scikit-learn中的SVM模型代码
全部代码
https://github.com/lawlite19/MachineLearning_Python/blob/master/SVM/SVM_scikit-learn.py
线性可分的,指定核函数为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为核函数的系数,值越大拟合的越好
运行结果
线性可分的决策边界:
线性不可分的决策边界:
(未完待续)
作者:lawlite19
https://github.com/lawlite19/MachineLearning_Python#
相关文章:
用Python实现机器学习算法:逻辑回归
用Python实现机器学习算法:BP神经网络
点击下方“阅读全文”,即刻学Python