机器学习---编程练习(六):支持向量机

机器学习—编程练习(六):支持向量机

文件列表:

ex6.m - Octave/MATLAB script for the first half of the exercise
ex6data1.mat - Example Dataset 1
ex6data2.mat - Example Dataset 2
ex6data3.mat - Example Dataset 3
svmTrain.m - SVM training function
svmPredict.m - SVM prediction function
plotData.m - Plot 2D data
visualizeBoundaryLinear.m - Plot linear boundary
visualizeBoundary.m - Plot non-linear boundary
linearKernel.m - Linear kernel for SVM
[*] gaussianKernel.m - Gaussian kernel for SVM
[*] dataset3Params.m - Parameters to use for Dataset 3
ex6 spam.m - Octave/MATLAB script for the second half of the exercise
spamTrain.mat - Spam training set
spamTest.mat - Spam test set
emailSample1.txt - Sample email 1
emailSample2.txt - Sample email 2
spamSample1.txt - Sample spam 1
spamSample2.txt - Sample spam 2
vocab.txt - Vocabulary list
getVocabList.m - Load vocabulary list
porterStemmer.m - Stemming function
readFile.m - Reads a file into a character string
submit.m - Submission script that sends your solutions to our servers
[*] processEmail.m - Email preprocessing
[*] emailFeatures.m - Feature extraction from emails
*表示需要做的内容

1 支持向量机

在这次练习的前半段,你将会在各种2维数据中使用支持向量机。这些数据的实验将会帮助你对向量机如何工作,以及怎样使用向量机的高斯核函数有一个直观的印象。在这次练习的后半部分,你将会使用支持向量机建立一个垃圾分类器。

(SVM核知识补充,待做)


1.1 数据样本 1 使用线性核SVM寻找不可线性分割的决策边界

在这里插入图片描述

1.1.1对样本数据的描述:

正样本(+)和负样本(o)的位置被一个隐藏的缺口自然分开。可是,注意在左边较远的
位置(0.1,4.1)有一个异常的正样本+.
在这部分的练习中,你将会看到这个异常值是怎样影响SVM的决策边界的。


1.1.2 练习要求:

改变SVMs中C的大小,观察它对SVM的影响。
C是一个正值,控制模型对训练样本错误分类的惩罚度。一个较大的C告诉SVM尝试对所有样本正确分类。C扮演了和1/λ相似的角色。
λ是我们之前在逻辑回归中使用的正则参数。

在图2 中,C = 1,SVM将决策边界放到了两个数据的间隔之间,并且将左边较远位置的数据点错误的划分了。
在图3 中,C = 100,SVM现在将所有样本正确的分类,但是这个决策边界并不能自然的拟合数据。


1.2 高斯核支持向量机

在这部分的练习中,你将会使用SVMs做非线性分类器。尤其你将在不可线性分离的数据中使用高斯核SVMs


1.2.1 高斯核函数


1.2.1.1 高斯核介绍

你可以将高斯核认为是一个测量一组样本(x(i), x(j))之间距离的函数。高斯核也被一个带宽参数σ 参数化,σ 决定了相似性度量随着样本分隔距离的增加减少到0的速度。

高斯核公式:
在这里插入图片描述


1.2.1.2 练习:完成 gussianKernel.m
sim = exp(-((x1-x2)'*(x1-x2)) / (2*sigma.^2));


1.2.2 样本数据 2 || 使用高斯核SVM寻找不可线性分割的决策边界

图4 无法用一个线性决策边界划分正负样本数据。
图5 是用高斯核SVM训练的决策边界。这个决策边界能够正确分离大多数的正负样本,并且能很好的拟合数据。


1.2.3 样本数据 3
练习目标:	
	正确寻找数据3 的决策边界

提供:	
	 ex6data3.mat 中给出变量 X,y,Xval,yval
	 ex6.m 中有使用训练集(X,y)训练的SVM分类器。训练参数从 	
	 				 dataset3Params.m中得到
 				 
要求:	
	使用交叉验证集(Xval,yval)确定最优参数 C 和 σ 
	C 和 σ 的取值按照3倍乘法取值(0.01,0.03,0.1,0.3,1,3,10,30)
				一共对8*8 = 64 个模型训练评估。
				
算法思路:
	迭代每一个C和sigma值,求出训练模型和预测值
	用预测值与真实值比对,得出预测误差
	再对比每一个误差值,找出最小误差对应的 C 和 sigma

	
实现提示:	
	在实现交叉验证集选择最优 C 和 σ 时,你需要评估交叉验证集的误差。误差定义为交叉验证样本中
被错误分类的一部分。在 Octave/Matlab 中,你可以使用 mean(double(predictions ~= yval)) 计算误差。

	predictions 是一个包含所有SVM预测值的向量
	yval是交叉验证集的正确标签
	使用 svmPredict 函数得到交叉验证集的预测值
choice = [0.01 0.03 0.1 0.3 1 3 10 30]';
minError = Inf;
curC = Inf;
cur_sigma = Inf;

for i = 1:8
	for j = 1:8
		model = svmTrain(X, y, choice(i), @(x1, x2) gaussianKernel(x1, x2, choice(j)));
		predictions = svmPredict(model,Xval);
		error = mean(double(predictions ~= yval));
		if error < minError
			minError = error;
			curC = choice(i);
			cur_sigma = choice(j);
		end
	end
end		

C = curC;
sigma = cur_sigma;

找到最优 C 和 σ 值后,修改 dataset3Params.m ,填入最优值。SVM将会得到图7中的决策边界

这里我用的参考答案中的代码。


2 垃圾邮件分类器

在这部分的练习中,你将会使用SVMs建立你自己的垃圾邮件过滤器。你将会训练一个分类器辨别一个邮件 x 是垃圾邮件(y = 1),或者不是垃圾邮件(y = 0)。尤其你需要将每个邮件覆盖到一个特征向量 x ∈ Rn中。接下来的练习将带你了解一个邮件由一个怎样的特征向量组成。

做这部分的时候,为了理解分类的处理步骤,我会将每一部分都详细的阐述一下。只需要看代码实现的可以跳过。


2.1 处理邮件

在这里插入图片描述
在开始一个机器学习任务之前,先看一下数据中的样本通常是一个明智的决定。

图 8 显示一个样本邮件,包含一个URL,一个邮件地址,数字, 美元数目。然而许多邮件将会含有相似类型的对象。这些具体的对象在几乎所有的邮件中都是不同的。因此,在处理邮件中常用的一个方法是“归一化”这些值,由此所有URLs将会被同样的对待,所有的数字也会被同样的对待。这影响一个垃圾邮件分类器做分类决定时是根据 是否有URL存在而不是根据是否有一个特别的URL存在。
这普遍提高了分类器的性能,因为垃圾邮件发送者通常会将URLs随机化,因此再次见到相同的URL的几率非常低。

在 **processEmail.m** 中,已经实现了下面对邮件的处理和归一化步骤:

将所有单词转换成小写
清除HTML格式
将所有URLs替换成 ”httpaddr“
将邮件地址替换成 ”emailaddr“
将数字替换成 ”number“
将美元标识替换成 ”dollar“
减少单词形态。 例如:将“discount”, “discounts”, “discounted” 都视作 “discount”
移除非单词,空格,标点符号转换成一个空格符

图 9 是处理的结果,单词格式和非单词都被移除,这个格式看起来更容易特征提取。
在这里插入图片描述

2.1.1 词汇表

在对邮件处理之后,每一个邮件都有一张词汇表。接下来的步骤是去选择哪些单词我们想要在我们的分类器中使用,哪些是我们想要去除的。
对于本次练习,我们仅选择最频繁出现的单词作为我们的单词集。因为训练集中不经常出现的单词仅在一小部分的邮件中有,他们可能导致模型对我们的训练集过拟合。
完成的单词表在文件vocab.txt并且显示在图10中。我们的单词表通过挑选在垃圾邮件资料库中至少出现100次的单词组成,单词表中有1899个单词。在实际中,一张单词表一般是10,000到50,000个单词
给出单词表,我们现在可以将每一个在处理后邮件中出现的单词映射成一张单词索引列表,这张表包含单词在单词表中的索引。图 11 显示事例邮件的映射。
需要注意的是,在事例邮件中,单词 ”anyone“ 首先被归一化成 ”anyon“ 然后被映射成词汇表中索引86
在这里插入图片描述

练习目标:	
	完成 processEmail.m 对示例邮件的映射。

已给数据:
	处理后邮件的一个单词的字符串 str

算法思路:
	遍历单词表判断 str 是否存在与单词表中
	如果单词存在,将单词索引加入到 word_indices 变量中
	如果不存在,跳过该单词

Octave/Matlab 提示:
	在Octave/Matlab 中,你可以使用 strcmp 函数 比较两个字符串。例如
strcmp(str1, str2) 仅当两个字符串相等的时候返回 1
	在提供的初始代码中,vocabList 是一个元胞数组,它包含了单词表中的词汇。
	
	元胞数组是数组的一种,其内部元素可以是属于不同的数据类型
	索引方式是 vocabList{ i }	,但仍可以用 length(vocabList)来获取词汇表中单词的数量。
for i = 1:length(vocabList)
      
      if strcmp(str,vocabList{i})
        
        word_indices = [word_indices; i];
        
       else
        
        continue;
        
      endif
    endfor


2.2 从邮件中提取特征

任务:
	将每一封邮件的特征映射成R^n 的向量。	

给出:
	映射后的邮件 word_indices 
	单词表个数 1899

算法思路:
	初始化 全零(1899, 1)数组 x
	遍历数组 word_indices ,将其中元素 m 取出
	令x(m) = 1;
%word_indices中元素 m
m = 0;

for i = 1:length(word_indices)
  
  m = word_indices(i);
  x(m) = 1;
  
endfor

在这里插入图片描述

2.3 为垃圾邮件分类器训练SVM

训练数据 spamTrain.mat 和 测试数据 spamTest.mat 已经处理过。
对SVM训练测试之前也做过了。




3.总结

因为想在寒假结束前将这门课程学完,选做部分也不再做了。如果有时间做我会将代码贴到这里。

这部分学完有点懵,需要自己写的代码很少,代码也很简单。最关键的部分都是调用别人写好的函数。最后学完课程的时候需要对课程所学知识做一个复习总结。

刚开始写博文,我在寻找合适的格式(字体,图片大小颜色之类的)。在做完整个机器学习练习时,我会把之前写过的统一整理一下。

  • 1
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值