libsvm - 训练信号

时间:2014-04-25 18:33:15

标签: c++ machine-learning classification libsvm

我是ML和SVM等的新手。我有一个信号的x,y数据点数组。该信号类似于ECG(下图)。我想训练SVM以将正常ECG信号与非正常(异常)信号分类。使用LibSVM(或任何其他SVM库)实现此目的的最佳方法是什么?

ECG

2 个答案:

答案 0 :(得分:2)

Support Vector Machines几乎所有classifiers都需要将训练样本表示为位于特征空间中的feature vectors

为了创建这样的特征向量,您必须对信号进行feature extraction。也就是说,您必须从信号中提取一些可衡量的区分尺度不变特征(例如wavelet coefficients)。

完成此操作后,您必须将要素向量组织为数据矩阵的行(或列)。数据矩阵是2D矩阵,其行(或其列)是先前提取的特征向量。例如,假设您有3个由3D特征向量表示的信号(即,从您的每个信号中提取3个特征)。

enter image description hereenter image description hereenter image description here

(其中T表示转置)。

然后您的数据矩阵将是:

enter image description here

创建数据矩阵后,您必须创建数据标签的向量。标签'向量是一维向量,具有与数据矩阵相同的行数(或列数),并包含与要素向量对应的类标签。由于你的问题包括两个类(即正常和非正常),你的标签向量只有2个符号(例如,normal = -1,non-normal = 1)。继续上一个示例,如果enter image description here正常,enter image description here非正常,则标签向量看起来像enter image description here

现在,只要涉及LibSVM部分:LibSVM使用LibSVM format将数据矩阵与类标签一起存储在.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

但请注意,如果您有第零个值,则可以省略它们。例如,如果enter image description here,那么您的文件将如下所示:

-1 2:2 3:3
-1 1:4 2:5 3:6
 1 1:7 2:8 3:9

另请注意,在文件的每一行中,首先要编写特征向量的类标签,然后再写入其值。

一旦您创建了上述文件,就可以开始了。在LibSVM's site中,您会发现所有说明都需要它来运行LibSVM和您的文件。

答案 1 :(得分:0)

对我来说,你的问题听起来像One-class classification问题,因为你永远不会为“非正常”特征空间提供训练样本。 libSVM确实支持它。

棘手的部分是提取不变特征,这是一个信号处理问题。您可能需要评估不同的方法,如小波,FFT或强力采样。您还可以尝试使用描述性方法,例如6个相对最小值/最大值。覆盖多个周期的算法可能比基于提取单个周期和/或提取单个参数的算法更稳定。

取决于您可接受的假阳性和假阴性率,某些替代品可能会被排除在外。