1

这可能是一个奇怪的要求,所以先解释一下。我最近突然发生了一次高清崩溃,丢失了我用来使用 libSVM 生成模型文件的数据文件。我确实有从这个数据文件生成的 SVM 模型和缩放文件,我想知道是否有办法从模型文件中的支持向量生成数据文件,就像model_sv_to_instances(model, &instances)因为获取实例的过程非常昂贵. (我知道它不会和原来的一样,但总比没有好)我正在使用带有 RBF 内核的概率 SVM。

4

3 回答 3

6

如果您在任何文本编辑器中打开给定的模型文件,您会发现如下内容:

 svm_type c_svc
 kernel_type sigmoid
 gamma 0.5
 coef0 0
 nr_class 2
 total_sv 4
 rho 0
 label 0 1
 nr_sv 2 2
 SV
 1 1:0 2:0
 1 1:1 2:1
 -1 1:1 2:0
 -1 1:0 2:1

对你来说有趣的地方是在 SV 之后。

 1 1:0 2:0
 1 1:1 2:1
-1 1:1 2:0
-1 1:0 2:1

这些是被选为支持向量的数据点,因此您只需解析文件。格式如下: [label] [index1]:[value1] [index2]:[value2] ... [indexn][valuen]

例如,从我的示例中,您可以得出结论,我的训练集是:

x y desired val 
0 0     -1
0 1      1
1 0      1
1 1     -1

一些注意事项和警告。SV 数和数据点数之间的比率取决于您使用的参数。在某些情况下,该比率很大,与您的数据相比,您的 SV 很少。

要记住的另一件事是,这种减少可能会改变问题,如果您再次使用 SV 作为数据点进行训练,您可能会得到一个完全不同的模型和一组完全不同的参数。

祝你好运!

于 2013-03-11T13:57:23.917 回答
1

据我所知,一般的 SVM 模型,特别是 libSVM 模型,仅包含支持向量。这些向量代表了类之间的边界;最有可能的是,它们并不代表您的绝大多数数据点。所以,不幸的是,我认为没有办法从模型中重新生成数据。

话虽如此,我可以想到一个深奥的案例,其中模型可能有一些价值:有公司专门在这种情况下恢复数据(例如从崩溃的硬盘中恢复)。但是,恢复的数据有时会有差距;在某些情况下,模型可能会被逆向工程以填补一些缺失的地方。然而,这是非常理论上的。

编辑:正如其他答案所述,支持向量表示的数据点的比例可能会有所不同,具体取决于具体问题和参数。但是,如上所述,在大多数常见情况下,您只能重建原始数据集的一小部分。

于 2013-03-11T08:28:18.813 回答
1

RBF你的情况下是幸运的。根据libsvm FAQ,您可以从模型文件中提取支持向量:

在模型文件中,在参数和标签等其他信息之后,每一行代表一个支持向量。

但请记住,这些只是支持向量,它们只是原始输入数据的一小部分。

于 2013-03-11T13:02:44.757 回答