机器学习笔记——支持向量机SMO算法完整版代码(核函数)
\qquad 前面的代码中(机器学习笔记——支持向量机SMO算法完整版代码分析)使用的“间隔”为线性的间隔计算方法,即向量內积( K i j = ( x i , x j ) K_{ij}=(x_i,x_j) Kij=(xi,xj))。
\qquad 但是在样本数据线性不可分时,就需要通过核函数来进行转换,将低维数据映射到更高位当中进行分类,那么就要将算法中的代码进行修改。
\qquad 由于修改了“间隔”计算方法,也就是说在代码中涉及到 K i j K_{ij} Kij的计算都要修改,有 η 、 b 、 u i \eta、b、u_i η、b、ui,添加了 k e r n e l T r a n s kernelTrans kernelTrans核转换函数,这里只添加了高斯核,需要使用其他核函数可自行添加,下面为修改后的代码:
# -*- coding: utf-8 -*-
"""
Created on Thu Aug 22 15:07:35 2019
@author:wangtao_zuel
E-mail:[email protected]
"""
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
def svmSmo(dataPath,outerPath,C=0.6,toler=0.001,maxIters=40,kTup=('lin',0)):
"""
主函数、外循环
kTup为核函数参数,第一个元素表示核函数类型,第二个元素表示核函数所需要的参数
'lin':线性
'rbf':高斯核
"""
# 读取数据,此处用的为xlsx类型数据,其他类型的数据进行相应的改动
dataMat,labelMat = loadData(dataPath)
# 将数据放在参数类中,并定义一些后面需要用到参数
oS = parameter(dataMat,labelMat,C,toler,kTup)
# 统计大循环次数
iters = 0
# 用于切换边界、非边界情况
entireSet = True
# 统计在边界、非边界情况下是否进行了优化,若当前没有不再有优化则进行切换
alphaPairsChanged =0
# 循环结束条件:达到最大迭代次数或迭代无法提高精度(非边界、边界情况下都无法再进行优化)
while (iters < maxIters) and ((alphaPairsChanged > 0) or (entireSet)):
# 每次循环重新统计
alphaPairsChanged =0
# 最初将所有的alpha都定义为0,所以先遍历整个训练集
if entireSet:
for i in range(oS.m):
alphaPairsChanged += innerL(oS,i)
print("fullSet. iters:%d. alphaPairsChanged:%d"