01 支持向量机思想
02 支持向量机背后的最优化问题
2.1 点到直线距离
2.2 限定条件的最优化问题
2.3 目标函数
03 𝑺𝒐𝒇𝒕 𝑴𝒂𝒓𝒈𝒊𝒏 𝑺𝑽𝑴
3.1 𝑆𝑜𝑓𝑡 𝑀𝑎𝑟𝑔𝑖𝑛 𝑆𝑉𝑀 概念
3.1 𝑆𝑜𝑓𝑡 𝑀𝑎𝑟𝑔𝑖𝑛 𝑆𝑉𝑀 推导
04 𝒔𝒌𝒍𝒆𝒂𝒓𝒏 中的支持向量机
4.1 案例分析
05 非线性 𝑺𝑽𝑴 分类
5.2 案例分析
06 多项式核函数
6.1 学习的对偶算法
6.2 核函数
6.3 多项式核函数
6.4 通过核函数方式使 SVM 处理非线性问题
07 高斯核函数
7.1 高斯核函数
7.2 多项式核函数“升维”原理
7.3 高斯核函数“升维”原理
7.4 模拟高斯核函数“升维”原理
7,5 超参数 𝛾
08 𝒔𝒌𝒍𝒆𝒂𝒓𝒏 中的支持向量机(高斯核函数)
8.1 案例分析 8.2 参数调整
09 𝑺𝑽𝑴 思想解决回归问题
9.1 回归事项
9.2 案例分析
9.3 参数调整
04 中的支持向量机
import numpy as np
from matplotlib import pyplot as plt
from sklearn import datasets
# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data
y = iris.target
# 我们暂时只处理二分类的问题,所以只取y=0和1,即y<2
# 同时为了方便可视化,我们只取前两个特征,即:2
X = X[y<2,:2]
y= y[y<2]
# 绘制鸢尾花数据集
plt.scatter(X[y==0,0],X[y==0,1],color='r')
plt.scatter(X[y==1,0],X[y==1,1],color='g')
plt.show()
# 使用SVM算法进行分类
# 首先需要进行数据标准
from sklearn.preprocessing import StandardScaler
standardscaler = StandardScaler()
standardscaler.fit(X)
X_standard = standardscaler.transform(X)
# 第1组数据,参数C特别大,1e9
# 调用SVM算法(线性SVM),SVC中的C是classifier的意思
from sklearn.svm import LinearSVC
# 传入参数C,这个C就是正则项前面的系数,取值越大他就越倾向是一样hard margin SVM
svc = LinearSVC(C=1e9)
svc.fit(X_standard,y)
LinearSVC(C=1000000000.0, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)
然后调用方法:
实例化对象创建分类器:
在中,传入参数,它指的是最小化方程中的,当参数趋于无穷大时,为了求最小,只能使为0。也就是说由变成。换句话说,当越大时,我们的容错能力越小。
下面我们画出决策边界:
# 函数(画决策边界)定义
def plot_decision_boundary(model,axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])
plt.contourf(x0, x1, zz, linewidth='5',cmap=custom_cmap)
# 绘制决策边界
plot_decision_boundary(svc,axis=[-3,3,-3,3])
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='r')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='g')
plt.show()
接下来,我们继续调整参数,由调整为,看看决策边界有何变化。
# 第2组数据,参数C特别小,0.01
# 调用SVM算法(线性SVM),SVC中的C是classifier的意思
from sklearn.svm import LinearSVC
# 传入参数C,这个C就是正则项前面的系数,取值越大他就越倾向是一样hard margin SVM
svc2 = LinearSVC(C=0.01)
svc2.fit(X_standard,y)
LinearSVC(C=0.01, class_weight=None, dual=True, fit_intercept=True,
intercept_scaling=1, loss='squared_hinge', max_iter=1000,
multi_class='ovr', penalty='l2', random_state=None, tol=0.0001,
verbose=0)
# 绘制决策边界
plot_decision_boundary(svc2,axis=[-3,3,-3,3])
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='r')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='g')
plt.show()
由上图可以看到,有一个红色的点被划到蓝色点的范围内,那么我们知道这都是因为中加了宽松量的缘故。这就说明当参数越小,我们的容错能力越大。换句话说,通过牺牲容错能力得到更好的泛化能力。
下面我们绘制出支持向量直线,在上一节,我们知道决策边界以及上下支撑向量构成的直线的公式分别是:
决策边界:
上支持向量直线:
下支持向量直线:
那么在鸢尾花的示例中,如何来求这三条直线呢?以决策边界直线为例,和b其实就是特征系数和截距:
# 观察两个决策边界图,当C=0.01时,有一个红色点被错误分类到绿色中
# 这说明C越小,我们的容错能力越大
# 查看系数
svc.coef_
array([[ 4.0324376 , -2.49295326]])
# 查看截距
svc.intercept_
array([0.95364924])
下面绘制支持向量直线,由于在鸢尾花的示例中,特征向量只有两个,以上支持向量直线为例,从而可知:
同理可知下支持向量直线:
# 下面我们绘制出margin那个图像,修改我们的绘图函数
def plot_svc_decision_boundary(model,axis):
x0, x1 = np.meshgrid(
np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) * 100)).reshape(-1, 1),
np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) * 100)).reshape(-1, 1),
)
X_new = np.c_[x0.ravel(), x1.ravel()]
y_predict = model.predict(X_new)
zz = y_predict.reshape(x0.shape)
from matplotlib.colors import ListedColormap
custom_cmap = ListedColormap(['#EF9A9A', '#FFF59D', '#90CAF9'])
plt.contourf(x0, x1, zz, linewidth='5',cmap=custom_cmap)
w = model.coef_[0]
b = model.intercept_[0]
# 我们决策边界的那条线就是w0*x0+w1*x1+b=0
# 我们将函数变化一下:x1 = -w0/x1 * x0 - b/w1,每给出一个x0就能求出x1
# 但是对于上下两个边界,w0*x0+w1*x1+b分别等于1和-1,所以同理变化
plot_x = np.linspace(axis[0],axis[1],200)
up_y = -w[0]/w[1] * plot_x -b/w[1] +1/w[1]
down_y = -w[0]/w[1] * plot_x -b/w[1] -1/w[1]
# 但up_y和down_y有可能超过plot_svc_decision_boundary函数中的axis,所以做一个限定
up_index = (up_y>=axis[2])&(up_y<=axis[3])
down_index = (down_y>=axis[2])&(down_y<=axis[3])
# 绘制图像
plt.plot(plot_x[up_index],up_y[up_index],color='black')
plt.plot(plot_x[down_index],down_y[down_index],color='black')
下面绘制决策边界、上、下支持向量直线。
# 绘制边界和上下边界图像
plot_svc_decision_boundary(svc,axis=[-3,3,-3,3])
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='r')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='g')
plt.show()
在图像中,这两个黑线部分就是区域,上边界有3个数据点落在上面,下边界有2个点落在上面,这个就是我们的支持向量。
由于我们使用的是,即当的方法,因此在区域内没有任何其他数据点。下面传入,即当的方法,看看支持向量直线如何变化。
# 这两个黑线部分就是margin区域
# 上边界有3个数据点落在上面,下边界有2个点落在上面,这个就是我们的支撑向量
# 由于上传的svc,即hard margin SVM,所以在margin区域内没有任何其他数据点
# 下面传入svc2时的图像
# 绘制边界和上下边界图像
plot_svc_decision_boundary(svc2,axis=[-3,3,-3,3])
plt.scatter(X_standard[y==0,0],X_standard[y==0,1],color='r')
plt.scatter(X_standard[y==1,0],X_standard[y==1,1],color='g')
plt.show()
从上图中可以看出,区域内有很多点,这说明相比之前的,增加了不少宽松量。