《机器学习实战》ch06 SVM学习记录

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,这是为了方便后续工作的进行。

猜你喜欢

转载自www.cnblogs.com/doggy331/p/11739142.html