SVM中主要工作是找到分割超平面从而将数据进行有效分类,而在这里women先引入SMO(序列最小优化)算法,SMO的目标是找出一系列alpha和b,一旦求出了这些alpha,就很容易计算出权重向量w并得到分割超平面。
SMO算法的工作原理是:每次循环中选择两个alpha进行优化处理,一旦找到一对合适的alpha,就增大一个同时减小另一个。
SMO算法的实现需要大量代码,首先我们先对算法进行简化处理,来了解一个简化版本的SMO:
SMO算法中的外循环确定要优化的最佳alpha对,但简化版会tiaoguozh而一部分,现在数据集上遍历每一个alpha,然后在剩下的alpha集合中随机选择另一个alpha来构建alpha对。
(1)SMO算法中的辅助函数
def loadDataSet(fileName): '''打开文件并进行逐行解析, 得到每行的类标签和整个数据矩阵''' dataMat = []; labelMat = [] fr = open(fileName) for line in fr.readlines(): lineArr = line.strip().split('\t') dataMat.append([float(lineArr[0]), float(lineArr[1])]) labelMat.append(float(lineArr[2])) return dataMat,labelMat def selectJrand(i,m): '''i为第一个alpha的下标,m是所有alpha的数目 只要函数值不等于输入值i,函数就会进行随机选择''' j=i while (j==i): j = int(random.uniform(0,m)) return j def clipAlpha(aj,H,L): #用于调整大于H或小于L的alpha值 if aj > H: aj = H if L > aj: aj = L return aj
可以看到这里采用的类标签是-1和1,而不是0和1,这是为了方便后续工作的进行。