支持向量机SMO代码实现
完整的实验代码在我的github上👉QYHcrossover/ML-numpy: 机器学习算法numpy实现 (github.com) 欢迎star⭐
本篇博客主要介绍支持向量机中的SMO算法,相较于上篇博客中利用二次规划工具求解的方法,SMO算法更为高效,能够处理更大规模的数据集。在这篇博客中,我们将会讲解SMO算法的原理、主要流程以及代码实现。SMO算法是一种基于启发式的方法,能够高效地求解支持向量机模型参数。我们将会讨论SMO算法的主要思想以及每一步的具体实现过程,并且提供Python代码实现,帮助读者更好地理解算法的实现细节。在下一节中,我们将会开始介绍SMO算法的原理和实现过程。
SMO算法原理
SMO算法是一种基于启发式的方法,用于求解支持向量机模型的参数。其核心思想是将大优化问题分解为多个小优化问题来求解。在这个过程中,每次选择两个变量进行优化,而将其他变量视为常数。这种方法可以减小每次优化的规模,从而提高算法的效率。
具体来说,SMO算法的每一步都会选取两个变量进行优化。这两个变量分别为违反KKT条件最严重的样本点,即第一个变量需要满足0<α< C,而第二个变量需要满足- C<α<0。通过求解这两个变量的最优值,可以更新对应的模型参数。
SMO算法流程
SMO算法的具体流程如下:
- 初始化α、b为0向量和0,选择第一个变量;
- 选择第二个变量,并通过内循环选择优化的变量;
- 通过解析公式计算新的α2;
- 对α2进行剪辑;
- 更新α1,α2,b;
- 如果满足停机条件,则退出循环;否则,继续进行优化。
上述流程中,第2步和第3步的内循环是SMO算法的关键部分,它可以通过启发式方法快速地选择需要优化的变量。
SMO算法代码实现
import numpy as np
from sklearn.datasets import make_blobs
import matplotlib.pyplot as plt
%matplotlib inline
from sklearn.datasets import make_gaussian_quantiles
X, y = make_gaussian_quantiles(n_samples=200, n_features=2, n_classes=2, mean=[1,2],cov=2,random_state=222)
plt.scatter(X[:, 0], X[:, 1], marker='o', c=y)
class SVM_SMO:
def __init__(self,C=1,sigma=1,max_iter=100000):
self.C = C
self.sigma = sigma
self.max_iter = max_iter
def _gaussian(self,x,z):
return np.exp(-0.5*np.sum((x-z)**2)/(sigma**2))
def _g(self,i):
return np.sum(self.alpha*self.y*self.K[i])+self.b
def _E(self,i):
return self._g(i) - self.y[i]
def _KKT(self,i):
y_g = self._g(i)*self.y[i]
if appro_equal(self.alpha[i],0):
return y_g >= 1
elif 0 < self.alpha[i] < self.C:
return appro_equal(y_g,1)
else:
return y_g <= 1
def fit(self,X,y):
self.alpha = np.random.rand(len(y))
self.b = 0
self.X = X
self.y = y
n_samples,n_features = X.shape
self.K = np.zeros([n_samples,n_samples