libsvm - Training a signal
一般来说,我是ML和SVM等的新手。我有一个信号的x,y数据点数组。该信号类似于ECG(下图)。我想训练SVM对正常ECG信号与非正常(异常)信号进行分类。使用LibSVM(或任何其他SVM库)实现此目标的最佳方法是什么?
支持向量机就像几乎所有分类器一样,都要求训练样本表示为位于特征空间中的特征向量。
为了创建这样的特征向量,您必须对信号进行特征提取。也就是说,您必须从信号中提取一些可测量的区分尺度不变特征(例如小波系数)。
一旦这样做,就必须将特征向量组织为数据矩阵的行(或列)。数据矩阵是2D矩阵,其中的行(或其列)是先前提取的特征向量。例如,假设您有3个以3D特征向量表示的信号(即从每个信号中提取了3个特征)。
,
,
(其中T表示转置)。
那么您的数据矩阵将是:
创建数据矩阵后,您必须创建数据标签的向量。标签向量是一维向量,其行(或列)数与数据矩阵相同,并且包含与特征向量相对应的类标签。由于您的问题包含两个类别(即正常和非正常),因此您的标签矢量将只有2个符号(例如,正常= -1,非正常= 1)。继续前面的示例,如果正常且非正常,则标签矢量看起来像
现在涉及到LibSVM部分:LibSVM使用LibSVM格式将数据矩阵以及类标签存储在
文件格式为:
1 | <label> <index1>:<value1> <index2>:<value2> |
按照我们的示例,您文件的内容如下所示:
1 2 3 | -1 1:1 2:2 3:3 -1 1:4 2:5 3:6 1 1:7 2:8 3:9 |
请记住,如果您有零值,则可以忽略它们。例如,如果,则您的文件将如下所示:
1 2 3 | -1 2:2 3:3 -1 1:4 2:5 3:6 1 1:7 2:8 3:9 |
还要注意,在文件的每一行中,首先编写特征矢量的类标签,然后编写其值。
创建了上述文件后,就可以开始使用了。在LibSVM的站点中,您会找到使用它来运行LibSVM和文件的所有说明。
对我来说,您的问题听起来像是一类分类问题,因为您永远不会为"非正常"特征空间准备训练样本。 libSVM确实支持该功能。
棘手的部分是提取不变特征,这是信号处理问题。您可能必须评估不同的方法,例如小波,FFT或蛮力采样。您还可以尝试采用描述性方法,例如6个相对的最小/最大值。覆盖多个周期的算法可能比基于提取单个周期和/或提取单个参数的算法更稳定。
根据您可接受的误报率和误报率,某些选择可能会被排除在外。