吴恩达|机器学习作业6.0支持向量机(SVM)
6.0.支持向量机
1)题目:
在本练习中,您将使用支持向量机来建立一个垃圾邮件分类器。
在本练习的前半部分,您将使用支持向量机(SVM)处理各种两维的样本数据集。使用这些数据集进行实验将帮助您直观地了解支持向量机如何工作,以及如何使用带高斯核函数的SVM。在后半部分的练习中,您将使用支持向量机来构建垃圾邮件分类器。本次作业只包含前半部分。
数据集链接: https://pan.baidu.com/s/1cEgQIvehUcLxZ0WVhxcPuQ 提取码: xejn
2)知识点概括:
有人也称SVM为大间距分类器(large margin classifier)
带正则化的优化目标:minθC∑i=1m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+12∑j=1nθj2\min_\theta C\sum_{i=1}^m[y^{(i)}cost_1(\theta^Tx^{(i)})+(1-y^{(i)})cost_0(\theta^Tx^{(i)})] +{1 \over 2}\sum_{j=1}^n\theta_j^2minθC∑i=1m[y(i)cost1(θTx(i))+(1−y(i))cost0(θTx(i))]+21∑j=1nθj2
假设函数:hθ(x)=1ifθTx≥0else0h_\theta(x)=1 \ if \ \theta^Tx \ge0\ else \ 0hθ(x)=1 if θTx≥0 else 0
核函数用来定义新的特征变量。将训练数据作为标记点,利用核函数计算每个训练数据与其他训练数据之间的相似度得到新的特征向量。这样,优化目标和假设函数变为:
minθC∑i=1m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+12∑j=1mθj2\min_\theta C\sum_{i=1}^m[y^{(i)}cost_1(\theta^Tf^{(i)})+(1-y^{(i)})cost_0(\theta^Tf^{(i)})] +{1 \over 2}\sum_{j=1}^m\theta_j^2minθC∑i=1m[y(i)cost1(θTf(i))+(1−y(i))cost0(θTf(i))]+21∑j=1mθj2
y=1ifθTf≥0y=1 \ if \ \theta^Tf \ge0y=1 if θTf≥0
核函数需要满足默塞尔定理(Mercer’s theorem)保证SVM优化运行正常,不会发散。
偏差与方差问题:
当C较大时:可能产生低偏差、高方差问题,过拟合
当C较小时:可能产生高偏差、低方差问题,欠拟合
对于高斯核函数中的方差sigma:
较大时:特征变化较缓,可能会产生高偏差、低方差问题,欠拟合
较小时:特征变化较快,可能产生低偏差、高方差问题,过拟合
待定的:
参数C的选择
核函数的选择
模型选择:
当特征数量多、训练集数量较少时,一般选用逻辑回归或者不带核函数的SVM(线性核函数)
当特征数量少、训练集数量适中时,一般选用带高斯核函数的SVM
当特征数量少、训练集数量很大时,一般选用逻辑回归或者不带核函数的SVM(如果用高斯核函数可能过慢)
对于大部分情况神经网络表现都很好,但是训练慢。
且SVM是凸优化问题,因此总会找到一个全局最小值,不用担心局部极小的情况。
逻辑回归与SVM比较:逻辑回归对异常值敏感,SVM对异常值不敏感(抗噪能力强)——支持向量机改变非支持向量样本并不会引起决策面的变化;但是逻辑回归中改变任何样本都会引起决策面的变化
3)大致步骤:
样本集1,首先可视化数据集,然后使用不同的C再用线性核函数的SVM训练模型并画出决策边界。
样本集2,可视化数据集,定义高斯函数,再使用高斯核SVM训练(这里我还没搞清楚自定义核函数的要求,所以直接用内置的高斯核训练模型,但是感觉不用了解,吴恩达说的一般也不会用很奇怪的核函数)
样本集3,可视化训练集和验证集,和样本集2一样采用高斯核函数,但是这里尝试不同的C和sigma,选择在验证集上错误率最低的模型,最后画出决策边界
4)关于Python:
- Scikit-learn(sklearn)是机器学习中常用的第三方模块,对常用的机器学习方法进行了封装,包括回归(Regression)、降维(Dimensionality Reduction)、分类(Classfication)、聚类(Clustering)等方法。里面包含了SVM的程序,直接调用调节参数即可。
- svm.SVC( ) 可以选择C值,以及核函数,调用之后先fit,再predict,注意predict时输入为一个二维数组,因此在画等高线的时候需要先把网格展开成二维数组进行predict再重新组成网格画图。在选择核函数时可以自己定义,例如:svm.SVC(kernel=my_kernel),内置核函数默认为rbf高斯核,形式为exp(−γ∥x−x′∥2)exp(-\gamma \|x-x'\|^2)exp(−γ∥x−x′∥2),其中包含一个gamma关键词,gamma默认为1/n_features。
- 具体可参考sklearn中文文档:http://sklearn.apachecn.org/#/docs/5
- 在计算错误率时,可能会涉及两幅图像像素值之间的加减运算,这里需要注意的是图像像素值是ubyte类型,ubyte类型数据范围为0~255,若做运算出现负值或超出255,则会抛出异常,因此需要将预测的y值和yval强制转为int再进行相减。
5)代码与结果:
import numpy as np
import matplotlib.pyplot as plt
import scipy.io as scio
from sklearn import svm data1 = scio.loadmat('ex6data1.mat')
data2 = scio.loadmat('ex6data2.mat')
data3 = scio.loadmat('ex6data3.mat')
x1 = data1['X']
y1 = data1['y'].flatten()
x2 = data2['X']
y2 = data2['y'].flatten()
x3 = data3['X']
y3 = data3['y'].flatten()
xval = data3['Xval']
yval = data3['yval'].flatten()'''============================part1========================='''
'''可视化数据集'''
def plot_data(x, y):p = x[y==1]n = x[y==0]plt.scatter(p[:,0], p[:,1], c='k', marker='+', label='y=1')plt.scatter(n[:,0], n[:,1], c='y', marker='o', edgecolors='k', linewidths=0.5, label='y=0')plt.showplot_data(x1, y1)'''线性核函数模型-样本1'''
clf1 = svm.SVC(C=1, kernel='linear')
clf1.fit(x1, y1)
#clf1.predict([[2.0, 4.5]])'''画出决策边界'''
def plot_boundary(clf, x1):u = np.linspace(np.min(x1[:,0]), np.max(x1[:,0]), 500) #为了后面可以直接调用这个函数v = np.linspace(np.min(x1[:,1]), np.max(x1[:,1]), 500)x, y = np.meshgrid(u, v) #转为网格(500*500)z = clf.predict(np.c_[x.flatten(), y.flatten()]) #因为predict中是要输入一个二维的数据,因此需要展开z = z.reshape(x.shape) #重新转为网格plt.contour(x, y, z, 1, colors='b') #画等高线plt.title('The Decision Boundary')plt.show#画图
plt.figure(1)
plot_data(x1, y1)
plot_boundary(clf1, x1)
plt.show'''============================part2========================='''
'''高斯核函数模型-样本2'''
#可视化训练集
plot_data(x2, y2) #定义高斯核函数
def gaussianKernel(x1, x2, sigma):return np.exp( -((x1-x2).T@(x1-x2)) / (2*sigma*sigma) )a1 = np.array([1, 2, 1])
a2 = np.array([0, 4, -1])
sigma = 2
gaussianKernel(a1, a2, sigma) #检查是否为0.32465246735834974#训练模型(这里使用内置高斯核)
clf2 = svm.SVC(C=1, kernel='rbf', gamma=np.power(0.1, -2)/2) #对应sigma=0.1
clf2.fit(x2, y2)
#clf2.predict([[0.4, 0.9]])#画图
plt.figure(2)
plot_data(x2, y2)
plot_boundary(clf2, x2)
plt.show'''============================part3========================='''
'''高斯核函数模型-样本3'''
#可视化训练集
plot_data(x3, y3) plot_data(xval, yval) try_value = np.array([0.01, 0.03, 0.1, 0.3, 1, 3, 10, 30])
#错误率
def error_rate(predict_y, yval):m = yval.sizecount = 0for i in range(m):count = count + np.abs(int(predict_y[i])-int(yval[i])) #避免溢出错误得到225return float(count/m) #模型选择
def model_selection(try_value, x3, y3, xval, yval):error = 1c = 1sigma = 0.01for i in range(len(try_value)):for j in range(len(try_value)):clf = svm.SVC(C=try_value[i], kernel='rbf', gamma=np.power(try_value[j], -2)/2)clf.fit(x3, y3)predict_y = clf.predict(xval) if error > error_rate(predict_y, yval):error = error_rate(predict_y, yval)c = try_value[i]sigma = try_value[j]return c, sigma, errorc, sigma, error = model_selection(try_value, x3, y3, xval, yval) #(1.0, 0.1, 0.035) clf3 = svm.SVC(C=c, kernel='rbf', gamma=np.power(sigma, -2)/2)
clf3.fit(x3, y3)#画图
plt.figure(3)
plot_data(x3, y3)
plot_boundary(clf3, x3)
plt.show
样本集1可视化结果
C=1时的决策边界,比较合适的给出了间距
C=100时的决策边界,把异常点也正确分类了,可以看出C太大可能会过拟合
样本集2可视化结果,明显非线性可分
C=1、sigma=0.1时的决策边界
C=1、sigma=0.01时的决策边界,显然过拟合了,此时simga太小了
C=1、sigma=0.5时的决策边界,显然拟合的不好,欠拟合了,此时simga太大了
样本3选择出错误率最低的模型,即C=1, sigma=0.1, 错误率为0.035
此时的决策边界
吴恩达|机器学习作业6.0支持向量机(SVM)相关推荐
- 吴恩达|机器学习作业4.0神经网络反向传播(BP算法)
4.0.神经网络学习 1)题目: 在本练习中,您将实现神经网络的反向传播算法,并将其应用于手写数字识别任务.在之前的练习中,已经实现了神经网络的前馈传播,并使用Andrew Ng他们提供的权值来预测手 ...
- 吴恩达|机器学习作业5.0.偏差与方差
5.0.偏差与方差 1)题目: 在本练习中,您将实现正则化线性回归,并使用它来研究具有不同偏差-方差属性的模型.在练习的前半部分,您将使用水库水位的变化实现正则化线性回归来预测大坝的出水量.在下半部分 ...
- 吴恩达|机器学习作业8.0.异常检测
8.0.异常检测 1)题目: 在本练习中,您将实现异常检测算法,并将其应用于检测网络中的故障服务器.在第二部分中,您将使用协同过滤来构建电影推荐系统. 在本练习中,您将实现一个异常检测算法来检测服务器 ...
- 吴恩达|机器学习作业7.0.k-means聚类
7.0.k-means聚类以及图像压缩(颜色压缩) 1)题目: 在本练习中,您将使用k-means聚类算法并且将其应用于压缩图像.在第二部分中你将使用主成分分析来找到脸部图像的一个低维表示. 第一部分 ...
- 第一章-机器学习简介 深度之眼_吴恩达机器学习作业训练营
目录 专栏简介: 一,机器学习简介 1.1 机器学习定义 1.1 机器学习的重要性 1.2 应用领域 二.监督学习 三.无监督学习 四.总结 专栏简介: 本栏主要内容为吴恩达机器学习公开课的学习笔记, ...
- 吴恩达机器学习作业ex2-python实现
系列文章目录 吴恩达机器学习作业ex1-python实现 吴恩达机器学习作业ex2-python实现 吴恩达机器学习作业ex3-python实现 作业说明及数据集 链接:https://pan.bai ...
- k均值算法python实现(吴恩达机器学习作业)
k均值算法python实现(吴恩达机器学习作业) 题目要求 数据集 读取mat文件 K-means 实现 结果 问题 题目要求 采用K均值算法对样本进行聚类. 编写K均值算法源代码,对ex7data2 ...
- 吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现)
吴恩达机器学习作业7 - K-means和PCA主成分分析(Python实现) Introduction 在本实验中,将实现K-means聚类算法,并将其应用于图像压缩.在第二部分实验中,将使用主成分 ...
- 吴恩达机器学习作业Python实现(六):SVM支持向量机
吴恩达机器学习系列作业目录 1 Support Vector Machines 1.1 Example Dataset 1 %matplotlib inline import numpy as np ...
最新文章
- Python 常用 PEP8 编码规范和建议
- 使用Fiddler进行Web接口测试
- Python 随机森林特征重要度
- 修改注册表实现程序开机自启动
- c++ amp vs2017 报错_opencv4教程-1 opencv的安装与调试Windows10+vs2017
- mysql中json_extract函数的使用?作用是什么?
- Java 程序连接 Informix 数据库方法实例介绍
- Week2——XML
- linux服务器怎么连接
- AI 人工智能学习之泰勒公式与拉格朗日乘数法
- Eclipse安装好后快捷方式无法在桌面上打开,在Eclipse文件夹里可以正常打开。
- golang模拟新浪微博登录
- 男人和女人是怎样吹牛的
- 钻石闪耀天体,但我还是忘不了-孔卡
- [F2F] MyBatis相关面试题
- Java面试题2017版
- 【解决方案】SkeyeVSSSkeyeARS助力水利工程视频监管-长江流域重点水域禁渔视频监控系统建设
- 通过ffmpeg实时读取宇视摄像头的高清帧流数据,并保存4张图片进行4合一照片的生成。
- 【ICCV2019】probabilistic face embeddings 概率人脸嵌入
- XT.COM即将上线IJZ(IINJAZ)