1+ from numpy import *
2+
3+ def loadDataSet (fileName ):
4+ dataMat = []; labelMat = []
5+ fr = open (fileName )
6+ for line in fr .readlines ():
7+ lineArr = line .strip ().split ('\t ' )
8+ dataMat .append ([float (lineArr [0 ]), float (lineArr [1 ])])
9+ labelMat .append (float (lineArr [2 ]))
10+ return dataMat , labelMat
11+
12+ # SMO算法随机选择两个alpha的下标
13+ def selectJrand (i , m ):
14+ j = i
15+ while (j == i ):
16+ j = int (random .uniform (0 , m ))
17+ return j
18+
19+ def clipAlpha (aj , H , L ):
20+ if aj > H :
21+ aj = H
22+ if L > aj :
23+ aj = L
24+ return aj
25+
26+ def smoSimple (dataMatIn , classLabels , C , toler , maxIter ):
27+ dataMatrix = mat (dataMatIn ); labelMat = mat (classLabels ).transpose ()
28+ b = 0 ; m ,n = shape (dataMatrix )
29+ alphas = mat (zeros ((m ,1 )))
30+ iter = 0
31+ while (iter < maxIter ):
32+ alphaPairsChanged = 0
33+ for i in range (m ):
34+ fXi = float (multiply (alphas ,labelMat ).T * (dataMatrix * dataMatrix [i ,:].T )) + b
35+ Ei = fXi - float (labelMat [i ])
36+ if ((labelMat [i ]* Ei < - toler ) and (alphas [i ] < C )) or ((labelMat [i ]* Ei > toler ) and (alphas [i ] > 0 )):
37+ j = selectJrand (i ,m )
38+ fXj = float (multiply (alphas ,labelMat ).T * (dataMatrix * dataMatrix [j ,:].T )) + b
39+ Ej = fXj - float (labelMat [j ])
40+ alphaIold = alphas [i ].copy (); alphaJold = alphas [j ].copy ();
41+ if (labelMat [i ] != labelMat [j ]):
42+ L = max (0 , alphas [j ] - alphas [i ])
43+ H = min (C , C + alphas [j ] - alphas [i ])
44+ else :
45+ L = max (0 , alphas [j ] + alphas [i ] - C )
46+ H = min (C , alphas [j ] + alphas [i ])
47+ if L == H : print ("L==H" ); continue
48+ eta = 2.0 * dataMatrix [i ,:]* dataMatrix [j ,:].T - dataMatrix [i ,:]* dataMatrix [i ,:].T - dataMatrix [j ,:]* dataMatrix [j ,:].T
49+ if eta >= 0 : print ("eta>=0" ); continue
50+ alphas [j ] -= labelMat [j ]* (Ei - Ej )/ eta
51+ alphas [j ] = clipAlpha (alphas [j ],H ,L )
52+ if (abs (alphas [j ] - alphaJold ) < 0.00001 ): print ("j not moving enough" ); continue
53+ alphas [i ] += labelMat [j ]* labelMat [i ]* (alphaJold - alphas [j ])
54+ b1 = b - Ei - labelMat [i ]* (alphas [i ]- alphaIold )* dataMatrix [i ,:]* dataMatrix [i ,:].T - labelMat [j ]* (alphas [j ]- alphaJold )* dataMatrix [i ,:]* dataMatrix [j ,:].T
55+ b2 = b - Ej - labelMat [i ]* (alphas [i ]- alphaIold )* dataMatrix [i ,:]* dataMatrix [j ,:].T - labelMat [j ]* (alphas [j ]- alphaJold )* dataMatrix [j ,:]* dataMatrix [j ,:].T
56+ if (0 < alphas [i ]) and (C > alphas [i ]): b = b1
57+ elif (0 < alphas [j ]) and (C > alphas [j ]): b = b2
58+ else : b = (b1 + b2 )/ 2.0
59+ alphaPairsChanged += 1
60+ print ("iter: %d i:%d, pairs changed %d" % (iter ,i ,alphaPairsChanged ))
61+ if (alphaPairsChanged == 0 ): iter += 1
62+ else : iter = 0
63+ print ("iteration number: %d" % iter )
64+ return b , alphas
65+
66+
67+ dataArr , labelArr = loadDataSet ('testSet.txt' )
68+ b , alphas = smoSimple (dataArr , labelArr , 0.6 , 0.001 , 40 )
69+ print (b )
0 commit comments