感知器模型
感知器模型就是试图找到一条线,能够将所有的二元类别分割开。如果是高维空间就是找到一个超平面,能够将所有的二元类别分割开。算法是在数据中找出一个划分超平面,让尽可能的数据分布在这个平面的两侧。实际中符合要求的超平面是可能存在多个点的。
模型的核心思想,让距离超平面最近的点尽可能的远离超平面。
SVM几个重要名词解释
1,线性可分:在数据集中可以找出一个超平面,将两组数据分开,这个数据集叫线性可分数据
2,线性不可分:在数据集中,没法找出一个超平面,能够将两组数据分开,
3,分隔超平面:将数据分割开来的直线/平面
4,支持向量:离分隔超平面最近的那些点叫做支持向量
5,间隔,支持向量数据到分隔超平面的距离。
在svm中,支持向量到超平面的函数狐狸一般设置为1
6.2.2 SVM应用的一般框架
'''
SVM的一般流程
1)收集数据:可以使用任意方法。
2)准备数据:需要数值型数据。
3)分析数据:有助于可视化分隔超平面
4)训练算法:SVM的大部分时间都源自训练,改过程主要实现两个参数的调优
5)测试算法:十分简单的计算过程就可以实现
6)使用算法:几乎所有问题都可以使用svm,svm本身就是一个二类分类器,对多类问题应用svm需要对代码做修改
'''
6.3 SMO高效优化算法
所有需要做的围绕优化的事情就是训练分类器,一旦得到appha的最优值,我们就得到了分隔超平面并能够将之用于数据分类
6.3.1Platt的SMO算法
SMO表示序列最小化,将大优化问题分解为多个小优化问题来求解。目标是求出一系列alpha和b,通过alpha,计算出权重向量w并得到分隔超平面
SMO工作原理:每次循环中选择两个alpha进行优化处理。一旦找到一对合适的alpha,那么久增大其中一个同时减少另一个。
6.3.2 应用简化版SMO算法处理小规模数据集
'''
SMO算法的伪代码大致如下
创建一个alpha向量并将其初始化为0向量
当迭代次数小于最大迭代次数时(外循环)
对数据集中的每个数据向量(内循环)
如果该数据向量可以被优化
随机选择另外一个数据向量
同时优化这两个向量
如果两个向量都不能被优化,退出内循环
如果所有向量都没被优化,增加迭代数目,继续下一次循环
'''
#5个参数分别是数据集,类别标签,常数c,容错率toler,取消前最大循环次数
def smoSimple(dataMatIn, classLabels, C, toler, maxIter):
dataMatrix = mat(dataMatIn);
labelMat = mat(classLabels).transpose()#转置了类别标签,