LIBSVM:从模型文件中获取支持向量

Posted

技术标签:

【中文标题】LIBSVM:从模型文件中获取支持向量【英文标题】:LIBSVM: Get support vectors from model file 【发布时间】:2013-02-26 08:15:07 【问题描述】:

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

【问题讨论】:

【参考方案1】:

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

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

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

【讨论】:

“这些向量代表了类之间的边界;它不直接引用任何特定的数据点”你是对的,除了支持向量确实与训练集直接相关,因为它们是数据点定义分离类的超平面。 “幸运的是”这个模型非常大,所以即使有这个警告,我也能恢复相当一部分数据。【参考方案2】:

对于RBF,你很幸运。根据libsvm FAQ,您可以从模型文件中提取支持向量:

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

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

【讨论】:

【参考方案3】:

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

 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

这些是被选为支持向量的数据点,因此您只需解析文件。格式如下: [标签] [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 作为数据点进行训练,您可能会得到一个具有完全不同参数集的完全不同的模型。

祝你好运!

【讨论】:

非常感谢您的回答。我猜 SV 是按比例缩放的,所以我必须“取消缩放”它才能再次获得真正的意义? @vseguip 如果您事先对其进行了缩放...是的,您将需要取消缩放它们。该库不会自动缩放它们,因此这取决于您构建模型的方式。 另外,您应该注意这个小警告:csie.ntu.edu.tw/~cjlin/libsvm/faq.html#f430(模型文件中的label 行非常非常重要)。另一方面,您应该始终备份此类内容。例如,Dropbox 效果很好。

以上是关于LIBSVM:从模型文件中获取支持向量的主要内容,如果未能解决你的问题,请参考以下文章

Libsvm 模型中的支持向量是如何排列的?

libsvm 不提供支持向量/没有支持向量

如何在 weka 模型中找到支持向量

支持向量的数量 libsvm

机器学习 - 支持向量机

Libsvm 预计算内核