SVM学习笔记

xiaoxiao2021-02-28  15

1.学习收获

    ①:                 网络爬虫

       网络爬虫可以爬取网站上我们需要的内容,不过不是所有数据都可以爬取,要了解什么数据可以爬取什么数据不可以爬取我们可以访问该网站根目录下的robots协议来了解,列如浏览器输入www.baidu.com\robots.txt就可以查看到百度的robots协议了,协议规定了什么资源你可以爬取,什么东西不可以爬取,具体的看一看就知道了,有一些网站没有robots协议,说明对你的爬取没有约束。我们通过以下代码实现与网站的通信。

                 req=request.Request(self.url_source+str(self.citycode[i-1])+".shtml",headers=self.headers)

         responce=request.urlopen(req)

         page=responce.read().decode("utf-8")

    通过简单的三步就可以从网站上获取网页内容,其中self.url_source="http://www.weather.com.cn/weather1d/",它是我们要爬取网页的基网址,后续的不同页面通过不同的关键字来进行区分,通过比较不同的网页之间的不同点和相同点既可以发现其中的区别,列如:是北京的天气页面是武汉的天气页面,通过观察我们可以发现大部分的内容是相同的,不同的只是其中的数字而已。那么,这些数字又是什么含义呢,可以很容易地发现这是城市的代码,于是我们可以将城市代码放入一个列表中,每次将不同的代码加入到URL请求中我们就可以获取中国所有城市的天气情况了。

        如何爬取网页上我们想要的内容呢?这时我们不妨使用浏览器打开中国天气网关于北京的天气页面,按下F12我们皆可以观察该页面的代码了。在代码中我们可以看到如下页面,实际上它对应了我们网页中的,所以我们就可以通过正则表达式来爬取我们需要的内容了             以如下为例               pattern_label=re.compile("<span>(.*?)</span>\n<em>紫外线指数</em>\n<p>.*?</p>")

 label=re.findall(pattern_label,page)

其中我嗯需要的内容通过使用(.*?)来替换我们的findall函数就会用列表返回页面中符合表达式的所有内容了。做一个简单的展示就是我们需要爬取的内容了,但是这些是字符串文字量,不适合我们支持向量机的处理,希望把它变成简单的数字,注意到这些等级之间是可以通过不同的数字大小来区别的,所以我们只需要创建一个字典就可以完成相应的工作了。

        还有一点需要注意。爬虫爬取网络页面很容易失败的,所以要使用try和except防止出现错误时程序奔溃。

②             支持向量机(support vector machine)简称SVM

    我们都学习过最小二乘法求通过若干个点的直线,支持向量机通过求得一个划分超平面来划分两个不同的数据,将正例放在一边,反例在另一边。我们用一个图片展示就是

        的确所有的球球都分类好了,但是有一两个球特别接近我们的划分平面,在上图中划分平面就是中间的黑线,这样的划分平面对其他样本未必可以正确地划分,因为数据噪声等因素,训练集之外的数据可能会越界,因而可能会划分失误,我们用通俗的语言理解就是这个线来划分数据的局部扰动的容忍性差。这是我们便采取另一个加强的方法

        我采用一根棍子来划分,使得棍子的直径最大,这样的话即使存在局部扰动,如果扰动不是很大的话应为最近的球依旧和划分平面具有一定的距离,所以依旧可以达到划分效果。

        支持向量劫要做的就是寻找一个划分超平面使得离它最近的两个异类样本到该平面的距离之和最大,反映到上图就是找到一条直线进行划分,并且这根线可以变粗,可以长到最粗的那根线就可以作为划分超平面了。

        上述涉及一些传统语言,用机器学习的术语表示就是:寻找划分超平面,使得样本正确分类,并且支持向量到平面的距离最大。支持向量就是离我们的划分超平面最近的两个异类样本。

采用线形模型来描述:

        如果所有样本都正确分类,就有对于正类样本 Wx+b>0,异类样本 Wx+b<0  其中W ={w1,w2,w3......}所对应的额列向量

通过对W 和 b 进行适当地放缩就可以使得对于正类样本 Wx+b>=1,异类样本Wx+b<=-1;如果有训练样本使得上式的等号成立的话它就是我们要寻找的支持向量。支持向量之间的距离就是就是我们要寻找的最大的间隔,就是2/||W||,||W||=w1^2+w2^2+......。所以我们就是要在划分正确地基础上使得划分间隔最大,这就是支持向量机的模型了。

③                             软间隔支持向量机

但是有的时候可能是训练样本中的少数样本存在较大的噪声使得如果强行将它划分的话将会使得划分超平面的性能下降,所以我们不妨假设有些样本可以不满足约束,在最大间隔的同时要使不满足的样本尽可能少,为了达到这个折中,我们引入一个控制变量C,将优化目标写成了min 0.5*||W||^2+C∑l(y(Wx+b)-1)  其中C就是用来折中的项,如果C很大的话就要求所有样本都分类正确。当C 为有限值时,支持向量机允许有部分样本不满足约束。这就是软间隔支持向量机。

④                             拉格朗日对偶性

        显而易见这是条件极值问题,我们需要优化的目标就是要最求的最大值,而要使所有样本都划分正确就是存在的条件。我们通过拉格朗日乘数法获取它的对偶问题。一般而言对于优化目标f(x,y),对应约束g(x,y)=0;通过引入拉格朗日乘子获取它的对偶问题:求L(x,y,a)=f(x,y)+ag(x,y)的最值,其中a 就是引入的乘子。我们通过对L求偏导再令偏导为零就可以求出对应的(x,y),这是我们的f(x,y)就可以求到最大值了。通过求一个新的函数的无约束优化来获得有约束条件的条件极值,求出无约束优化的解就是对应的有约束的解;所以我们称这两个问题是对偶问题,就是求出了其中一个问题的解,另一个问题也就相当于解决了。

⑤                                 核函数

        在划分样本中如果不能找到合适的划分超平面就可以通过合理的映射将样本映射到高维空间,使其在高维空间上可以找到合适的划分超平面,在引入拉格朗日乘子之后涉及两个样本向量在高维空间的內积,由于特征空间的维数可能会很高,这就使得计算这个內积会变得很困难,为了避开这个障碍,可以设计一个函数使得样本在原始空间的內积就等于在高维映射空间的內积,这既是核函数。显然,通过核函数的引入使得计算变得简单化。

⑥                                 SMO

        对于一个二次优化问题,如果我们对其使用二次规划的算法进行求解的话,问题的规模会正比于训练样本数,使得计算开销会很大。例如 支持向量机引入拉个朗日乘子后的优化问题max ∑ai -0.5∑∑aiajyiyj(Xi)T(xj),i j 是下标,我们通过使用SMO算法进行求解。

      SMO算分的基本思路是先固定ai之外的所参数,再求ai 上的极值,由于存在约束∑aiyi=0,所以ai 就可以使用其他的变量表示,如果每次选择两个变量ai 和 aj 并固定其他参数的话,SMO执行以下两步直到收敛。

    1 选择一对更新的变量 ai aj

    2 固定ai aj 之外的参数,求解优化问题获取更新后的ai aj

    那么如何选择待更新的变量呢? 我们有一个启发式的选择办法,就是选择两个样本差别最大的两个变量所对应的拉格朗日乘子。

⑦                            训练的结果

       由于调试未解决,一些阈值还没有确定,所以还没有训练结果

⑧                                      可以的改进

   1  对于一些没有爬虫没有爬取全部的特征的数据可以加以利用而不是直接舍去,例如可以采用半监督支持向量机来学习。

   2  调试没有完成,没有训练处结果

   3  没有采用软间隔,泛化性能可能不佳

转载请注明原文地址: https://www.6miu.com/read-1950247.html

最新回复(0)