【机器学习】支持向量机原理及例题详解
专栏持续更新中,欢迎订阅~
Linux
数据结构与算法
机器学习
文章目录
- 优化目标
- 引入
- 构建支持向量机
- 直观理解SVM
- 核函数(kernel)
- 简单介绍
- 参数选择
- 例题
- 线性SVM
- 非线性SVM
- 网络搜索寻找最优参数
- 实现垃圾邮件过滤器
- 例题数据和jupyter获取
优化目标
引入
我们先从回顾一下Logistic回归,看看Logistic回归是如何演变为支持向量机的。
当y=1y=1y=1时,如果我们希望hθ(x)≈1h_{\theta}(x)≈1hθ(x)≈1,则θTx\theta^{T}xθTx远大于0.
当y=0y=0y=0时,如果我们希望hθ(x)≈0h_{\theta}(x)≈0hθ(x)≈0,则θTx\theta^{T}xθTx远小于0.
下面是每个样本的代价函数,注意没有求和,代表每个单独的训练样本对Logistic回归的总体目标函数的贡献。
然后我们将hθ(x)h_{\theta}(x)hθ(x)的具体公式带入进去,得到的就是每个训练样本对总体函数的具体贡献:
现在我们再来考虑y=1,y=0y=1,y=0y=1,y=0的情况,函数图像如下:
下面我们y=1y=1y=1为例,用两条直线近似等效曲线,来向支持向量机转换,例如我以z=1z=1z=1为起点,作两条直线近似取代曲线−log11+e−z-log\frac{1}{1+e^{-z}}−log1+e−z1,同理y=0y=0y=0时也一样。
当y=1y=1y=1时,两条直线记为Cost1(z)Cost_1(z)Cost1(z)。
当y=0y=0y=0时,两条直线记为Cost0(z)Cost_0(z)Cost0(z)。
构建支持向量机
这是我们在Logistic回归中使用的正规化代价函数J(θ)J(\theta)J(θ)
然后我们用Cost1(θTx(i))Cost_1(\theta^{T}x^{(i)})Cost1(θTx(i))和Cost0(θTx(i))Cost_0(\theta^{T}x^{(i)})Cost0(θTx(i))将−loghθ(x(i))-logh_{\theta}(x^{(i)})−loghθ(x(i))和−log(1−hθ(x(i)))-log(1-h_{\theta}(x^{(i)}))−log(1−hθ(x(i)))代替,去掉1m\frac{1}{m}m1,然后对于正规项,我们不再用λ\lambdaλ来控制正规项的权重,而选择用不同的常数C来控制第一项的权重,最后我们得到支持向量机的总体优化目标如下:
与Logistic回归不同的是,sigmoid函数输出的不是概率,而是直接输出0或者1。
直观理解SVM
这是SVM的代价函数和图像:
下面我们来想一下如何让代价函数最小化。
若y=1y=1y=1,则当θTx≥1\theta^{T}x≥1θTx≥1时,Cost1(z)=0Cost_1(z)=0Cost1(z)=0.
若y=0y=0y=0,则当θTx≤−1\theta^{T}x≤-1θTx≤−1时,Cost2(z)=0Cost_2(z)=0Cost2(z)=0.
下面我们想象一下,如果将常数C设得比较大,例如C=100000,那么当进行最小化时,我们将迫切希望找到一个合适的值,使第一项等于0,那么现在我们试着在这种情况下来理解优化问题。
要使第一项为0,则有以下两种情况:
若y=1y=1y=1,则θTx≥1\theta^{T}x≥1θTx≥1,即y=1y=1y=1的样本点在超平面H1:θTx≥1H_1:\theta^{T}x≥1H1:θTx≥1上。
若y=0y=0y=0,则θTx≤−1\theta^{T}x≤-1θTx≤−1,即y=0y=0y=0的样本点在超平面H2:θTx≤−1H_2:\theta^{T}x≤-1H2:θTx≤−1上。
如下图所示,在H1、H2H_1、H_2H1、H2上的点就是支持向量:
这里两个超平面H1、H2H_1、H_2H1、H2平行,它们中间没有样本点。H1、H2H_1、H_2H1、H2之间的距离成为间隔(margin)。
间隔依赖于分离超平面的法向量θ\thetaθ,等于2∣∣θ∣∣\frac{2}{||\theta||}∣∣θ∣∣2。H1、H2H_1、H_2H1、H2是间隔边界。
核函数(kernel)
简单介绍
如下图,我们需要得到一个非线性的决策边界:
按我们之前学的方法,可以通过增加项数来进行拟合,如下:
现在我们用一些新的符号f1,f2,f3...f_1,f_2,f_3...f1,f2,f3...来表示新的特征值:
θ0+θ1f1+θ2f2+θ3f3+θ4f4+θ5f5+...≥0\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3+\theta_4f_4+\theta_5f_5+...≥0θ0+θ1f1+θ2f2+θ3f3+θ4f4+θ5f5+...≥0
f1=x1,f2=x2,f3=x1x2,f4=x12...f_1=x_1,f_2=x_2,f_3=x_1x_2,f_4=x_1^2...f1=x1,f2=x2,f3=x1x2,f4=x12...
现在我们用f1,f2,f3f_1,f_2,f_3f1,f2,f3来举例:
如图,我们在图上选择三个标记l(1),l(2),l(3)l^{(1)},l^{(2)},l^{(3)}l(1),l(2),l(3)
然后来定义新的特征:
给定一个实例x,然后将f1f_1f1定义为度量实例xxx与标记点l(1)l^{(1)}l(1)的相似度
f1=similarity(x,l(1))=exp(−∣∣x−l(1)∣∣22σ2)f_1=similarity(x,l^{(1)})=exp(-\frac{{||x-l^{(1)}||}^2}{2\sigma^2})f1=similarity(x,l(1))=exp(−2σ2∣∣x−l(1)∣∣2)
类似地,
f2=similarity(x,l(2))=exp(−∣∣x−l(2)∣∣22σ2)f_2=similarity(x,l^{(2)})=exp(-\frac{{||x-l^{(2)}||}^2}{2\sigma^2})f2=similarity(x,l(2))=exp(−2σ2∣∣x−l(2)∣∣2)
f3=similarity(x,l(3))=exp(−∣∣x−l(3)∣∣22σ2)f_3=similarity(x,l^{(3)})=exp(-\frac{{||x-l^{(3)}||}^2}{2\sigma^2})f3=similarity(x,l(3))=exp(−2σ2∣∣x−l(3)∣∣2)
这种函数我们称为高斯核函数,后面我们还会学到其他的核函数。
下面来看看这些核函数的表达式有什么含义。
假设现在有一点非常接近与标记点l(1)l^{(1)}l(1),那么欧氏距离∣∣x−l(1)∣∣2{||x-l^{(1)}||}^2∣∣x−l(1)∣∣2就会接近于0,此时f1≈exp(0)=1f_1≈exp(0)=1f1≈exp(0)=1。
相反,如果这点离l(1)l^{(1)}l(1)很远,欧式距离∣∣x−l(1)∣∣2{||x-l^{(1)}||}^2∣∣x−l(1)∣∣2会变得很大,此时f1≈0f_1≈0f1≈0。
讲完了特征值的定义,接下来我们看看核函数是如何应用于决策边界的。
给定一个训练样本,当θ0+θ1f1+θ2f2+θ3f3≥0\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3≥0θ0+θ1f1+θ2f2+θ3f3≥0时,预测y=1y=1y=1。
假设我们已经得到了参数θ\thetaθ的值:
θ0=−0.5,θ1=1,θ2=1,θ3=0\theta_0=-0.5,\theta_1=1,\theta_2=1,\theta_3=0θ0=−0.5,θ1=1,θ2=1,θ3=0
现在我们有一个实例xxx(蓝点),落在如图所示位置,显然,该实例与标记点l(1)l^{(1)}l(1)间距离很近,故f1=1f_1=1f1=1,与标记点l(2),l(3)l^{(2)},l^{(3)}l(2),l(3)相距较远,故f2,f3=0f_2,f_3=0f2,f3=0,然后我们代入θ0+θ1f1+θ2f2+θ3f3\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3θ0+θ1f1+θ2f2+θ3f3得θ0+θ1=0.5>0\theta_0+\theta_1=0.5>0θ0+θ1=0.5>0,所以预测y=1y=1y=1。
若一个实例如绿点所示,与l(1),l(2),l(3)l^{(1)},l^{(2)},l^{(3)}l(1),l(2),l(3)的距离都很远,此时f1,f2,f3=0f_1,f_2,f_3=0f1,f2,f3=0
代入θ0+θ1f1+θ2f2+θ3f3\theta_0+\theta_1f_1+\theta_2f_2+\theta_3f_3θ0+θ1f1+θ2f2+θ3f3得θ0=−0.5<0\theta_0=-0.5<0θ0=−0.5<0,所以预测y=0y= 0y=0。
如此,便会得到一个可以区分正负样本的非线性的决策边界。
那么现在大家可能会想如何去得到我们的标记点l(1),l(2),l(3)l^{(1)},l^{(2)},l^{(3)}l(1),l(2),l(3),并且在一些复杂的分类问题中,也许我们需要更多的标记点。
一般情况下,我们会直接选择训练样本作为标记点。
如下给定mmm个训练样本,然后选定与mmm个训练样本完全一样的位置作为标记点。
转化为向量:
f=[f0f1f2f3...]∈Rm+1f=\left[ \begin{matrix} f_0 \\ f_1 \\ f_2 \\ f_3\\... \end{matrix} \right]∈R^{m+1}f=⎣⎢⎢⎢⎢⎡f0f1f2f3...⎦⎥⎥⎥⎥⎤∈Rm+1
则当θTf≥0\theta^Tf≥0θTf≥0时,预测y=1y= 1y=1.
最小化函数
参数选择
首先我们看看参数CCC,前面我们知道CCC和1λ\frac{1}{\lambda}λ1作用一样,如果选择了较大的CCC,则意味着选择了较大的λ\lambdaλ,则是一个高偏差,低方差的模型(欠拟合)。
如果选择了较小的CCC,则意味着选择了较小的λ\lambdaλ,则是一个高方差,低偏差的模型(过拟合)。
还有一个参数σ2\sigma^2σ2,如果σ2\sigma^2σ2比较大,则高斯核函数exp(−∣∣x−l(i)∣∣22σ2)exp(-\frac{{||x-l^{(i)}||}^2}{2\sigma^2})exp(−2σ2∣∣x−l(i)∣∣2)相对平滑,模型高偏差低方差。反之则相对陡峭,模型低偏差高方差。
例题
在本次代码练习中,我们先从基础的线性分类出发,再到非线性分类来熟悉SVM的工作原理,最后再构建区分垃圾邮件的分类器。
import numpy as np
import pandas as pd
import seaborn as sb
import matplotlib.pyplot as plt
import scipy.io as sio
线性SVM
df = sio.loadmat('E:\\happy\\ML&DL\\My_exercise\\ex5-SVM\\data\\ex6data1.mat')
data = pd.DataFrame(df['X'], columns=['X1', 'X2'])
data['y'] = df['y']
data.head()
fig = plt.subplots(figsize=(8,6))
plt.scatter(data['X1'], data['X2'], s=50, c=data['y'], cmap='Spectral')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
from sklearn import svm
C=1
#C=1
svc_1 = svm.LinearSVC(C=1, loss='hinge', max_iter=10000)
svc_1.fit(data[['X1', 'X2']], data['y'])
svc_1.score(data[['X1', 'X2']], data['y'])
0.9803921568627451
#C=1时,画图看看每个类别预测的置信度
data['SVM1 Confidence'] = svc_1.decision_function(data[['X1', 'X2']])
data.head()
fig = plt.subplots(figsize=(8,6))
plt.scatter(data['X1'], data['X2'], s=50, c=data['SVM1 Confidence'], cmap='RdBu')
plt.title('SVM (C=1) Decision Confidence')
plt.show()
C=100
#C=100时,画图看看每个类别预测的置信度
data['SVM100 Confidence'] = svc_100.decision_function(data[['X1', 'X2']])
fig = plt.subplots(figsize=(8,6))
plt.scatter(data['X1'], data['X2'], s=50, c=data['SVM100 Confidence'], cmap='RdBu')
plt.title('SVM (C=100) Decision Confidence')
plt.show()
非线性SVM
#高斯核函数
def gaussian_kernel(x1, x2, sigma):return np.exp(-np.power(x1 - x2, 2).sum() / (2 * (sigma ** 2)))
#测试一下
x1 = np.array([1, 2, 3])
x2 = np.array([2, 0, 1])
sigma = 2
gaussian_kernel(x1, x2, sigma)
0.32465246735834974
df = sio.loadmat('E:\\happy\\ML&DL\\My_exercise\\ex5-SVM\\data\\ex6data2.mat')
data = pd.DataFrame(df['X'], columns=['X1', 'X2'])
data['y'] = df['y']
data
fig = plt.subplots(figsize=(8,6))
plt.scatter(data['X1'], data['X2'], s=30, c=data['y'], cmap='Spectral')
plt.xlabel('X1')
plt.ylabel('X2')
plt.show()
#用内置的高斯核函数求解
svc = svm.SVC(C=100, gamma=10, probability=True)
svc.fit(data[['X1', 'X2']], data['y'])
svc.score(data[['X1', 'X2']], data['y'])
0.9698725376593279
#选一类按照概率画出来
prob = svc.predict_proba(data[['X1', 'X2']])[:, 0]
fig = plt.subplots(figsize=(8,6))
plt.scatter(data['X1'], data['X2'], s=30, c=prob, cmap='Reds')
网络搜索寻找最优参数
#读取训练集和验证集
df = sio.loadmat('E:\\happy\\ML&DL\\My_exercise\\ex5-SVM\\data\\ex6data3.mat')
df.keys()
gamma = 12σ2\frac{1}{2\sigma^2}2σ21
X = df['X']
Xval = df['Xval']
y = df['y']
yval = df['yval']candidate = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]
gamma_values = [0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30, 100]best_score = 0
best_params = {'C': None, 'gamma': None}for C in candidate:for gamma in gamma_values:svc = svm.SVC(C=C, gamma=gamma)svc.fit(X, y)score = svc.score(Xval, yval)if score > best_score:best_score = scorebest_params['C'] = Cbest_params['gamma'] = gammabest_score, best_params
(0.965, {'C': 0.3, 'gamma': 100})
实现垃圾邮件过滤器
train = sio.loadmat('E:\\happy\\ML&DL\\My_exercise\\ex5-SVM\\data\\spamTrain.mat')
test = sio.loadmat('E:\\happy\\ML&DL\\My_exercise\\ex5-SVM\\data\\spamTest.mat')
train.keys(),test.keys()
#X是一个二进制向量,1表示邮件中存在该单词,0表示不存在
X = train['X']
y = train['y'].ravel()
Xtest = test['Xtest']
ytest = test['ytest'].ravel()
svc = svm.SVC()
svc.fit(X, y)
svc.score(Xtest, ytest)
0.987
例题数据和jupyter获取
关注公众号“大拨鼠Code”,回复“机器学习”可领取上面例题的源文件,jupyter版本的,例题和数据也一起打包了,之前的练习也在里面,感谢支持。
参考资料:
[1] https://www.bilibili.com/video/BV164411b7dx
[2] https://github.com/fengdu78/Coursera-ML-AndrewNg-Notes
【机器学习】支持向量机原理及例题详解相关推荐
- python神经网络算法pdf_Python与机器学习实战 决策树、集成学习、支持向量机与神经网络算法详解及编程实现.pdf...
作 者 :何宇健 出版发行 : 北京:电子工业出版社 , 2017.06 ISBN号 :978-7-121-31720-0 页 数 : 315 原书定价 : 69.00 主题词 : 软件工具-程序设计 ...
- 图解机器学习算法(6) | 决策树模型详解(机器学习通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...
- 图解机器学习算法(13) | 聚类算法详解(机器学习通关指南·完结)
作者:韩信子@ShowMeAI 教程地址:https://www.showmeai.tech/tutorials/34 本文地址:https://www.showmeai.tech/article-d ...
- 人脸识别SeetaFace2原理与代码详解
人脸识别SeetaFace2原理与代码详解 前言 一.人脸识别步骤 二.SeetaFace2基本介绍 三.seetaFace2人脸注册.识别代码详解 3.1 人脸注册 3.1.1 人脸检测 3.1.2 ...
- python的编程模式-Python设计模式之状态模式原理与用法详解
本文实例讲述了Python设计模式之状态模式原理与用法.分享给大家供大家参考,具体如下: 状态模式(State Pattern):当一个对象的内在状态改变时允许改变其行为,这个对象看起来像是改变了其类 ...
- DeepLearning tutorial(1)Softmax回归原理简介+代码详解
FROM: http://blog.csdn.net/u012162613/article/details/43157801 DeepLearning tutorial(1)Softmax回归原理简介 ...
- DeepLearning tutorial(3)MLP多层感知机原理简介+代码详解
FROM:http://blog.csdn.net/u012162613/article/details/43221829 @author:wepon @blog:http://blog.csdn.n ...
- DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解
FROM: http://blog.csdn.net/u012162613/article/details/43225445 DeepLearning tutorial(4)CNN卷积神经网络原理简介 ...
- 算术编码例题详解_百分数与百分点区别详解
通过以往的答疑经验,许多同学对于出现百分点的材料和题目不能够很好的百分点与已知百分数之间的关系.那么百分数与百分点的核心区别在哪里?常见题型中出现的百分数与百分点应该如何进行理解应用? 百分数与百分点 ...
- Nginx(二):反向代理原理 与 配置文件详解
相关阅读: Nginx(一):Nginx原理概述 与 安装步骤详解 Nginx(二):反向代理原理 与 配置文件详解 Nginx(三):负载均衡策略 与 Nginx静态服务器 Nginx(四):Ngi ...
最新文章
- echarts词云图形状_怎么用Python画出好看的词云图?
- liunx 上get 不到url参数 java_URL传递中文参数,大坑一枚,Windows与Linux效果竟然不一致...
- curl请求模拟post发送json
- s:action,s:param的用法
- django-allauth定制模板(转载)
- linux主机解析虚拟机超时_Linux 内核超时导致虚拟机无法正常启动
- 用limit 实现java的简单分页
- Python下使用optparse模块实现对多个文件进行统计【二】
- php+js 表单过期
- linux锁定账号 让其不能修改密码,passwd - 用于让用户可以更改自己的密码
- 第四次作业:猫狗大战挑战赛
- “ 鸡尾酒会问题”(cocktail party problem)
- mysqldump+系统计划任务定时备份MySql数据
- Smarty下载和安装
- HikariCP配置手册
- 在RK3066/RK3188电视棒上安装ubuntu(MK802III/MK808B/MK809/MK908/UG802/QC802
- VCPKG 特性 - Overlay triplets
- 最详细的 Hadoop 入门教程
- 年轻人宣言:青春符号
- 正则表达式元字符查询