核心内容摘要
瑞古德漫画官方入口:开启你的精彩漫画世界
支持向量机全称是Supported Vector Machine支持向量机即寻找到一个超平面使样本分成两类并且间隔最大。
• 是一种监督学习算法主要用于分类也可用于回归• 与逻辑回归和决策树等其他分类器相比SVM 提供了非常高的准确度优缺点• 优点1适合小样本、高纬度数据比较强泛化能力2可有效地处理高维数据可使用不同的核函数来适应不同的数据类型• 缺点计算复杂度较高对于大规模数据的处理可能会存在困难超平面最大间隔硬间隔Hard Margin• 如果样本线性可分在所有样本分类都正确的情况下寻找最大间隔这就是硬间隔• 如果出现异常值、或者样本不能线性可分此时硬间隔无法实现。
软间隔SoftMargin和惩罚系数• 允许部分样本在最大间隔之内甚至在错误的一边寻找最大间隔这就是软间隔• 目标是尽可能在保持间隔宽阔和限制间隔违例之间找到良好的平衡。
核函数Kernel核函数将原始输入空间映射到新的特征空间使得原本线性不可分的样本在核空间可分使用LinearSVC探索鸢尾花分类 – API初步使用plot_util.pyimport numpy as np import matplotlib.pyplot as plt def plot_decision_boundary(model, axis): x0, x1 np.meshgrid( np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) *
).reshape(-1,
, np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) *
).reshape(-1,
) X_new np.c_[x
ravel(), x
ravel()] y_predict model.predict(X_new) zz y_predict.reshape(x
shape) from matplotlib.colors import ListedColormap custom_map ListedColormap([#EF9A9A, #FFF59D, #90CAF9]) # plt.contourf(x0,x1,zz,linewidth5,cmapcustom_map) plt.contourf(x0, x1, zz, cmapcustom_map) def plot_decision_boundary_svc(model, axis): x0, x1 np.meshgrid( np.linspace(axis[0], axis[1], int((axis[1] - axis[0]) *
).reshape(-1,
, np.linspace(axis[2], axis[3], int((axis[3] - axis[2]) *
).reshape(-1,
) X_new np.c_[x
ravel(), x
ravel()] y_predict model.predict(X_new) zz y_predict.reshape(x
shape) from matplotlib.colors import ListedColormap custom_map ListedColormap([#EF9A9A, #FFF59D, #90CAF9]) # plt.contourf(x0,x1,zz,linewidth5,cmapcustom_map) plt.contourf(x0, x1, zz, cmapcustom_map) w model.coef_[0] b model.intercept_[0] # w0* x0 w1* x1 b 0 # x1 -w0/w1 * x0 - b/w1 plot_x np.linspace(axis[0], axis[1],
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_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], colorblack) plt.plot(plot_x[down_index], down_y[down_index], colorblack)import numpy as np import matplotlib.pyplot as plt from sklearn.svm import LinearSVC from sklearn.preprocessing import StandardScaler from sklearn.datasets import load_iris from plot_util import plot_decision_boundary, plot_decision_boundary_svc def dm01(): X, y load_iris(return_X_yTrue) print(X.shape -- , X.shape) print(y.shape -- , y.shape) X X[y 2, :2] y y[y 2] print(x.shape--, X.shape) print(y.shape--, y.shape) plt.scatter(X[y 0, 0], X[y 0, 1], colorred) plt.scatter(X[y 1, 0], X[y 1, 1], colorblue) plt.show() transformer StandardScaler() X_std transformer.fit_transform(X) svc LinearSVC(dualauto, C
svc.fit(X_std, y) plot_decision_boundary(svc, axis[-3, 3, -3, 3]) plt.scatter(X_std[y 0, 0], X_std[y 0, 1], cred) plt.scatter(X_std[y 1, 0], X_std[y 1, 1], cblue) # plt.scatter(X_standard[:, 0], X_standard[:, 1], cy) plt.show() dm01()使用LinearSVC探索鸢尾花分类 – 惩罚参数C对超平面的影响from sklearn.datasets import load_iris import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.svm import LinearSVC from plot_util import plot_decision_boundary_svc def dm01(): X, y load_iris(return_X_yTrue) print(x.shape --, X.shape) print(y.shape --, y.shape) X X[y 2, :2] y y[y 2] print(x.shape--, X.shape) print(y.shape--, y.shape) plt.scatter(X[y 0, 0], X[y 0, 1], colorred) plt.scatter(X[y 1, 0], X[y 1, 1], colorblue) plt.show() transformer StandardScaler() X_std transformer.fit_transform(X) svc LinearSVC(dualauto, C
0.
svc.fit(X_std, y) print(svc.score(X_std, y)) plot_decision_boundary_svc(svc, axis[-3, 3, -3, 3]) plt.scatter(X_std[y 0, 0], X_std[y 0, 1], cred) plt.scatter(X_std[y 1, 0], X_std[y 1, 1], cblue) # plt.scatter(X_standard[:, 0], X_standard[:, 1], cy) plt.show() svc2 LinearSVC(dualauto, C
svc
fit(X_std, y) print(svc
score(X_std, y)) plot_decision_boundary_svc(svc2, axis[-3, 3, -3, 3]) plt.scatter(X_std[y 0, 0], X_std[y 0, 1], cred) plt.scatter(X_std[y 1, 0], X_std[y 1, 1], cblue) # plt.scatter(X_standard[:, 0], X_standard[:, 1], cy) plt.show() dm01()高斯核函数高斯核 Radial Basis Function Kernel (径向基函数又称RBF核)结论gamma越大高斯分布越窄gamma越小高斯分布越宽代码实现上述案例from sklearn.datasets import make_moons import matplotlib.pyplot as plt from sklearn.svm import SVC from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from plot_util import plot_decision_boundary import numpy as np def dm01(): X, y make_moons(noise
0.
print(x.shape --, X.shape) print(y.shape --, y.shape) plt.scatter(X[y 0, 0], X[y 0, 1]) plt.scatter(X[y 1, 0], X[y 1, 1]) plt.show() def RBFKernelSVC(gamma
1.
: return Pipeline([ (std_scaler, StandardScaler()), (svc, SVC(kernelrbf, gammagamma)) ]) print(x.shape --, X.shape) print(y.shape --, y.shape) svc1 RBFKernelSVC(gamma
1.
svc
fit(X, y) # 画图 plot_decision_boundary(svc1, axis[-
5,
5, -
0,
5]) plt.scatter(X[y 0, 0], X[y 0, 1]) plt.scatter(X[y 1, 0], X[y 1, 1]) plt.show() #
2 实例化模型2 -过拟合 svc2 RBFKernelSVC(gamma
svc
fit(X, y) plot_decision_boundary(svc2, axis[-
5,
5, -
0,
5]) plt.scatter(X[y 0, 0], X[y 0, 1]) plt.scatter(X[y 1, 0], X[y 1, 1]) plt.show() #
3 实例化模型3 -欠拟合 svc3 RBFKernelSVC(gamma
0.
svc
fit(X, y) plot_decision_boundary(svc3, axis[-
5,
5, -
0,
5]) plt.scatter(X[y 0, 0], X[y 0, 1]) plt.scatter(X[y 1, 0], X[y 1, 1]) plt.show() dm01()SVC和LinearSVC主要区别对比特性SVC(kernellinear)LinearSVC底层库libsvmliblinear优化算法SMO坐标下降法正则化参数C惩罚系数C惩罚系数损失函数铰链损失hinge loss可选的损失函数正则化形式L2 正则化L2 或 L1 正则化通过penalty截距bias处理自动处理可选择是否拟合截距多分类策略一对一one-vs-one一对多one-vs-rest速度线性问题较慢快很多特别是大数据核函数支持各种核仅线性支持稀疏数据有限更好LinearSVC基于load_iris实现多分类from sklearn.datasets import load_iris import matplotlib.pyplot as plt from sklearn.preprocessing import StandardScaler from sklearn.svm import LinearSVC import numpy as np plt.rcParams[font.sans-serif] [Microsoft YaHei, SimHei, KaiTi] plt.rcParams[axes.unicode_minus] False # 如果你没有plot_decision_boundary_svc这里是实现 def plot_decision_boundary_svc(model, axis): 绘制SVM决策边界 x0, x1 np.meshgrid( np.linspace(axis[0], axis[1],
, np.linspace(axis[2], axis[3],
) X_new np.c_[x
ravel(), x
ravel()] y_predict model.predict(X_new) zz y_predict.reshape(x
shape) from matplotlib.colors import ListedColormap custom_cmap ListedColormap([#EF9A9A, #90CAF9, #A5D6A7]) plt.contourf(x0, x1, zz, cmapcustom_cmap, alpha
0.
def dm01_iris_multiclass(): 使用完整Iris数据集展示LinearSVC的多分类 #
加载完整数据 X, y load_iris(return_X_yTrue) print(完整数据集:) print(X.shape --, X.shape) # (150,
print(y.shape --, y.shape) # (150,) print(类别分布:, np.bincount(y)) # [50, 50, 50] print(类别标签:, np.unique(y)) # [0, 1, 2] #
可视化前两个特征便于绘图 plt.figure(figsize(12,
) # 原始数据可视化 plt.subplot(
colors [red, blue, green] markers [o, s, ^] for i in range(
: plt.scatter(X[y i, 0], X[y i, 1], colorcolors[i], markermarkers[i], labelfClass {i}) plt.xlabel(Sepal length) plt.ylabel(Sepal width) plt.title(Original Iris Data (First 2 Features)) plt.legend() plt.grid(True, alpha
0.
#
标准化重要SVM对尺度敏感 scaler StandardScaler() X_std scaler.fit_transform(X) # 标准化后可视化 plt.subplot(
for i in range(
: plt.scatter(X_std[y i, 0], X_std[y i, 1], colorcolors[i], markermarkers[i], labelfClass {i}) plt.xlabel(Sepal length (standardized)) plt.ylabel(Sepal width (standardized)) plt.title(Standardized Data) plt.legend() plt.grid(True, alpha
0.
#
使用LinearSVC进行多分类 print(\n LinearSVC多分类演示 ) # LinearSVC默认使用One-vs-Rest策略 svc LinearSVC( C
0, # 正则化参数 dualauto, # 自动选择对偶或原始问题 multi_classovr, # One-vs-Rest策略 random_state42, max_iter10000 ) # 只用前两个特征训练为了可视化 svc.fit(X_std[:, :2], y) print(f训练准确率: {svc.score(X_std[:, :2], y):.4f}) print(f系数形状: {svc.coef_.shape}) # (3,
- 3个分类器每个有2个系数 print(f截距形状: {svc.intercept_.shape}) # (3,) - 3个截距 #
可视化决策边界 plt.subplot(
# 绘制决策区域 plot_decision_boundary_svc(svc, axis[-3, 3, -3, 3]) # 绘制数据点 for i in range(
: plt.scatter(X_std[y i, 0], X_std[y i, 1], colorcolors[i], markermarkers[i], edgecolork, s50, labelfClass {i}) # 绘制决策边界线 x_boundary np.linspace(-3, 3,
# 对于One-vs-Rest每条线是决策函数为0的地方 # w1*x1 w2*x2 b 0 x2 -(w1*x1 b)/w2 for i in range(
: w1, w2 svc.coef_[i] b svc.intercept_[i] # 注意这里可能出现除以0的情况 if abs(w
1e-10: y_boundary -(w1 * x_boundary b) / w2 plt.plot(x_boundary, y_boundary, colorcolors[i], linestyle--, linewidth2, labelfDecision Boundary {i}) plt.xlabel(Sepal length (std)) plt.ylabel(Sepal width (std)) plt.title(LinearSVC Decision Boundaries (OvR)) plt.legend(locupper right) plt.grid(True, alpha
0.