【模式识别与机器学习】L5 SVM支撑向量机
一、线性支撑向量机(找最大间隔分类面)
1.优化问题
原优化问题:maxw,bmargin(w,b)=minn=1..N1∥w∥yn(wTxn+b)max_{w,b}margin(w,b)=min_{n=1..N}\frac{1}{∥w∥}y_n(w^Tx_n+b)maxw,bmargin(w,b)=minn=1..N∥w∥1yn(wTxn+b)
约束条件:yn(wTxn+b)>0y_n(w^Tx_n+b)>0yn(wTxn+b)>0(所有样本正确分类)
经过尺度缩放简化后的优化问题:minw,b12wTwmin_{w,b}\frac{1}{2}w^Twminw,b21wTw s.t.yn(wTxn+b)≥1s.t.y_n(w^Tx_n+b)≥1s.t.yn(wTxn+b)≥1
2.支撑向量:满足 yn(wTxn+b)=1y_n(w^Tx_n+b)=1yn(wTxn+b)=1
二、对偶与核支撑向量机
规避高维难题:将原问题求解维度从d~\widetilde dd转为样本数量N
(一)对偶支撑向量机:简化求解过程
1.对偶转化
原问题:minw,bmaxαn≥0L(w,b,α)min_{w,b}max_{α_n≥0}L(w,b,α)minw,bmaxαn≥0L(w,b,α)
对偶问题:maxαn≥0minw,bL(w,b,α)max_{α_n≥0}min_{w,b}L(w,b,α)maxαn≥0minw,bL(w,b,α)
带约束优化转化为无约束优化问题:L(w,b,α)=12wTw+∑n=1Nαn[1−yn(wTxn+b)]L(w,b,α)=\frac{1}{2}w^Tw+∑_{n=1}^Nα_n[1−y_n(w^Tx_n+b)]L(w,b,α)=21wTw+∑n=1Nαn[1−yn(wTxn+b)]
2.求解
- ∂L∂b=−∑n=1Nαnyn=0\frac{∂L}{∂b}=−∑_{n=1}^Nα_ny_n=0∂b∂L=−∑n=1Nαnyn=0 → 约束∑n=1Nαnyn=0∑_{n=1}^Nα_ny_n=0∑n=1Nαnyn=0。
- ∂L∂w=w−∑n=1Nαnynxn=0\frac{∂L}{∂w}=w−∑_{n=1}^Nα_ny_nx_n=0∂w∂L=w−∑n=1Nαnynxn=0 →w=∑n=1Nαnynxnw=∑_{n=1}^Nα_ny_nx_nw=∑n=1Nαnynxn(w是支撑向量的线性组合)
- 将www表达式代入LLL,得到最终对偶问题:minα12∑n=1N∑m=1Nαnαmynym(xnTxm)−∑n=1Nαnmin_α\frac{1}{2}∑_{n=1}^N∑_{m=1}^Nα_nα_my_ny_m(x_n^Tx_m)−∑_{n=1}^Nα_nminα21∑n=1N∑m=1Nαnαmynym(xnTxm)−∑n=1Nαn 约束条件:∑n=1Nαnyn=0∑_{n=1}^Nα_ny_n=0∑n=1Nαnyn=0
- 通过互补松弛找支撑向量如αs>0α_s>0αs>0,再用支撑向量求b:b=ys−wTxsb=y_s−w^Tx_sb=ys−wTxs
3.KKT条件:最优解充要条件
- yn(wTxn+b)≥1y_n(w^Tx_n+b)≥1yn(wTxn+b)≥1(原问题可行,即所有样本满足约束条件)
- αn≥0α_n≥0αn≥0(错分样本对函数贡献非正)
- αn[1−yn(wTxn+b)]=0α_n[1−y_n(w^Tx_n+b)]=0αn[1−yn(wTxn+b)]=0(互补松弛)
- ∑n=1Nαnyn=0∑_{n=1}^Nα_ny_n=0∑n=1Nαnyn=0且w=∑n=1Nαnynxnw=∑_{n=1}^Nα_ny_nx_nw=∑n=1Nαnynxn(梯度为0)
(二)核支撑向量机:解决非线性问题
核函数K=ΦTΦK=Φ^TΦK=ΦTΦ对x做非线性变换
1.常用核函数
| 核函数类型 | 表达式 | 适用场景 |
|---|---|---|
| 线性核 | K(x,x′)=xTx′K(x,x′)=x^Tx′K(x,x′)=xTx′ | 线性可分数据(等价于线性 SVM) |
| 多项式核 | K(x,x′)=(ζ+γxTx′)QK(x,x′)=(ζ+γx^Tx′)^QK(x,x′)=(ζ+γxTx′)Q (γ>0,ζ≥0) | 低维非线性可分(如二次曲线分隔) |
| 高斯核(RBF) | K(x,x′)=exp(−γ∥x−x′∥2)K(x,x′)=exp(−γ∥x−x′∥^2)K(x,x′)=exp(−γ∥x−x′∥2) (γ>0,ζ≥0,Q为正整数) | 复杂非线性数据(无穷维映射,可拟合任意边界) |
2.分类预测
- 求解minα12∑n=1N∑m=1NαnαmynymK(xn,xm)−∑n=1Nαnmin_α\frac{1}{2}∑_{n=1}^N∑_{m=1}^Nα_nα_my_ny_mK(x_n,x_m)−∑_{n=1}^Nα_nminα21∑n=1N∑m=1NαnαmynymK(xn,xm)−∑n=1Nαn
- 求解后得:gSVM(x)=sign(∑SVαnynK(xn,x)+b)g_{SVM}(x)=sign(∑_{SV}α_ny_nK(x_n,x)+b)gSVM(x)=sign(∑SVαnynK(xn,x)+b),b=ys−∑SVαnynK(xn,x)b=y_s−∑_{SV}α_ny_nK(x_n,x)b=ys−∑SVαnynK(xn,x)
3.软间隔SVM:允许部分样本越界
- 松弛变量ξn≥0ξ_n≥0ξn≥0:ξn>0ξ_n>0ξn>0:样本越界;ξn>1ξ_n>1ξn>1:样本分错 惩罚参数C:C越大惩罚越界越重
- 目标函数:minw,b,ξ12wTw+C∑n=1Nξn,s.t.yn(wTxn+b)≥1−ξn(ξn≥0)min_{w,b,ξ}\frac{1}{2}w^Tw+C∑_{n=1}^Nξ_n,s.t.y_n(w^Tx_n+b)≥1−ξ_n(ξn≥0)minw,b,ξ21wTw+C∑n=1Nξn,s.t.yn(wTxn+b)≥1−ξn(ξn≥0)
- 对偶问题的目标函数:L(w,b,ξ,α,β)=12wTw+C∑n=1Nξn+∑n=1Nαn[1−ξn−yn(wTxn+b)]−∑n=1NβnξnL(w,b,ξ,α,β)=\frac{1}{2}w^Tw+C∑_{n=1}^Nξ_n+∑_{n=1}^Nα_n[1−ξ_n−y_n(w^Tx_n+b)]−∑_{n=1}^Nβ_nξ_nL(w,b,ξ,α,β)=21wTw+C∑n=1Nξn+∑n=1Nαn[1−ξn−yn(wTxn+b)]−∑n=1Nβnξn
- 支撑向量分类:
– 非支撑向量:an=0,ξn=0a_n = 0,ξ_n = 0an=0,ξn=0
– 边界支撑向量:0<an<C,ξ=00<a_n<C,ξ = 00<an<C,ξ=0
– 越界向量:an=C,ξn≥0a_n=C,ξ_n≥0an=C,ξn≥0
附录:
- Dual-SVM算法关键代码
# 构建二次规划问题
n_samples, n_features = X.shape
P = cvxopt.matrix(np.outer(y, y) * np.dot(X, X.T), tc='d')
q = cvxopt.matrix(-np.ones(n_samples), tc='d')
A = cvxopt.matrix(y.reshape(1, -1), tc='d')
b = cvxopt.matrix(np.zeros(1), tc='d')
G = cvxopt.matrix(-np.eye(n_samples), tc='d')
h = cvxopt.matrix(np.zeros(n_samples), tc='d')
# 求解二次规划
solution = cvxopt.solvers.qp(P, q, G, h, A, b)
# 提取结果
alpha = np.array(solution['x']).reshape(-1)
support_vectors = alpha > 1e-5
alpha_sv = alpha[support_vectors]
X_sv = X[support_vectors]
y_sv = y[support_vectors]
w = np.sum(alpha_sv.reshape(-1, 1) * y_sv.reshape(-1, 1) * X_sv, axis=0)
b = np.mean(y_sv - np.dot(X_sv, w))
- Kernel-SVM算法关键代码
# 定义高斯核函数
def gaussian_kernel(x1, x2, gamma=1.0):
return np.exp(-gamma * np.linalg.norm(x1 - x2)**2)
# 构建二次规划问题
n_samples, n_features = X.shape
P = cvxopt.matrix(np.outer(y, y) * np.array([[gaussian_kernel(xi, xj) for xj in X] for xi in X]), tc='d')
q = cvxopt.matrix(-np.ones(n_samples), tc='d')
A = cvxopt.matrix(y.reshape(1, -1), tc='d')
b = cvxopt.matrix(np.zeros(1), tc='d')
G = cvxopt.matrix(-np.eye(n_samples), tc='d')
h = cvxopt.matrix(np.zeros(n_samples), tc='d')
# 求解二次规划
solution = cvxopt.solvers.qp(P, q, G, h, A, b)
# 提取结果
alpha = np.array(solution['x']).reshape(-1)
support_vectors = alpha > 1e-5
alpha_sv = alpha[support_vectors]
X_sv = X[support_vectors]
y_sv = y[support_vectors]
# 计算 b
def predict(x):
return np.sum(alpha_sv * y_sv * np.array([gaussian_kernel(x, xi) for xi in X_sv]))
b = np.mean(y_sv - np.array([predict(xi) for xi in X_sv]))
更多推荐


所有评论(0)