动手写机器学习算法:SVM支持向量机(附代码)

来源:互联网 发布:农村淘宝网 编辑:程序博客网 时间:2024/06/05 18:59

我们在学习过程中最容易犯的一个错误就是:看的多动手的少。今天七月在线就和你一起用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实现机器学习算法:逻辑回归
用Python实现机器学习算法:BP神经网络




点击下方“阅读全文”,即刻学Python

阅读全文
0 1
原创粉丝点击