我刚开始接触机器学习和支持向量机等领域。我有一组信号的x,y数据点,这个信号类似于心电图(如下图)。我想训练SVM来区分正常的心电图信号和非正常(异常)信号。使用LibSVM(或任何其他SVM库)实现这一目标的最佳方法是什么?
回答:
支持向量机像几乎所有分类器一样,要求训练样本以特征向量的形式表示,这些特征向量位于特征空间中。
为了创建这样的特征向量,你需要对信号进行特征提取。也就是说,你需要从信号中提取一些可测量的、具有区分性的、尺度不变的特征(例如,小波系数)。
一旦你完成了这些,你就需要将你的特征向量组织成数据矩阵的行(或列)。数据矩阵是一个二维矩阵,其行(或列)是之前提取的特征向量。例如,假设你有3个信号,这些信号由3D特征向量表示(即,你从每个信号中提取了3个特征)。
,
,
(其中T表示转置)。
那么你的数据矩阵将是:
创建数据矩阵后,你需要创建数据标签的向量。标签向量是一个一维向量,其行数(或列数)与你的数据矩阵相同,并且包含与你的特征向量对应的类别标签。由于你的问题包括两个类别(即,正常和非正常),你的标签向量将只有2个符号(例如,正常 = -1,非正常 = 1)。继续前面的例子,如果是正常的,
是非正常的,那么你的标签向量将看起来像
现在关于LibSVM部分:LibSVM使用LibSVM格式来存储数据矩阵和类别标签在一个.txt
文件中。文件的格式是:
<label> <index1>:<value1> <index2>:<value2>
按照我们的例子,你的文件内容将看起来像:
-1 1:1 2:2 3:3-1 1:4 2:5 3:6 1 1:7 2:8 3:9
请注意,如果你有零值,你可以省略它们。例如,如果,那么你的文件将看起来像:
-1 2:2 3:3-1 1:4 2:5 3:6 1 1:7 2:8 3:9
另外请注意,在文件的每一行中,首先写特征向量的类别标签,然后是其值。
一旦你创建了上述文件,你就可以开始了。在LibSVM的网站上,你会找到运行LibSVM所需的所有指令。