这可能是一个奇怪的请求,所以先解释一下。我最近遇到了突然的高清崩溃,丢失了一个用于生成带有libSVM的模型文件的数据文件。我有从这个数据文件生成的SVM模型和缩放文件,我想知道是否有一种方法可以从模型文件中的支持向量生成数据文件,类似于model_sv_to_instances(model, &instances)
,因为获取实例非常昂贵。 (我知道它与原版不一样但仍然比没有更好)我正在使用带RBF内核的概率SVM。
答案 0 :(得分: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作为数据点,你可能会得到一个完全不同的模型,其中包含完整不同的参数集。
祝你好运!答案 1 :(得分:1)
据我所知,SVM模型,特别是libSVM模型,仅包含支持向量。这些向量代表类之间的边界;最有可能的是,它们并不代表绝大多数数据点。所以,遗憾的是,我认为没有办法从模型中重新生成数据。
话虽如此,我可以想到一个深奥的案例,其中可能对模型有一些价值:有些公司专门在这种情况下恢复数据(例如从崩溃的HD中恢复)。但是,恢复的数据有时会有差距;在某些情况下,该模型可能会进行逆向工程以填补一些缺失点。但是,这是非常理论化的。
编辑:当其他答案陈述时,支持向量所代表的数据点的比例可能会有所不同,具体取决于具体的问题和参数。但是,如上所述,在大多数情况下,您只能重建原始数据集的一小部分。答案 2 :(得分:1)
在RBF
的情况下,你很幸运。根据{{3}},您可以从模型文件中提取支持向量:
在模型文件中,在参数和其他信息(如标签)之后,每一行代表一个支持向量。
但请记住,这些只是支持向量,它只是原始输入数据的一小部分。