目录
支持向量机
间隔与支持向量
SVM基本型
对偶问题
kkt条件
例子
对偶问题
例子
对偶问题原理解释
软间隔与正则化
替代损失函数
支持向量回归
例子
样本空间中任意点x到超平面的距离可写为:
与找到最大间隔,即可写成:
KKT条件(Karush-Kuhn-Tucker条件)是非线性优化问题的必要条件,通常用于解决包含约束条件的优化问题。它包括三个主要部分:
1)原问题的一阶导数为零,
2)松弛变量与约束条件的乘积为零(补充松弛性条件),
3)约束条件小于等于零。
最小化 f(x,y) = x^2 + y^2, 受约束 g(x,y) = x + y - 1 <= 0。
1)原问题的一阶导数为零:df/dx = 2x + λ = 0,df/dy = 2y + λ = 0;
2)补充松弛性条件:λ * g(x,y) = 0;
3)约束条件:g(x,y) = x + y - 1 <= 0。
从1)我们可以得到 x = -λ/2,y = -λ/2,代入约束条件得到 λ = -2。代入回原问题解得到x = y = 1。验证满足所有条件,这是最优解。
对偶问题是一种优化策略,用于解决难以直接解决的原始优化问题。原始问题的对偶问题可以提供原问题解的下界(最小化问题)或上界(最大化问题)。对偶问题在许多优化算法(如支持向量机和线性规划)中被广泛应用,因为它通常具有更简单的数学形式,更易于求解。如果问题满足一些条件(如凸性和约束条件),原问题和对偶问题的解会相等,称为强对偶性。
原始问题是:最小化 f(x) = x^2,满足条件 g(x) = x - 2 >= 0。
首先,构造拉格朗日函数L(x,λ) = f(x) - λg(x) = x^2 - λ(x - 2)。这里的λ是拉格朗日乘子,对应于约束g(x)。这个函数包含了原始问题的目标函数和约束,使得我们能够同时处理它们。
然后,我们构造对偶函数D(λ),它是拉格朗日函数L(x,λ)关于x的最小值。即,对于每个λ,找到最小化L(x,λ)的x。我们可以通过求解L(x,λ)的导数并令其等于零来找到这个x:2x - λ = 0,解出 x = λ / 2。然后,我们用x = λ / 2替换拉格朗日函数中的x,得到D(λ) = (λ/2)^2 - λ(λ/2 - 2) = -λ^2/2 + 2λ。
对偶问题是:最大化 D(λ)。即,找到使D(λ)最大的λ。我们可以通过求解D(λ)的导数并令其等于零来找到这个λ:-λ + 2 = 0,解出 λ = 2。
最后,我们将λ = 2带回原始问题,得到原始问题的解x = λ / 2 = 1。因此,原始问题的最小值是f(x) = (1)^2 = 1。
原始问题是寻找一个解来最小化目标函数。对于包含约束的最小化问题,我们可以构建拉格朗日函数,然后寻找使这个函数最小的值。然后,我们定义对偶函数,对偶函数是对于每个λ,拉格朗日函数的最小值。
然而,对于某些λ,对偶函数的值可能低于原问题的最优值。为什么会这样呢?这是因为拉格朗日函数包含了原问题的目标函数和约束。在满足所有约束的x值中,原问题的目标函数是有一个最小值的。而在所有x(可能并不满足所有约束)中,拉格朗日函数则可能找到一个更小的值。
对于所有可能的x(包括违反约束的x),在某些λ下,拉格朗日函数可能会比原问题的最优值还要小。这是因为λ * g(x)可能会使得拉格朗日函数减小,即使f(x)并未达到最小值。因此,对偶函数D(λ) = min_x{L(x, λ)}可能会给出一个小于原问题最优值的下界。而我们的目标是找到一个使这个下界尽可能大的λ,即求解max λ {D(λ)}。也就是使得对偶函数的值最大的λ。这就是为什么说对偶问题是寻找原问题最优值下界的最大化问题的原因。这样,我们就能找到最接近原问题最优值的下界,也就找到了原问题的一个近似解。
from sklearn.svm import SVR
from sklearn.model_selection import train_test_split
from sklearn.metrics import mean_squared_error
from sklearn.datasets import make_regression
import numpy as np
# 创建一个回归问题的数据集
X, y = make_regression(n_samples=100, n_features=1, noise=0.1)
# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 使用线性核函数创建一个支持向量回归模型
svr = SVR(kernel='linear', epsilon=0.1, C=1.0)
# 在训练集上训练模型
svr.fit(X_train, y_train)
# 在测试集上测试模型
y_pred = svr.predict(X_test)
# 计算并输出均方误差
mse = mean_squared_error(y_test, y_pred)
print('Mean squared error: ', mse)