目录
Mathematics Begind Large Margin Classification
Large Margin Classification
Optimization Objective
介绍了svm做了什么事 ,相比较于logistic regression。给出了数学定义
Large Margin Intuition
结合函数图介绍了svm的情况,它是一个large margin classifier,以及在不同c的情况下,预测会倾向于做出怎么样的变化。
Mathematics Begind Large Margin Classification
解释了cost function公式的物理意义,以及为什么它倾向于选large margin
Kernels
Kernels I
如何去选择feature。kernal function(gaussian kernels)需要读文稿辅助理解。
Kernels II
解释上一节遗漏的概念,需要读文稿辅助理解。
ex-6
目的:通过svm构建一个垃圾邮件分类器。
文件结构:
ex6.m - main函数,主处理流程。处理一个简单的2d分类问题。
ex6data1.mat - ex6data2.mat - ex6data3.mat - 数据
svmTrain.m - svm训练函数
svmPredict.m - svm预测函数
plotData.m - 用内置的plot函数画图,输入二维X和一维y,平面图坐标为x1/x2,用+表示y=0,o表示y=1
visualizeBoundaryLinear.m - 画线性预测分割线
visualizeBoundary.m - 画出非线性预测分割线
linearKernel.m - svm kernel
[*] gaussianKernel.m - gaussian kernel
[*] dataset3Params.m - 针对data3的参数
ex6_spam.m - 第二个练习的主函数,处理垃圾邮件分类
spamTrain.mat - spam训练集
spamTest.mat - spam测试集
emailSample1.txt - emailSample2.txt - 样例邮件
spamSample1.txt - spamSample2.txt - 样例spam
vocab.txt - 词汇表
getVocabList.m - 加载词汇表
porterStemmer.m - stemming函数,把同根词都转成词干
readFile.m - 读文件并把内容转为string
submit.m - 提交作业
[*] processEmail.m - 对email进行处理
[*] emailFeatures.m - 从email中提取feature
可以看到这几次练习的函数拆分比早期作业的细,很多放在main里面的功能都拆成了单独的代码文件。
第一部分完成步骤:
1. 利用dataset1来熟悉svm中C对分割预测线的影响【注:这里使用的svmTrain以及大多数的svm包都会自动添加feature x0=1,所以这里无需手动处理x0】
C=1/10/100如下图:
可以看出,当C越大时越倾向于把所有的数据都分开,但是自然数据存在误差,所以并不是C越大划分越好。
2. 利用高斯核函数和dataset2完成非线性分类。要点:1. 计算每个样例之间的距离 2. 带宽参数lambda决定了相似性矩阵下降的快慢
如图为sigma=0.1/0.2之间的差距
sigma增大的效果和C减小的效果相似。
3. 利用训练集和cv集来寻找最适合的C和sigma
利用两层for循环遍历,数据量小的时候可以这样处理。
第二部分完成步骤:
1. 对数据进行处理
对url来说常见的处理方式是统计url出现的次数,而不是看具体是哪个url。在processEmail中已经做了预处理,包括:
将字符统一转成小写/转换特殊字符为空格/转换数值为标志符号number/转换http地址为标志位httpaddr/转换email地址为标志位emailaddr/转换价格为标志位dollar/词汇转成词干/删除特殊字符
之后把词汇表中的词对应标号写在一个list里返回即可。在实际应用中,一般取10 000~50 000个spam邮件高频词。
在getVocabList中使用了cell函数,该函数返回的数组or矩阵可以存储字符串作为item,按下标访问时通常使用花括号{}而不是圆括号()来调用。之后再把数组转成0-1标签数列,作为输入的x。
2. 训练svm
使用task1中相同的技术,这里用的linearKernel。
3. 选做
尝试从SpamAssassin Public Corpus的数据中构建自己的数据集和词汇表,以及尝试libsvm。