随着机器学习的发展,越来越多的开源工具让我们能够更加方便的进行各种机器学习任务。JS-SVM 是一款支持 JavaScript 的支持向量机(SVM)算法库。它可以用于分类、回归和异常检测等多种应用场景。
在本文中,我们将详细介绍 npm 包 js-svm 的使用方法,包括安装、配置以及使用的详细示例。我们将会了解 svm 的原理,并使用 js-svm 对手写数字进行分类训练。
安装 js-svm
我们可以通过 npm 安装 js-svm。在命令行输入下面的命令:
npm install js-svm --save
该命令将会自动为我们安装所需的 js-svm 包,并加入到我们项目的依赖中。
使用 js-svm
下面是一个简单的 js-svm 使用示例:
-- -------------------- ---- ------- ------ --- ---- --------- -- ----- ----- ---------- - --- ---------- -- ---- ----- - - ---- --- --- --- --- --- --- ---- ----- - - --- -- --- ---- ------------------- --- -- ---- ----- ----- - ---- --- ---- ----- ----- ------------- - -------------------------- --------------------------- -- --- ---
在这个示例中,我们首先通过 import
语句引入了 js-svm,创建了一个名为 classifier
的支持向量机分类器。然后我们用 x
和 y
训练出了这个分类器,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