Skip to content

Commit b4d613f

Browse files
simple smo in svm
1 parent 5957a48 commit b4d613f

3 files changed

Lines changed: 221 additions & 43 deletions

File tree

.idea/workspace.xml

Lines changed: 52 additions & 43 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

SVM/SVM.py

Lines changed: 69 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,69 @@
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

Comments
 (0)