PySVM:A NumPy implementation of SVM based on SMO algorithm

自实现SVM库简述

Posted by Welt Xing on May 28, 2022

link : https://github.com/Kaslanarian/PySVM.

实现LIBSVM中的SVM算法,对标sklearn.svm模块

  • LinearSVC
  • KernelSVC
  • NuSVC
  • LinearSVR
  • KernelSVR
  • NuSVR
  • OneClassSVM

Algorithm

我们实现了针对一般SVM对偶问题

\[\begin{aligned} \min_{\pmb\alpha}\quad&\frac12\pmb\alpha^T\pmb Q\pmb\alpha+\pmb p^T\pmb\alpha\\ \text{s.t.}\quad&\pmb y^T\pmb\alpha=0\\ &0\leq\alpha_i\leq C,i=1,\cdots,l \end{aligned}\]

的SMO算法求解器Solver,和针对NuSVM对偶问题

\[\begin{aligned} \min_{\pmb\alpha}\quad&\frac12\pmb\alpha^T\pmb Q\pmb\alpha+\pmb p^T\pmb\alpha\\ \text{s.t.}\quad&\pmb y^T\pmb\alpha=0\\ &\pmb e^T\pmb\alpha=t\\ &0\leq\alpha_i\leq C,i=1,\cdots,l \end{aligned}\]

的SMO算法求解器NuSolver,从而实现支持向量分类,回归和异常检测。

Framework

我们实现了下面几种SVM:

image-20220528182203694

具体实现的层次框架:

image-20220528182237533

其中RFF是随机傅里叶特征,LRU cache缓存机制用于处理极大数据的场景。

Features

  • PySVM的模型基类是sklearn的分类器,这意味着我们能够像sklearn模型一样训练、预测和调参;
  • PySVM使用NumPy实现,所以很多地方我们都进行了广播运算加速,使代码在保证可读性的同时提升性能;
  • PySVM加入了缓存机制,通过指定cache_size参数,我们会使用核函数缓存计算核矩阵,避免大数据情况下核矩阵存储开销;
  • PySVM加入了RFF计算高斯核的选项,同时可以指定采样次数,在一些场景下会计算更快;

更多可以查阅项目文档。

Install

输入

git clone https://github.com/Kaslanarian/PySVM
cd PySVM
python setup.py install

进行安装,然后运行一个简单的例子

>>> from sklearn.datasets import load_iris
>>> from pysvm import LinearSVC
>>> X, y = load_iris(return_X_y=True)
>>> X = (X - X.mean(0)) / X.std(0) # 标准化
>>> clf = LinearSVC().fit(X, y) # 训练模型
>>> clf.score(X, y) # 准确率
0.94

Example

tests中,我们编写了5个例子,分别是

  • 使用三种SVM对sklearn自带数据集分类(默认参数、选取20%数据作为测试数据、数据经过标准化):

    Accuracy Iris Wine Breast Cancer Digits
    Linear SVC 94.737% 97.778% 96.503% 95.556%
    Kernel SVC 97.368% 97.778% 96.503% 98.222%
    NuSVC 97.368% 97.778% 92.308% 92.222%
  • 使用三种SVM对sklearn自带数据集回归(默认参数、选取20%数据作为测试数据、数据经过标准化):

    R2 score Boston Diabetes
    Linear SVR 0.6570 0.4537
    Kernel SVR 0.6992 0.1756
    NuSVR 0.6800 0.1459
  • 分别用LinearSVC和KernelSVC对人工构造的二分类数据集进行分类,画出分类结果图像和决策函数值图像:

    1

  • 用三种SVR拟合三种不同的数据:线性数据,二次函数和三角函数:

    2

  • 用One Class SVM进行异常检测:

    3

Reference