通用核岭回归拉格朗日一阶条件是否可使用Sympy求解
完全可以在通用核岭回归的设定下用SymPy推导一阶条件$\nabla L=0$的闭式解,以下是具体的思路和示例实现:
1. 优化问题形式
你提到的核岭回归优化目标标准形式如下:
$$L(\boldsymbol{w}) = \frac{1}{N}\sum_{i=1}^N \left(y_i - \boldsymbol{w}^T \boldsymbol{\phi}(x_i)\right)^2 + \lambda |\boldsymbol{w}|_2^2$$
其中$\boldsymbol{\phi}(x_i)$是输入$x_i$映射到高维特征空间的特征向量,$\lambda \geq 0$是正则化系数,$N$是样本总数。
2. SymPy推导示例
你可以选择按分量或者按矩阵符号两种方式推导,两种方式都可以得到正确的一阶条件解:
按分量推导的代码示例
import sympy as sp # 定义基础符号 N, lam = sp.symbols('N lambda', positive=True) d = sp.symbols('d', positive=True, integer=True) w = sp.IndexedBase('w', shape=(d, 1)) phi = sp.IndexedBase('phi', shape=(N, d)) y = sp.IndexedBase('y', shape=(N, 1)) i, j = sp.symbols('i j', integer=True, nonnegative=True) # 构造损失函数 loss = (1/N) * sp.Sum( (y[i] - sp.Sum(w[j] * phi[i, j], (j, 0, d-1)))**2, (i, 0, N-1) ) + lam * sp.Sum(w[j]**2, (j, 0, d-1)) # 对w的第j个分量求偏导,得到梯度分量 grad_wj = sp.diff(loss, w[j]) # 令梯度等于0得到方程并化简 eq = sp.Eq(grad_wj, 0) simplified_eq = sp.simplify(eq)
按矩阵符号推导的代码示例
这种写法更直观,也更符合常规的矩阵运算推导逻辑:
import sympy as sp N = sp.symbols('N', positive=True, integer=True) d = sp.symbols('d', positive=True, integer=True) lam = sp.symbols('lambda', positive=True) # 定义矩阵符号 Phi = sp.MatrixSymbol('Phi', N, d) y = sp.MatrixSymbol('y', N, 1) w = sp.MatrixSymbol('w', d, 1) # 构造矩阵形式的损失函数 loss = (1/N) * (y - Phi * w).T * (y - Phi * w) + lam * w.T * w # 对w求梯度 grad = sp.diff(loss, w) # 令梯度为0求解 eq = sp.Eq(grad, sp.zeros(d, 1)) w_sol = sp.solve(eq, w)[w]
3. 推导结果说明
运行上述代码化简后可以得到一阶条件的两个常用闭式解:
- 原空间解:$\boldsymbol{w} = \left(\boldsymbol{\Phi}^T \boldsymbol{\Phi} + N\lambda \boldsymbol{I}\right)^{-1} \boldsymbol{\Phi}^T \boldsymbol{y}$,其中$\boldsymbol{\Phi}$是所有样本特征向量拼成的$N \times d$矩阵
- 核形式解:引入表示定理令$\boldsymbol{w} = \boldsymbol{\Phi}^T \boldsymbol{\alpha}$代入一阶条件,可得到$\boldsymbol{\alpha} = \left(\boldsymbol{K} + N\lambda \boldsymbol{I}\right)^{-1} \boldsymbol{y}$,其中$\boldsymbol{K}$是$N \times N$的核矩阵,$K_{ij} = \boldsymbol{\phi}(x_i)^T \boldsymbol{\phi}(x_j)$
4. 注意事项
- 如果你的特征维度$d$或者样本量$N$设置得很大,纯符号推导的速度会变慢,这种情况建议你先固定维度和样本量数值再做推导
- 求解线性方程组时除了
sp.solve,也可以用sp.linsolve方法,针对线性方程的求解效率更高
内容的提问来源于stack exchange,提问作者math
相关产品推荐
相关产品推荐

