这个问题在吴恩达老师的《机器学习》课程(斯坦福版本CS 229)里面讲解过,有兴趣的可以自己去网易公开课看看,图片截图自该课程课件。
6.2 试使用 LIBSVM,在西瓜数据集 3.0α 上分别用线性核和高斯核训练一个 SVM,并比较其支持向量的差别。
答:
这里没用LIBSVM,用的sklearn中的sklearn.svm.svc,它的实现也是基于libsvm的。
使用不同参数的时候,支持向量是不同的(没有对高斯核中的gamma调参)。由于西瓜数据集3.0a线性不可分,所以使用线性核时,无论惩罚系数多高 ,还是会出现误分类的情况;而使用高斯核时在惩罚系数设置较大时,是可以完全拟合训练数据。所以在惩罚系数设置较小时,两者支持向量都类似,而在惩罚系数较大(支持向量机中,惩罚系数越大,正则化程度越低)时,高斯核的支持向量数目会较少,而线性核的会几乎没有变化。
代码在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets
C = 100时训练情况如下:
高斯核支持向量: [ 8 9 11 12 13 14 16 2 3 4 5 6 7]
6.4 试讨论线性判别分析与线性核支持向量机在何种条件下等价。
答:
这道题想不出很明确的答案,这仅讨论一下。
有一点很明确的是:在数据线性可分时并不会导致线性判别分析与线性核支持向量机等价。
上图是以iris数据中第0列和第2列数据作为训练集。分别LDA和线性核SVM训练,得到图中两者的决策边界,可以看出在数据线性可分的情况下,两者决策边界还是有很大差别的。如果这里等价理解为两者决策边界相同,即两个模型决策函数是相同的,那么两者决策边界重合时,两者等价的。那么什么时候两者会重叠?
查了很多资料没找到相关信息。感觉LDA和SVM其实没有多大相似度。
ps.这里解答其实就按照结果倒推了一下。貌似都是些废话。
画图代码在:han1057578619/MachineLearning_Zhouzhihua_ProblemSets
代码有点乱。
6.5 试述高斯核 SVM 与 RBF 神经网络之间的联系。
答:
其实这个题目在p145的《休息一会儿》的注释里面已经给出答案了。
RBF神经网络中,将隐藏层神经元个数设置为训练样本数,每个样本设置为一个神经元中心,此时RBF的预测函数和SVM激活函数相同。
个人理解,两个模型还是有挺大差别的。
- RBF中径向基激活函数中控制方差的参数 是由模型自动习得,而在SVM中是一个可调节的超参。
- 目标函数、优化方式也不同。
但是如果将RBF中 固定为和SVM一致,最后训练结果应该会比较相似。
以上是个人理解。就不写代码验证了。。。
6.6 试析 SVM 对噪声敏感的原因。
答:
SVM的决策只基于少量的支持向量,若噪音样本出现在支持向量中,容易对决策造成影响,所以SVM对噪音敏感。
6.7 试给出式 (6.52) 的完整 KKT 条件。
答:
6.52式是经过将完整的KKT条件
6.8 以西瓜数据集 3.0α 的"密度"为输入"含糖率"为输出,试使用LIBSVM 训练一个 SVR。
答:
关于SVR没有理解很深,简单了解了一下。这道题就简单看一下不同参数,训练结果的变换吧。
直观上看,含糖率和密度无明显关系。所以无论模型参数怎么调,看上去对数据的拟合都不是很好,预测值和真实值还是有较大差异。不过还是可以看出来随着gamma或者C的增大,模型都会趋于更加复杂。
这里代码很简单,还是放上来。
han1057578619/MachineLearning_Zhouzhihua_ProblemSet
6.9 试使用核技巧推广对率回归,产生"核对率回归"。
答:
可直接使用梯度下降等优化算法求解上图的目标函数即
题目没要求。就偷个懒不写代码了。
说个题外的。SVM中只有少数支持向量对应的 非零,所以对于SVM来说,训练完成后只需要储存个别非零的 和对应数据点即可;而不同于SVM, 核逻辑回归并没有这一性质,需要储存所有训练数据。就这一点来说核逻辑回归并不高效。
6.10* 试设计一个能显著减少 SVM 中支持向量的数目而不显著降低泛化性能的方法。(未完成)
答:
这个应该也是某个论文。最近时间不多,暂时不深究了就。。
6.11 自己编程实现SVM,并在西瓜数据集 3.0αα 测试。
答:
自己加的题目。虽然书上没要求,但还是自己写了一遍。
代码在:
han1057578619/MachineLearning_Zhouzhihua_ProblemSets
其实主要就是把SMO实现了一遍。
参考:
- 《统计学习方法》
- 《机器学习实战》
- 《Sequential Minimal Optimization: A Fast Algorithm for Training Support Vector Machines》
- 《THE IMPLEMENTATION OF SUPPORT VECTOR MACHINES USING THE SEQUENTIAL MINIMAL OPTIMIZATION ALGORITHM》
写代码的时候参考以上资料。代码主要根据原论文中提供的伪代码和《机器学习实战》的源码写的,《机器学习实战》中给出的代码和原论文有几个地方有差异:
训练结果和使用sklearn中结果(习题6.2)一致,支持向量也是相同的,决策边界差不多相同,其他数据未测试。不过速度上,sklearn会快很多,测试了一下训练西瓜数据集,自己写的代码需要5e-4秒,而sklearn只需要1e-8。还是有很大差距的。
代码有点乱,这里只为深刻理解一下SMO,也不做工程使用,暂时就不优化了。。以后闲下来再看看。
以上。