npm 包 js-svm 使用教程

阅读时长 7 分钟读完

随着机器学习的发展,越来越多的开源工具让我们能够更加方便的进行各种机器学习任务。JS-SVM 是一款支持 JavaScript 的支持向量机(SVM)算法库。它可以用于分类、回归和异常检测等多种应用场景。

在本文中,我们将详细介绍 npm 包 js-svm 的使用方法,包括安装、配置以及使用的详细示例。我们将会了解 svm 的原理,并使用 js-svm 对手写数字进行分类训练。

安装 js-svm

我们可以通过 npm 安装 js-svm。在命令行输入下面的命令:

该命令将会自动为我们安装所需的 js-svm 包,并加入到我们项目的依赖中。

使用 js-svm

下面是一个简单的 js-svm 使用示例:

-- -------------------- ---- -------
------ --- ---- ---------

-- -----
----- ---------- - --- ----------

-- ----
----- - - ---- --- --- --- --- --- --- ----
----- - - --- -- --- ----
------------------- ---

-- ----
----- ----- - ---- --- ---- -----
----- ------------- - --------------------------

--------------------------- -- --- ---

在这个示例中,我们首先通过 import 语句引入了 js-svm,创建了一个名为 classifier 的支持向量机分类器。然后我们用 xy 训练出了这个分类器,x 是每个样本的特征值,y 表示它们的标签。最后,我们用 testX 测试了一下这个分类器,并预测了两个样本的标签。

深入理解 SVM

支持向量机是一种用于分类、回归和异常检测等机器学习任务的算法。它可以用一个类似于向量的形式来表示数据点,并在数据点间总结出一些规律。这些规律可以帮助我们判断新的数据点属于哪个类别。

在 SVM 中,我们用参数 w 来表示数据的分界线(也叫超平面),而 b 则控制了这个分界线的位置。SVM 的目标是找到这个分界线,使得它能够尽可能准确地区分出不同的样本。我们可以用一张图来表示这个分界线:

在这张图中,黑色的圆形和三角形代表样本。我们的目标就是找到如图的直线或曲线:它能够尽可能准确地把圆形和三角形分开。我们希望这个直线或曲线能够最大化离黑圆点和三角点的“间隔”,这样就能够更好地区分圆形和三角形。这里的“最大化间隔”意味着我们不仅仅希望分类器对训练集的分类表现好,还希望它对新的数据也能够分类得很好。

如果直接用一条直线进行分类,会出现下面这样的情况:

上图中,虚线的分界线不能很好地区分圆形和三角形样本。在这种情况下,我们可以引入一条平行于虚线的新分界线:

上图中,新分界线的距离比原分界线更远,从而更好地分离了圆形和三角形。这个距离就是“间隔”,最终 SVM 的目标就是找到最大化这个间隔的分类器。SVM 可以非常高效地实现这个目标。它只关心最靠近分界线的一小部分样本集,而与其他样本无关。

如果数据集不能通过一条直线完全分开,我们就会使用一个更高维空间的“超平面”来进行分类。这个超平面比线性分类器更复杂,但也能够更好地进行分类。

在机器学习中,我们通常在训练集上训练分类器,并在测试集上测试它的表现如何。训练集和测试集应该是不同的数据集。如果使用相同的数据集进行训练和测试,分类器可能出现过度拟合的问题。

SVM 的实现

在实现 SVM 算法时,我们需要确定如何定义分界面、如何计算距离和如何约束情况。这个方案是通过选择核函数来实现的,常用的核包括线性核、多项式核和径向核。

线性核是最基本的核函数,它将数据点投影到一个更高的维度中并通过一个分界线来区分它们。多项式核和径向核是一些更复杂的核函数。径向核是 SVM 最常用的核函数之一,它将数据 projected 根据其与其他点的距离分配给一个新维度。多项式核可以使用多项式函数将数据映射到新维度。这两种情况下,我们可以使用一个核来建立一个非线性分类器。

使用 SVM 在 Node.js 中进行分类

下面我们将介绍如何在 Node.js 中使用 SVM 对手写数字进行分类。我们将会使用 mnist 数据集,这个数据集包括许多手写数字的图像数据。

在这里,我们将使用 csvtojson 库将 CSV 文件转换成 json 对象。mnist 的图像数据是由 28x28 的像素组成的,每个像素点的值在 0-255 之间。MNIST 数据集中的所有图像都被铺平,转换为一个 784 维的向量。

下面是完整的代码示例:

-- -------------------- ---- -------
----- --------- - ---------------------
----- --- - ------------------
----- ---- - ----------------

-- -- --- ------ ----
-----------
  ------------------------------ -------------------
  ------------ -- -
    -- ---------
    ------------------ -- -
      --------- - --------------------
      -------- - --------------------------- -- -------------
    ---

    -- --- --
    ----- ------ - -------------------
    ----- ---------- - -
      -- --
      ---- -----
      ---------- ---
      -------
    --

    -- ----------
    ----- ---------- - --- ----------
    ----- - - -------------- -- ----------
    ----- - - -------------- -- ---------- --- - - - - -----
    ------------------- -- ------------

    -- ----
    --- ------- - --
    --- ----- - --
    -----------
      ------------------------------ ------------------
      ------------ -- -
        ------------------ -- -
          --------- - --------------------
          -------- - --------------------------- -- -------------
          ----- --------- - ----------------------------------
          -- ---------- --- - -- --------- --- -- -
            ----------
          - ---- -- ---------- --- -- -- --------- --- -- -
            ----------
          -
          --------
        ---
        ---------------------- ---------- - ------ - --------
      ---
  ---

在这个示例中,我们用 csvtojson 库读取了 mnist_train.csv 文件和 mnist_test.csv 文件并分别进行了训练和测试。在数据处理的过程中,我们将标签为 1 的数字作为正样本(y 为 1),而将其他样本标记为负样本(y 为 -1)。

我们还定义了一些 SVM 配置项,包括核函数、C、精度和最大迭代次数。在训练模型后,我们使用测试集进行了分类。最后,我们计算出模型的准确率。

总结

通过本文的介绍,我们了解了 SVM 算法,学习了如何使用 npm 包 js-svm 进行分类。我们也学习了如何处理 MNIST 数据集,从而训练并测试一个 SVM 分类器。

SVM 是一个非常强大的算法,可以用于许多实际问题中,包括分类、回归和异常检测。如果你想要进一步学习 SVM,可以尝试应用它来解决一些有趣的问题!

来源:JavaScript中文网 ,转载请注明来源 https://www.javascriptcn.com/post/60055ada81e8991b448d879f

纠错
反馈