SMO是求解软间隔线性SVM(带核函数)的对偶问题的一种启发式算法,运算效率很高,大大推动了SVM算法的实际应用。
SMO算法的原理在之前的文章:支持向量机(SVM)凸二次规划的求解——序列最小最优化算法(SMO)原理及python实现有十分详细的介绍,这里直接展示代码
from sklearn import datasets
import matplotlib.pyplot as plt # 画图工具
import numpy as np
X, y = datasets.make_classification(n_samples=100, n_features=2, n_informative=2, n_redundant=0, n_repeated=0, n_classes=2, n_clusters_per_class=1, random_state=2)
for i in range(X.shape[0]):
if y[i] == 0:
y[i] = -1
#plt.scatter(X[:, 0], X[:, 1], c=y)
# plt.show()
class SMO:
def __init__(self, X, y, C, toler, maxIter): # samples labels constance tolerate maxIteration
self.X = X
self.y = y
self.C = C
self.toler = toler
self.maxIter = maxIter
self.N = self.X.shape[0]
self.b = 0
self.a = np.zeros(self.N)
self.K = np.zeros((self.N, self.N))
self.o = 0.5
for i in range(self.N):
for j in range(self.N):
t = 0
for k in range(self.X.shape[1]):
t += (self.X[i][k] - self.X[j][k])**2