一、线性支撑向量机(找最大间隔分类面)

1.优化问题
原优化问题:maxw,b​margin(w,b)=minn=1..N​1∥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..Nw1yn(wTxn+b)
约束条件:yn​(wTxn​+b)>0y_n​(w^Tx_n​+b)>0yn(wTxn+b)>0(所有样本正确分类)
经过尺度缩放简化后的优化问题:minw,b​12​wTwmin_{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​≥0​​L(w,b,α)min_{w,b}max_{α_n​≥0}​​L(w,b,α)minw,bmaxαn0​​L(w,b,α)
对偶问题:maxαn​≥0​minw,b​L(w,b,α)max_{α_n​≥0}​min_{w,b}​L(w,b,α)maxαn0minw,bL(w,b,α)
带约束优化转化为无约束优化问题:L(w,b,α)=12​wTw+∑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[1yn(wTxn+b)]
2.求解

  • ∂L∂b​=−∑n=1N​αn​yn​=0\frac{∂L}{∂b}​=−∑_{n=1}^N​α_n​y_n​=0bL=n=1Nαnyn=0 → 约束∑n=1N​αn​yn​=0∑_{n=1}^N​α_n​y_n​=0n=1Nαnyn=0
  • ∂L∂w=w−∑n=1N​αn​yn​xn​=0\frac{∂L}{∂w}=w−∑_{n=1}^N​α_n​y_n​x_n​=0wL=wn=1Nαnynxn=0w=∑n=1N​αn​yn​xnw=∑_{n=1}^N​α_n​y_n​x_nw=n=1Nαnynxn(w是支撑向量的线性组合)
  • www表达式代入LLL,得到最终对偶问题:minα1​2​∑n=1N​∑m=1N​αn​αm​yn​ym​(xnT​xm​)−∑n=1N​αn​min_α\frac{1}{​2}​∑_{n=1}^N​∑_{m=1}^N​α_n​α_m​y_n​y_m​(x_n^T​x_m​)−∑_{n=1}^N​α_n​minα​21n=1Nm=1Nαnαmynym(xnTxm)n=1Nαn 约束条件:∑n=1N​αn​yn​=0∑_{n=1}^N​α_n​y_n​=0n=1Nαnyn=0
  • 通过互补松弛找支撑向量如αs>0α_s>0αs>0,再用支撑向量求b:b=ys​−wTxsb=y_s​−w^Tx_sb=yswTxs

3.KKT条件:最优解充要条件

  • yn​(wTxn​+b)≥1y_n​(w^Tx_n​+b)≥1yn(wTxn+b)1(原问题可行,即所有样本满足约束条件)
  • αn​≥0α_n​≥0αn0(错分样本对函数贡献非正)
  • αn​[1−yn​(wTxn​+b)]=0α_n​[1−y_n​(w^Tx_n​+b)]=0αn[1yn(wTxn+b)]=0(互补松弛)
  • ∑n=1N​αn​yn​=0∑_{n=1}^N​α_n​y_n​=0n=1Nαnyn=0w=∑n=1N​αn​yn​xnw=∑_{n=1}^N​α_n​y_n​x_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(γxx2)
(γ>0,ζ≥0,Q为正整数)
复杂非线性数据(无穷维映射,可拟合任意边界)

2.分类预测

  • 求解minα​12​∑n=1N​∑m=1Nαn​αm​yn​ym​K(xn​,xm​)−∑n=1N​αn​min_α​\frac{1}{2}​∑_{n=1}^N​∑_{m=1}^Nα_n​α_m​y_n​y_m​K(x_n​,x_m​)−∑_{n=1}^N​α_n​minα21n=1Nm=1NαnαmynymK(xn,xm)n=1Nαn
  • 求解后得:gSVM​(x)=sign(∑SV​αn​yn​K(xn​,x)+b)g_{SVM}​(x)=sign(∑_{SV}​α_n​y_n​K(x_n​,x)+b)gSVM(x)=sign(SVαnynK(xn,x)+b),b=ys​−∑SV​αn​yn​K(xn​,x)b=y_s​−∑_{SV}​α_n​y_n​K(x_n​,x)b=ysSVαnynK(xn,x)

3.软间隔SVM:允许部分样本越界

  • 松弛变量ξn≥0ξ_n≥0ξn0ξn​>0ξ_n​>0ξn>0:样本越界;ξn​>1ξ_n​>1ξn>1:样本分错 惩罚参数C:C越大惩罚越界越重
  • 目标函数:minw,b,ξ1​2​wTw+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+Cn=1Nξn,s.t.yn(wTxn+b)1ξnξn0
  • 对偶问题的目标函数:L(w,b,ξ,α,β)=12​wTw+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+Cn=1Nξn+n=1Nαn[1ξnyn(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,ξn0

附录:

  1. 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))
  1. 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]))
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐