支持向量机

什么是支持向量机

支持向量机 Support Vector Machine是一种监督式学习的方法,可广泛应用于统计分类及回归分析中,支持向量机属于一般化线性分类器,这个分类器的特点是它们能够同时最小经验误差与最大化几何边缘区,因此支持向量机也被称为最大边缘分类器
主要针对小样本数据,非线性及高维模式识别中表现出许多的优势,而且有很好的泛华能力。高维模式就是属性特别多,例如手写数字识别的数据。

一些定义

  • 统计分类
    统计分类是机器学习非常重要的一个组成部分,它的目标是根据已知样本的某些特征,判断一个新的样本属于哪种已知的样本类
  • 回归分析
    目的在于了解两个或多个变量间是否相关、相关方向与强度,并建立数学模型以便观察特定变量来预测研究者感兴趣的变量。白话就是y与x的函数关系,例如线性回归y=ax+b
    • 线性分类器
    • 最小经验误差
    • 几何边缘区
    • 拉格朗日函数

SVM算法原理

基本思想是为了求解能够正确划分训练数据集并且几何间隔最大的分离超平面。

SVM的优势

  • 在高维度的空间中非常高效
  • 即使在数据维度比样本数量大的情况下仍然有效
  • 在决策函数中使用训练集的子集,因此它也是高效利用内存的
  • 通用性:不同的核函数与特定的决策函数一一对应

SVM的缺点

  • 如果特征数量比样本数量大得多,在选择核函数时要避免过拟合,而且正则化是非常重要的
  • 支持向量机不直接提供概率估计,这些都是使用昂贵的五次交叉验算的
  • 对缺失样本很敏感,建模之前清洗好,logistic Regression(逻辑回归)
  • 对缺失值也很敏感

SVM数学公式的推导

详细见博客:https://yq.aliyun.com/articles/655112

SVM sklearn 代码练习

import numpy as np
import matplotlib.pyplot as plt
from sklearn.datasets import make_blobs
from sklearn.svm import LinearSVC
​
#生成测试数据
X, y = make_blobs(n_samples=40, centers=2, random_state=0)
​
plt.figure(figsize=(10, 5))
for i, C in enumerate([1, 100]):
    # "hinge" is the standard SVM loss
    clf = LinearSVC(C=C, loss="hinge", random_state=42).fit(X, y)
    # obtain the support vectors through the decision function
    decision_function = clf.decision_function(X)
    # we can also calculate the decision function manually
    # decision_function = np.dot(X, clf.coef_[0]) + clf.intercept_[0]
    support_vector_indices = np.where((2 * y - 1) * decision_function <= 1)[0]
    support_vectors = X[support_vector_indices]
​
    plt.subplot(1, 2, i + 1)
    plt.scatter(X[:, 0], X[:, 1], c=y, s=30, cmap=plt.cm.Paired)
    ax = plt.gca()
    xlim = ax.get_xlim()
    ylim = ax.get_ylim()
    xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 50),
                         np.linspace(ylim[0], ylim[1], 50))
    Z = clf.decision_function(np.c_[xx.ravel(), yy.ravel()])
    Z = Z.reshape(xx.shape)
    plt.contour(xx, yy, Z, colors='k', levels=[-1, 0, 1], alpha=0.5,
                linestyles=['--', '-', '--'])
    plt.scatter(support_vectors[:, 0], support_vectors[:, 1], s=100,
                linewidth=1, facecolors='none', edgecolors='k')
    plt.title("C=" + str(C))
plt.tight_layout()
plt.show()
原文地址:https://www.cnblogs.com/raisok/p/11458788.html