第8节-核技法、软间隔分类和SMO算法

本篇博客详细介绍了SVM的支持向量机原理,包括直观理解、函数间隔与几何间隔的概念。并通过最大间隔分类和对偶问题进一步深入探讨,同时提到了核技法、软间隔分类器及SMO算法等内容。

  NG的第7个视频讲的最大间隔分类和对偶问题。关于SVM,NG用了三个视频才将所有的知识点讲完。本节只是介绍核技法、软间隔分类器、SMO算法。第一个视频讲解SVM直观介绍,函数间隔和几何间隔。第二个视频讲解最大间隔分类和对偶问题。个人觉得NG的SVM视频和讲义逻辑很清晰,国内的大部分博客和书本都会参照NG的思路来讲SVM。









间隔支持向量机的方法可以使用修改后的SMO算法来实现。SMO算法是一种用于求解支持向量机的优化算法,可以通过修改核函数来实现间隔支持向量机。 下面是一个使用径向基核函数实现间隔支持向量机的SMO算法示例代码: ``` python import numpy as np class SVM: def __init__(self, kernel='rbf', C=1, tol=1e-3, max_iter=100, gamma='auto'): self.kernel = kernel self.C = C self.tol = tol self.max_iter = max_iter self.gamma = gamma def fit(self, X, y): self.X = X self.y = y self.alpha = np.zeros(len(X)) self.b = 0 self._kernel_matrix = self._calculate_kernel_matrix(X) for _ in range(self.max_iter): alpha_prev = np.copy(self.alpha) for i in range(len(X)): j = self._get_random_index(i) x_i, x_j, y_i, y_j = X[i], X[j], y[i], y[j] k_ij = self._kernel_matrix[i, i] + self._kernel_matrix[j, j] - 2 * self._kernel_matrix[i, j] if k_ij == 0: continue alpha_i, alpha_j = self.alpha[i], self.alpha[j] L = max(0, alpha_j - alpha_i) if y_i != y_j else max(0, alpha_i + alpha_j - self.C) H = min(self.C, self.C + alpha_j - alpha_i) if y_i != y_j else min(self.C, alpha_i + alpha_j) E_i = self._calculate_error(i) E_j = self._calculate_error(j) eta = 2 * k_ij - self._kernel_matrix[i, i] - self._kernel_matrix[j, j] if eta >= 0: continue alpha_j -= y_j * (E_i - E_j) / eta alpha_j = max(alpha_j, L) alpha_j = min(alpha_j, H) if abs(alpha_j - alpha_prev[j]) < self.tol: continue alpha_i += y_i*y_j*(alpha_prev[j] - alpha_j) b1 = self.b - E_i - y_i*(alpha_i - alpha_prev[i])*self._kernel_matrix[i, i] - y_j*(alpha_j - alpha_prev[j])*self._kernel_matrix[i, j] b2 = self.b - E_j - y_i*(alpha_i - alpha_prev[i])*self._kernel_matrix[i, j] - y_j*(alpha_j - alpha_prev[j])*self._kernel_matrix[j, j] if 0 < alpha_i and alpha_i < self.C: self.b = b1 elif 0 < alpha_j and alpha_j < self.C: self.b = b2 else: self.b = (b1 + b2) / 2 self.alpha[i], self.alpha[j] = alpha_i, alpha_j if np.linalg.norm(self.alpha - alpha_prev) < self.tol: break def predict(self, X): k = self._calculate_kernel_matrix(X, self.X) return np.sign(k.dot(self.alpha * self.y) + self.b) def _calculate_error(self, i): return self.predict([self.X[i]]) - self.y[i] def _get_random_index(self, i): j = i while j == i: j = np.random.randint(len(self.X)) return j def _calculate_kernel_matrix(self, X, Y=None): if self.kernel == 'linear': if Y is None: return X.dot(X.T) else: return X.dot(Y.T) elif self.kernel == 'rbf': if self.gamma == 'auto': self.gamma = 1 / X.shape[1] if Y is None: K = np.zeros((X.shape[0], X.shape[0])) for i, x_i in enumerate(X): for j, x_j in enumerate(X): K[i, j] = np.exp(-self.gamma * np.linalg.norm(x_i - x_j) ** 2) else: K = np.zeros((X.shape[0], Y.shape[0])) for i, x_i in enumerate(X): for j, y_j in enumerate(Y): K[i, j] = np.exp(-self.gamma * np.linalg.norm(x_i - y_j) ** 2) return K else: raise ValueError('Invalid kernel') ``` 在上面的代码中,我们使用了SMO算法来训练间隔支持向量机,并使用径向基核函数实现了方法。需要注意的是,在径向基核函数中,我们使用了自动计算gamma的方法,即gamma取特征数的倒数。在实际应用中,需要根据具体的问题进行调整。 另外,需要注意的是,上述代码实现的是二分类问题的间隔支持向量机,如果需要处理多类别问题,可以使用多类别支持向量机或者一对多的方法来实现。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值