完整的线性SMO算法 Parameters: dataMatIn - 数据矩阵 classLabels - 数据标签 C - 松弛变量 toler - 容错率 maxIter - 最大迭代次数 kTup - 包含核函数信息的元组 Returns: oS.b - SMO算法计算的b oS.alphas - SMO算法计算的alphas
(dataMatIn, classLabels, C, toler, maxIter, kTup = ('lin',0))
| 217 | return 0 |
| 218 | |
| 219 | def smoP(dataMatIn, classLabels, C, toler, maxIter, kTup = ('lin',0)): |
| 220 | """ |
| 221 | 完整的线性SMO算法 |
| 222 | Parameters: |
| 223 | dataMatIn - 数据矩阵 |
| 224 | classLabels - 数据标签 |
| 225 | C - 松弛变量 |
| 226 | toler - 容错率 |
| 227 | maxIter - 最大迭代次数 |
| 228 | kTup - 包含核函数信息的元组 |
| 229 | Returns: |
| 230 | oS.b - SMO算法计算的b |
| 231 | oS.alphas - SMO算法计算的alphas |
| 232 | """ |
| 233 | oS = optStruct(np.mat(dataMatIn), np.mat(classLabels).transpose(), C, toler, kTup) #初始化数据结构 |
| 234 | iter = 0 #初始化当前迭代次数 |
| 235 | entireSet = True; alphaPairsChanged = 0 |
| 236 | while (iter < maxIter) and ((alphaPairsChanged > 0) or (entireSet)): #遍历整个数据集都alpha也没有更新或者超过最大迭代次数,则退出循环 |
| 237 | alphaPairsChanged = 0 |
| 238 | if entireSet: #遍历整个数据集 |
| 239 | for i in range(oS.m): |
| 240 | alphaPairsChanged += innerL(i,oS) #使用优化的SMO算法 |
| 241 | print("全样本遍历:第%d次迭代 样本:%d, alpha优化次数:%d" % (iter,i,alphaPairsChanged)) |
| 242 | iter += 1 |
| 243 | else: #遍历非边界值 |
| 244 | nonBoundIs = np.nonzero((oS.alphas.A > 0) * (oS.alphas.A < C))[0] #遍历不在边界0和C的alpha |
| 245 | for i in nonBoundIs: |
| 246 | alphaPairsChanged += innerL(i,oS) |
| 247 | print("非边界遍历:第%d次迭代 样本:%d, alpha优化次数:%d" % (iter,i,alphaPairsChanged)) |
| 248 | iter += 1 |
| 249 | if entireSet: #遍历一次后改为非边界遍历 |
| 250 | entireSet = False |
| 251 | elif (alphaPairsChanged == 0): #如果alpha没有更新,计算全样本遍历 |
| 252 | entireSet = True |
| 253 | print("迭代次数: %d" % iter) |
| 254 | return oS.b,oS.alphas #返回SMO算法计算的b和alphas |
| 255 | |
| 256 | |
| 257 | def img2vector(filename): |
no test coverage detected