十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
我先直观地阐述我对SVM的理解,这其中不会涉及数学公式,然后给出Python代码。
创新互联专注于企业成都营销网站建设、网站重做改版、黎城网站定制设计、自适应品牌网站建设、H5建站、购物商城网站建设、集团公司官网建设、成都外贸网站建设公司、高端网站制作、响应式网页设计等建站业务,价格优惠性价比高,为黎城等各大城市提供网站开发制作服务。
SVM是一种二分类模型,处理的数据可以分为三类:
线性可分,通过硬间隔最大化,学习线性分类器
近似线性可分,通过软间隔最大化,学习线性分类器
线性不可分,通过核函数以及软间隔最大化,学习非线性分类器
线性分类器,在平面上对应直线;非线性分类器,在平面上对应曲线。
硬间隔对应于线性可分数据集,可以将所有样本正确分类,也正因为如此,受噪声样本影响很大,不推荐。
软间隔对应于通常情况下的数据集(近似线性可分或线性不可分),允许一些超平面附近的样本被错误分类,从而提升了泛化性能。
如下图:
实线是由硬间隔最大化得到的,预测能力显然不及由软间隔最大化得到的虚线。
对于线性不可分的数据集,如下图:
我们直观上觉得这时线性分类器,也就是直线,不能很好的分开红点和蓝点。
但是可以用一个介于红点与蓝点之间的类似圆的曲线将二者分开,如下图:
我们假设这个黄色的曲线就是圆,不妨设其方程为x^2+y^2=1,那么核函数是干什么的呢?
我们将x^2映射为X,y^2映射为Y,那么超平面变成了X+Y=1。
那么原空间的线性不可分问题,就变成了新空间的(近似)线性可分问题。
此时就可以运用处理(近似)线性可分问题的方法去解决线性不可分数据集的分类问题。
---------------------------------------------------------------------------------------------------------------------------
以上我用最简单的语言粗略地解释了SVM,没有用到任何数学知识。但是没有数学,就体会不到SVM的精髓。因此接下来我会用尽量简洁的语言叙述SVM的数学思想,如果没有看过SVM推导过程的朋友完全可以跳过下面这段。
对于求解(近似)线性可分问题:
由最大间隔法,得到凸二次规划问题,这类问题是有最优解的(理论上可以直接调用二次规划计算包,得出最优解)
我们得到以上凸优化问题的对偶问题,一是因为对偶问题更容易求解,二是引入核函数,推广到非线性问题。
求解对偶问题得到原始问题的解,进而确定分离超平面和分类决策函数。由于对偶问题里目标函数和分类决策函数只涉及实例与实例之间的内积,即xi,xj。我们引入核函数的概念。
拓展到求解线性不可分问题:
如之前的例子,对于线性不可分的数据集的任意两个实例:xi,xj。当我们取某个特定映射f之后,f(xi)与f(xj)在高维空间中线性可分,运用上述的求解(近似)线性可分问题的方法,我们看到目标函数和分类决策函数只涉及内积f(xi),f(xj)。由于高维空间中的内积计算非常复杂,我们可以引入核函数K(xi,xj)=f(xi),f(xj),因此内积问题变成了求函数值问题。最有趣的是,我们根本不需要知道映射f。精彩!
我不准备在这里放推导过程,因为已经有很多非常好的学习资料,如果有兴趣,可以看:CS229 Lecture notes
最后就是SMO算法求解SVM问题,有兴趣的话直接看作者论文:Sequential Minimal Optimization:A Fast Algorithm for Training Support Vector Machines
我直接给出代码:SMO+SVM
在线性可分数据集上运行结果:
图中标出了支持向量这个非常完美,支持向量都在超平面附近。
在线性不可分数据集上运行结果(200个样本):
核函数用了高斯核,取了不同的sigma
sigma=1,有189个支持向量,相当于用整个数据集进行分类。
sigma=10,有20个支持向量,边界曲线能较好的拟合数据集特点。
我们可以看到,当支持向量太少,可能会得到很差的决策边界。如果支持向量太多,就相当于每次都利用整个数据集进行分类,类似KNN。
引入相关模块,这次我们使用stats的
产生两列随机变量,用到了stats。norm.rvs,参数loc表示平均数,scale表示标准差,size是样本量这是产生的两个变量的数据的一部分
ttest_rel的用法:输出t和p值从p值可以看出,这两列数据是没有差异的。
当然,ttest_rel还可以接受pandas.DataFrame数据,先从excel中读取数据我们可以看一下数据的基本内容:
我们可以选择scoreA和ScoreB这两列数据进行T检验输出的结果可见两列变量均值无差异
我们还可以同时对多个变量进行检验,比如:这是产生的结果可见:第一个array表示t值,两个表示p值,因此我们可以知道p(scoreA)=0.1260.05
1.直方图
由于正态分布具有非常典型的中间高,两边低的图形特征,如果样本数据并不服从正态分布,我们可以通过直方图很快地分辨出来。更进一步地,Python可以辅助生成基于样本数据估计的正态曲线,这样就容易辅助我们进行判断。
图形观察虽然直观,但是部分研究者认为单纯观察图形过于主观,因此我们也可以选择使用统计检验的方法去研究数据是否服从正态分布。
操作步骤:
导入相关的包及数据
2 P-P图及Q-Q图
直方图是最长用于观察数据分布的常用图形选项,尤其是带正态曲线的直方图,可以非常直观地看到实际数据分布和正态曲线的对比,而P-P图及Q-Q图则是另一种选择,它可以直观给出实际数据分布和理论的差距。
值得注意的是,虽然P-P图及Q-Q图常用用于判断数据样本是否服从正态分布,但实际上它们也能判断数据样本是否服从其他的分布
P-P图:反映的是数据的实际累积概率与假定所服从分布的理论累积概率的符合程度。在此处,我们所假定的分布就是正态分布,如果数据样本是服从正态分布的话,那么实际的累积概率与理论的累积概率应该是相对一致的,放映在图形中就是数据点应该沿着图形的对角线分布。
Q-Q图的原理与P-P图几乎一致。P-P图考察的是实际分布与理论分布的累积概率分布差异,而Q-Q图考察的是实际百分位数与理论百分位数的差异。同理在此处,我们所假定的分布就是正态分布,如果数据样本是服从正态分布的话,那么实际的分布应该是相对一致的,反映在图形中就是数据点应该沿着图形的对角线分布。
在Python中,statsmodels包中目前主要提供的是Q-Q图的绘制
柯尔莫戈洛夫-斯米诺夫检验(Kolmogorov-Smirnov test),一般又称K-S检验,是一种基于累计分布函数的非参数检验,用以检验两个经验分布是否不同或一个经验分布与另一个理想分布是否不同。
K-S检验的原假设是“样本数据来自的分布与正态分布无显著差异”,因此一般来说,KS检验最终返回两个结果,分别是检验统计量及P值,检验结果P0.05才是我们的目标。
实际上,GraphPad不推荐使用单纯的Kolmogorov-Smirnov test方法
夏皮洛-威尔克检验(Shapiro—Wilk test),一般又称W检验。W检验是一种类似于利用秩进行相关性检验的方法。同样需要注意的是,W检验与K-S检验一样,原假设是“样本数据来自的分布与正态分布无显著差异”,因此一般来说,W检验最终返回两个结果,分别是检验统计量及P值。,检验结果P0.05才是我们的目标。
当数据集中的数据无重复值时,该方法的检验效果比较好,但是当数据集中有些数据不是独一无二的,即有些数据的数值是相同的,那么该方法的检验效果就不是很好
GraphPad官方推荐使用该方法。
首先计算 偏度和峰度以便在不对称和形状方面量化分布离高斯分布的距离。然后,其计算这些值中的每一个与高斯分布的预期值之间的差异,并基于这些差异的总和,计算各P值。这是一种通用和强大的正态性检验,推荐使用。请注意,D'Agostino开发了几种正态性检验。Prism使用的其中一个是“综合K2”检验。
安德森-达令检验样本数据是否来自特定分布,包括分布:'norm', 'expon', 'gumbel', 'extreme1' or 'logistic'.
原假设 H0:样本服从特定分布; 备择假设 H1:样本不服从特定分布
实际上,从已有的文献表明,对于数据分布的正态性研究,首选方法是图形观察,即利用直方图、P-P图或Q-Q图进行观察,如果分布严重偏态和尖峰分布则建议进行进一步的假设检验。如果图形分布结果不好判断,则再进行正态性检验。
实际上,从已有的文献表明,对于数据分布的正态性研究,首选方法是图形观察,即利用直方图、P-P图或Q-Q图进行观察,如果分布严重偏态和尖峰分布则建议进行进一步的假设检验。如果图形分布结果不好判断,则再进行正态性检验。
其次,对于检验方法来说,对于K-S检验及W检验结果来说,有文献采用蒙特卡罗模拟方法进行多次验证,结果表明W检验结果相比于大部分方法都有较大的检验功效,而K-S方法的检验结果相对不佳。并且部分学者认为,K-S检验的实用性远不如图形工具,因为在样本量少时,该检验不太敏感,但是在样本量大时,该检验却过于敏感。因此正常情况下,我们更常采用W检验的结果。
值得注意的是,虽然说K-S检验结果相对不佳,但是不同检验方法对于样本量的敏感度是不一样的。在样本量较小的情况下(小于50个样本的情况下),请优先选择W检验;在样本量50-5000的情况下,可以酌情使用W检验及K—S检验;在样本量大于5000的情况下,请使用K-S检验结果,尤其是在SPSS中,当样本量大于5000的情况下,将只显示K-S检验结果,而不显示W检验结果。