已知正样本 x1=(1,2), x2=(2,3), x3=(3,3),负样本 x4=(2,1), x5 =(3,2)。试求最大间隔分离超平面和分类决策函数用求偏导方法解决
时间: 2025-07-05 19:09:26 浏览: 10
### 使用拉格朗日乘子法求解 SVM 的最大间隔分离超平面
为了找到能够最大化间隔的支持向量机(SVM)的分离超平面,可以采用拉格朗日乘数法构建并解决一个凸二次规划问题。具体来说,在给定的数据集中,正样本 \(x_1=(1,2)\),\(x_2=(2,3)\),\(x_3=(3,3)\),以及负样本 \(x_4=(2,1)\),\(x_5=(3,2)\)[^3]。
#### 定义目标函数和约束条件
SVM的目标是最小化权重向量 \(\mathbf{w}\) 的长度的一半 (\(0.5\|\mathbf{w}\|^2\)) 同时满足所有训练样本都正确分类的要求:
\[minimize_{\mathbf{w},b} \quad 0.5\|\mathbf{w}\|^2 \\ subject \ to \ y_i(\mathbf{w}^\top\mathbf{x}_i+b)-1=0,\ i=1,...,n.\]
这里,\(\mathbf{x}_i\) 表示第 \(i\) 个输入实例;\(y_i=\pm1\) 是对应的类别标签;而 \(b\) 则代表偏置项。
#### 应用拉格朗日乘子法转换成对偶形式
引入拉格朗日乘子 \(\alpha_i≥0\) 来处理上述不等式约束,则原问题转化为如下所示的标准形式:
\[L_D=\sum^n_{i=1}{α_i}-\frac{1}{2}\sum^n_{i,j=1}{y_iy_jα_iα_j<\mathbf{x}_i,\mathbf{x}_j>}\\ s.t.,\ α_i≥0,i=1,…,N;\ ∑^{N}_{i=1}α_iy_i=0\]
其中,<·>表示内积运算。此时我们只需要关注于调整这些拉格朗日系数{\(\alpha_i\)}使得新的目标函数达到最小值即可获得最优解[\(^3].
#### 计算 w 和 b
一旦得到了所有的 {\(\alpha_i\)}, 就可以通过下面两个公式分别计算出参数 \(\mathbf{w}\) 和 \(b\):
\[
\begin{aligned}
&\mathbf{w}=∑^N_{i=1}α_iy_i\mathbf{x}_i \\
&b=y_k-\mathbf{w}^\top\mathbf{x}_k,\ k=support\ vector
\end{aligned}
\]
注意这里的 \(k\) 需要选取支持向量之一作为参考点来确定具体的截距 \(b\) 值。
对于给出的具体例子而言,实际操作过程中还需要利用数值优化算法(比如SMO算法)去迭代更新各个 \(\alpha_i\) 直至收敛,并最终得出所需的线性分割面方程及其决策边界表达式。
```python
from cvxopt import matrix, solvers
import numpy as np
def linear_kernel(x1, x2):
return np.dot(x1, x2)
P = []
for i in range(len(X)):
row = []
for j in range(len(X)):
row.append(y[i]*y[j]*linear_kernel(X[i], X[j]))
P.append(row)
q = [-1]*len(X)
G = [[-1 if yi==-1 else 0 for _ in range(len(X))] for yi in Y]+[[1 if yi==1 else 0 for _ in range(len(X))] for yi in Y]
h = [0]*len(X)*2
A = [Y]
c = [0]
sol = solvers.qp(matrix(P),matrix(q),matrix(G),matrix(h),matrix(A).trans(),matrix(c))
alphas = list(sol['x'])
# Calculate weights and bias term based on alphas obtained from QP solver.
W = sum([a*y*x for a,x,y in zip(alphas,X,Y)])
support_vectors_idx = [idx for idx,val in enumerate(alphas) if val > tol]
if support_vectors_idx:
sv_index = support_vectors_idx[0]
B = Y[sv_index]-np.dot(W.T,X[sv_index])
else:
raise ValueError('No Support Vectors found.')
```
阅读全文
相关推荐



















