【机器学习|学习笔记】最小二乘支持向量机(Least squares support vector machine,LS-SVM )详解,附代码。
【机器学习|学习笔记】最小二乘支持向量机(Least squares support vector machine,LS-SVM )详解,附代码。
文章目录
欢迎铁子们点赞、关注、收藏!
祝大家逢考必过!逢投必中!上岸上岸上岸!upupup
大多数高校硕博生毕业要求需要参加学术会议,发表EI或者SCI检索的学术论文会议论文。详细信息可关注VX “
学术会议小灵通
”或参考学术信息专栏:https://blog.csdn.net/2401_89898861/article/details/147567533
前言
- Least Squares Support Vector Machines (LS‑SVM) 是对经典支持向量机(SVM)的一种改进,通过将原本的二次规划问题转化为线性方程组求解,显著降低了计算复杂度并简化了模型训练过程。
- 它最早由 Johan A.K. Suykens 和 Joos Vandewalle 于1999年提出,并在随后的几十年中发展出稀疏化、迭代算法和多任务扩展等多种变体;
- 其核心在于用最小二乘代价替代传统 SVM 的铰链损失与不等式约束,从而通过求解线性系统获得模型参数,兼具核方法的非线性映射能力与最小二乘的闭式解优势。
- LS‑SVM 已广泛应用于分类、回归、故障检测、光谱分析等领域,并可通过 NumPy/Scipy 或专门工具箱高效实现。
以下将从起源、发展、原理、应用及 Python 代码实现五个方面详细阐述。
起源
- LS‑SVM 最早由 Suykens 和 Vandewalle 在 1999 年的论文 “Least squares support vector machine classifiers” 中提出,在同年发表于 Neural Processing Letters 上 。
- 他们的创新在于将 Vapnik 的 SVM 二次规划(QP)问题改写为带等式约束的最小二乘问题,从而可通过线性方程组求解 。
- 相比经典 SVM,LS‑SVM 通过引入误差平方和惩罚,既保留了核技巧带来的高维映射能力,又避免了 QP 求解的高昂成本。
发展
- 2002年,Suykens 等人在 World Scientific 出版了专著《Least Squares Support Vector Machines》,系统总结了 LS‑SVM 的理论与算法 。
- 为处理大规模数据,研究者提出基于共轭梯度的迭代训练算法(CG‑LS‑SVM),将一次性矩阵求逆替换为多次矩阵–向量乘法 。
- 针对高维稀疏场景,又出现了稀疏化 LS‑SVM(Sparse LS‑SVM),通过引入额外正则化或截断技术减少支持向量数量 。
- 学术界还研究了 LS‑SVM 与经典 SVM 之间的等价性,证明在一定条件下两者输出相同,强化了 LS‑SVM 在实际应用中的可信度 。
- 此外,多任务和一类 LS‑SVM(twin/one‑class LS‑SVM)等变体被提出,用于多输出和异常检测任务。
原理
优化目标
- LS‑SVM 将经典 SVM 的铰链损失与不等式约束:
- 替换为最小二乘损失与等式约束:
- 这里 e i e_i ei 为残差, γ γ γ 为正则化参数,其值相当于 C C C 的倒数。
拉格朗日与线性系统
- 构造拉格朗日函数并对 w , b , e w,b,e w,b,e 求偏导,可消除原始变量,最终得出线性方程组:
- 其中 Ω i j = K ( x i , x i ) Ω_{ij} =K(x_i,x_i) Ωij=K(xi,xi)为核矩阵, α α α 为拉格朗日乘子。
- 求解该系统即可同时得到偏置 b b b 和系数 α α α,预测时仅需计算 ∑ i α i K ( x , x i ) + b ∑_iα_i K(x,x_i)+b ∑iαiK(x,xi)+b。
核函数与正则化
- LS‑SVM 支持任意 Mercer 核,如 RBF、Polynomial、Sigmoid 等;核宽度和 γ γ γ 的选择可通过交叉验证或贝叶斯证据框架自动确定。
应用
- 近红外光谱分析:在化学成分预测中,LS‑SVM 避免了传统 SVM 的复杂 QP 求解,并在速度和精度上均优于 PLS 回归。
- 大规模回归:工业过程建模中,LS‑SVM 在样本量大时仍能保持与 SVM 相当的准确率,同时降低计算资源消耗。
- 多任务分类:Multi‑task Twin LS‑SVM 将共享信息引入多分类器训练,实现多场景并行识别。
- 水资源预测:利用 LS‑SVM 进行水量时间序列预测,在中长期趋势捕捉上优于 ARIMA 模型。
- 通用模式识别:在 UCI 基准数据集(Iris、Wine 等)上,LS‑SVM 与经典 SVM 和神经网络性能相当。
Python 代码实现
- 下面给出一个基于
NumPy/Scipy
的简易 LS‑SVM 分类器实现,并在 Iris 数据集上演示:
import numpy as np
from scipy.linalg import solve
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from scipy.spatial.distance import cdist
class LSSVM:
def __init__(self, kernel='rbf', gamma=1.0, sigma=1.0):
self.kernel = kernel
self.gamma = gamma # regularization parameter
self.sigma = sigma # RBF width
def _compute_kernel(self, X1, X2):
if self.kernel == 'rbf':
# Gaussian RBF kernel
d2 = cdist(X1, X2, 'sqeuclidean')
return np.exp(-d2 / (2 * self.sigma**2))
else:
raise ValueError("Unsupported kernel")
def fit(self, X, y):
N = X.shape[0]
# build kernel matrix Ω
Omega = self._compute_kernel(X, X)
# build linear system
A = np.block([
[0, np.ones((1, N))],
[np.ones((N,1)), Omega + np.eye(N)/self.gamma]
])
b = np.concatenate(([0], y))
# solve for [b; alpha]
sol = solve(A, b)
self.bias_ = sol[0]
self.alpha_ = sol[1:]
self.X_train = X
def predict(self, X):
K = self._compute_kernel(X, self.X_train)
y_pred = K.dot(self.alpha_) + self.bias_
return np.sign(y_pred)
# 演示
data = load_iris()
X, y = data.data[y:= (data.target != 0).astype(int)], (data.target[y] > 0).astype(int)*2-1
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
scaler = StandardScaler().fit(X_train)
X_train_s = scaler.transform(X_train)
X_test_s = scaler.transform(X_test)
model = LSSVM(gamma=10.0, sigma=1.0)
model.fit(X_train_s, y_train)
y_pred = model.predict(X_test_s)
acc = np.mean(y_pred == y_test)
print(f"Iris 测试集准确率: {acc:.4f}")
- 此代码实现了 LS‑SVM 的核心步骤:构造核矩阵、组装线性系统并求解、基于核展开进行预测。用户可通过调整
gamma
和
sigma
,或替换核函数,满足不同场景需求。