1 #Smooth Support Vector Machine之实现
2
3 importnumpy4 from matplotlib importpyplot as plt5
6
7 def spiral_point(val, center=(0, 0)):8 rn = 0.4 * (105 - val) / 104
9 an = numpy.pi * (val - 1) / 25
10
11 x0 = center[0] + rn *numpy.sin(an)12 y0 = center[1] + rn *numpy.cos(an)13 z0 = -1
14 x1 = center[0] - rn *numpy.sin(an)15 y1 = center[1] - rn *numpy.cos(an)16 z1 = 1
17
18 return(x0, y0, z0), (x1, y1, z1)19
20
21 defspiral_data(valList):22 dataList = list(spiral_point(val) for val invalList)23 data0 = numpy.array(list(item[0] for item indataList))24 data1 = numpy.array(list(item[1] for item indataList))25 returndata0, data126
27
28 #生成训练数据集
29 trainingValList = numpy.arange(1, 101, 1)30 trainingData0, trainingData1 =spiral_data(trainingValList)31 trainingSet =numpy.vstack((trainingData0, trainingData1))32 #生成测试数据集
33 testValList = numpy.arange(1.5, 101.5, 1)34 testData0, testData1 =spiral_data(testValList)35 testSet =numpy.vstack((testData0, testData1))36
37
38 classSSVM(object):39
40 def __init__(self, trainingSet, c=1, mu=1, beta=100):41 self.__trainingSet = trainingSet #训练集数据
42 self.__c = c #误差项权重
43 self.__mu = mu #gaussian kernel参数
44 self.__beta = beta #光滑化参数
45
46 self.__A, self.__D = self.__get_AD()47
48
49 defget_cls(self, x, alpha, b):50 A, D = self.__A, self.__D
51 mu = self.__mu
52
53 x = numpy.array(x).reshape((-1, 1))54 KAx = self.__get_KAx(A, x, mu)55 clsVal = self.__calc_hVal(KAx, D, alpha, b)56 if clsVal >=0:57 return 1
58 else:59 return -1
60
61
62 defget_accuracy(self, dataSet, alpha, b):63 '''
64 正确率计算65 '''
66 rightCnt =067 for row indataSet:68 clsVal = self.get_cls(row[:2], alpha, b)69 if clsVal == row[2]:70 rightCnt += 1
71 accuracy = rightCnt /dataSet.shape[0]72 returnaccuracy73
74
75 def optimize(self, maxIter=100, epsilon=1.e-9):76 '''
77 maxIter: 最大迭代次数78 epsilon: 收敛判据, 梯度趋于0则收敛79 '''
80 A, D = self.__A, self.__D
81 c = self.__c
82 mu = self.__mu
83 beta = self.__beta
84
85 alpha, b = self.__init_alpha_b((A.shape[1], 1))86 KAA = self.__get_KAA(A, mu)87
88 JVal = self.__calc_JVal(KAA, D, c, beta