赞
踩
支持向量机(Support Vecor Machine, SVM)本身是一个二元分类算法,是对感知器算法模型的一种扩展,现在的SVM算法支持线性分类和非线性分类的分类应用,并且也能够直接将SVM应用于回归应用中 。我们也可以将SVM应用在多元分类领域中。
拉格朗日乘子法就是当我们的优化函数存在等值约束的情况下的一种最优化求解方式;其中参数α被称为拉格朗日乘子,要求α不等于0。
在优化问题中,目标函数f(x)存在多种形式,如果目标函数和约束条件都为变量x的线性函数,则称问题为线性规划;如果目标函数为二次函数,则称最优化问题为二次规划;如果目标函数或者约束条件为非线性函数,则称最优化问题为非线性优化。每个线性规划问题都有一个对应的对偶问题。
对偶问题具有以下几个特性:
KKT条件是泛拉格朗日乘子法的一种形式;主要应用在当我们的优化函数存在不等值约束的情况下的一种最优化求解方式;KKT条件即满足不等式约束情况下的条件
min
x
f
(
x
)
s.t
:
h
k
(
x
)
=
0
,
k
=
1
,
2
,
…
,
p
g
j
(
x
)
≤
0
,
j
=
1
,
2
,
…
,
q
L
(
x
,
α
,
β
)
=
f
(
x
)
+
∑
i
=
1
p
α
i
h
i
(
x
)
+
∑
i
=
1
q
β
i
g
i
(
x
)
;
α
i
≠
0
,
β
i
≥
0
min
x
L
(
x
,
α
,
β
)
\min _{x} f(x) \\ \text { s.t }: h_{k}(x)=0, k=1,2, \ldots, p \\ g_{j}(x) \leq 0, j=1,2, \ldots, q \\ L(x, \alpha, \beta)=f(x)+\sum_{i=1}^{p} \alpha_{i} h_{i}(x)+\sum_{i=1}^{q} \beta_{i} g_{i}(x) ; \alpha_{i} \neq 0, \beta_{i} \geq 0 \\ \min _{x} L(x, \alpha, \beta)
xminf(x) s.t :hk(x)=0,k=1,2,…,pgj(x)≤0,j=1,2,…,qL(x,α,β)=f(x)+i=1∑pαihi(x)+i=1∑qβigi(x);αi=0,βi≥0xminL(x,α,β)
可行解必须在约束区域g(x)之内,由图可知可行解x只能在g(x)<0和g(x)=0的区域取得.
当可行解在约束内部区域的时候,令β=0即可消去约束
考虑二分类问题,y的值为+1、-1
如果数据线性不可分,加上松弛因子
ξ
≥
0
\xi \geq 0
ξ≥0,让函数加上松弛因子大于等于1,修改后的约束条件变为:
y
i
(
w
⋅
x
i
+
b
)
≥
1
−
ξ
i
y_i(w \cdot x_i+b) ≥ 1-\xi_i
yi(w⋅xi+b)≥1−ξi
目标函数修改为:
min
w
,
b
1
2
∥
w
∥
2
+
C
∑
i
=
1
N
ξ
i
min
w
,
b
,
ξ
1
2
∥
w
∥
2
+
C
∑
i
=
1
N
ξ
i
s.t.
y
i
(
w
⋅
x
i
+
b
)
≥
1
−
ξ
i
,
i
=
1
,
2
,
⋯
,
n
ξ
i
≥
0
,
i
=
1
,
2
,
⋯
,
n
\min _{w, b} \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N} \xi_{i} \\ \min _{w, b, \xi} \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{N} \xi_{i} \\ \text { s.t. } \quad y_{i}\left(w \cdot x_{i}+b\right) \geq 1-\xi_{i}, \quad i=1,2, \cdots, n \\ \quad \xi_{i} \geq 0, \quad i=1,2, \cdots, n
w,bmin21∥w∥2+Ci=1∑Nξiw,b,ξmin21∥w∥2+Ci=1∑Nξi s.t. yi(w⋅xi+b)≥1−ξi,i=1,2,⋯,nξi≥0,i=1,2,⋯,n
拉格朗日函数为:
L
(
w
,
b
,
ξ
,
α
,
μ
)
≡
1
2
∥
w
∥
2
+
C
∑
i
=
1
n
ξ
i
−
∑
i
=
1
n
α
i
(
y
i
(
w
⋅
x
i
+
b
)
−
1
+
ξ
i
)
−
∑
i
=
1
n
μ
i
ξ
i
L(w, b, \xi, \alpha, \mu) \equiv \frac{1}{2}\|w\|^{2}+C \sum_{i=1}^{n} \xi_{i}-\sum_{i=1}^{n} \alpha_{i}\left(y_{i}\left(w \cdot x_{i}+b\right)-1+\xi_{i}\right)-\sum_{i=1}^{n} \mu_{i} \xi_{i}
L(w,b,ξ,α,μ)≡21∥w∥2+Ci=1∑nξi−i=1∑nαi(yi(w⋅xi+b)−1+ξi)−i=1∑nμiξi
对参数求偏导得:
∂
L
∂
w
=
0
⇒
w
=
∑
i
=
1
n
α
i
y
i
ϕ
(
x
n
)
∂
L
∂
b
=
0
⇒
0
=
∑
i
=
1
n
α
i
y
i
∂
L
∂
ξ
=
0
⇒
C
−
α
i
−
μ
i
=
0
\frac{\partial L}{\partial w}=0 \Rightarrow w=\sum_{i=1}^{n} \alpha_{i} y_{i} \phi\left(x_{n}\right) \\ \frac{\partial L}{\partial b}=0 \Rightarrow 0=\sum_{i=1}^{n} \alpha_{i} y_{i} \\ \frac{\partial L}{\partial \xi}=0 \Rightarrow C-\alpha_{i}-\mu_{i}=0
∂w∂L=0⇒w=i=1∑nαiyiϕ(xn)∂b∂L=0⇒0=i=1∑nαiyi∂ξ∂L=0⇒C−αi−μi=0
代入L中,得:
m
i
n
w
,
b
ξ
L
(
w
,
b
,
ξ
,
α
,
μ
)
=
−
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
(
x
i
⋅
x
j
)
+
∑
i
=
1
n
α
i
min_{w,b\xi} L(w, b, \xi, \alpha, \mu)=-\frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_i \alpha_j y_i y_j (x_i \cdot x_j)+\sum_{i=1}^{n}\alpha_i
minw,bξL(w,b,ξ,α,μ)=−21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)+i=1∑nαi
求
α
\alpha
α极大值转化为:
min
α
1
2
∑
i
=
1
n
∑
j
=
1
n
α
i
α
j
y
i
y
j
(
x
i
⋅
x
j
)
−
∑
i
=
1
n
α
i
s.t.
∑
i
=
1
n
α
i
y
i
=
0
0
≤
α
i
≤
C
,
i
=
1
,
2
,
…
,
n
\min _{\alpha} \frac{1}{2} \sum_{i=1}^{n} \sum_{j=1}^{n} \alpha_{i} \alpha_{j} y_{i} y_{j}\left(x_{i} \cdot x_{j}\right)-\sum_{i=1}^{n} \alpha_{i} \\ \text { s.t. } \sum_{i=1}^{n} \alpha_{i} y_{i}=0 \\ 0 \leq \alpha_{i} \leq C, \quad i=1,2, \ldots, n
αmin21i=1∑nj=1∑nαiαjyiyj(xi⋅xj)−i=1∑nαi s.t. i=1∑nαiyi=00≤αi≤C,i=1,2,…,n
对等值约束求最优解
α
\alpha
α
import pandas as pd import numpy as np from sklearn.preprocessing import LabelEncoder from sklearn.svm import SVC # SVM分类包 from sklearn.model_selection import train_test_split from sklearn.metrics import accuracy_score import matplotlib as mpl import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') data = pd.read_csv(r'..\datas\iris.txt', header=None) x = data.iloc[:, :2] y = data.iloc[:, -1:] label = LabelEncoder() y = label.fit_transform(y) x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.3) # 惩罚项系数, 高斯核函数进行处理 gamma=20 clf = SVC(C=0.8, kernel='rbf', gamma=20, decision_function_shape='ovr') clf.fit(x_train, y_train.ravel()) y_train_hat = clf.predict(x_train) print(accuracy_score(y_train, y_train_hat)) y_test_hat = clf.predict(x_test) print(accuracy_score(y_test, y_test_hat)) iris_feature = '花萼长度', '花萼宽度', '花瓣长度', '花瓣宽度' x1_min, x1_max = x.iloc[:, 0].min(), x.iloc[:, 0].max() # 第0列的范围 x2_min, x2_max = x.iloc[:, 1].min(), x.iloc[:, 1].max() # 第1列的范围 x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j] # 生成网格采样点 grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点 Z = clf.decision_function(grid_test) # 样本到决策面的距离 print(Z) grid_hat = clf.predict(grid_test) # 预测分类值 print(grid_hat) #可视化 grid_hat = grid_hat.reshape(x1.shape) # 使之与输入的形状相同 mpl.rcParams['font.sans-serif'] = [u'SimHei'] mpl.rcParams['axes.unicode_minus'] = False cm_light = mpl.colors.ListedColormap(['#A0FFA0', '#FFA0A0', '#A0A0FF']) cm_dark = mpl.colors.ListedColormap(['g', 'r', 'b']) x1_min, x1_max = x.iloc[:, 0].min(), x.iloc[:, 0].max() # 第0列的范围 x2_min, x2_max = x.iloc[:, 1].min(), x.iloc[:, 1].max() # 第1列的范围 x1, x2 = np.mgrid[x1_min:x1_max:500j, x2_min:x2_max:500j] # 生成网格采样点 grid_test = np.stack((x1.flat, x2.flat), axis=1) # 测试点 plt.pcolormesh(x1, x2, grid_hat, cmap=cm_light) plt.scatter(x.iloc[:, 0], x.iloc[:, 1], c=y, edgecolors='k', s=50, cmap=cm_dark) # 样本 plt.scatter(x_test.iloc[:, 0], x_test.iloc[:, 1], s=120, facecolors='none', zorder=10) # 圈中测试集样本 plt.xlabel(iris_feature[0], fontsize=13) plt.ylabel(iris_feature[1], fontsize=13) plt.xlim(x1_min, x1_max) plt.ylim(x2_min, x2_max) plt.title(u'鸢尾花SVM二特征分类', fontsize=15) plt.grid() plt.show()
import numpy as np from sklearn.svm import SVR # svm做回归的包 import matplotlib.pyplot as plt import warnings warnings.filterwarnings('ignore') N = 50 np.random.seed(0) #进行排序处理, 为了后期画图 x = np.sort(np.random.uniform(0, 6, N), axis=0) y = 2*np.sin(x) + 0.1*np.random.randn(N)# 加噪声 x = x.reshape(-1, 1) #高斯核svm回归 svr_rbf = SVR(kernel='rbf', gamma=0.2, C=100) svr_rbf.fit(x, y) #线性核svm回归 svr_linear = SVR(kernel='linear', C=100) svr_linear.fit(x, y) #多项式核svm回归 提升维度3 svr_poly = SVR(kernel='poly', degree=3, C=100) svr_poly.fit(x, y) x_test = np.linspace(x.min(), 1.2*x.max(), 100).reshape(-1, 1) y_rbf = svr_rbf.predict(x_test) y_linear = svr_linear.predict(x_test) y_poly = svr_poly.predict(x_test) #可视化 plt.rcParams['font.sans-serif'] = [u'SimHei'] plt.rcParams['axes.unicode_minus'] = False plt.figure(figsize=(9, 8), facecolor='w') plt.plot(x_test, y_rbf, 'r-', linewidth=2, label='高斯核') plt.plot(x_test, y_linear, 'g-', linewidth=2, label='线性核') plt.plot(x_test, y_poly, 'b-', linewidth=2, label='多项式核') plt.plot(x, y, 'mo', markersize=6) plt.scatter(x[svr_rbf.support_], y[svr_rbf.support_], s=130, c='r', marker='*', label='高斯核支持向量') plt.legend(loc='lower left') plt.title('SVR', fontsize=16) plt.xlabel('X') plt.ylabel('Y') plt.grid(True) plt.show()
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。