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

Machine learning LIBSVM:从模型文件中获取支持向量,machine-learning,svm,libsvm,Machine Learning,Svm,Libsvm,这可能是一个奇怪的要求,所以先解释一下。我最近突然发生了一次hd崩溃,丢失了一个用于用libSVM生成模型文件的数据文件。我有从这个数据文件生成的SVM模型和缩放文件,我想知道是否有方法从模型文件中的支持向量生成数据文件,比如模型到实例模型和实例,因为获取实例的过程非常昂贵。我知道它与原来的不一样,但仍然比没有好。我使用的是带有RBF核的概率支持向量机。据我所知,一般的支持向量机模型,特别是libSVM模型,只包含支持向量。这些向量表示类之间的边界;很可能,它们并不代表您的绝大多数数据点。因此,

这可能是一个奇怪的要求,所以先解释一下。我最近突然发生了一次hd崩溃,丢失了一个用于用libSVM生成模型文件的数据文件。我有从这个数据文件生成的SVM模型和缩放文件,我想知道是否有方法从模型文件中的支持向量生成数据文件,比如模型到实例模型和实例,因为获取实例的过程非常昂贵。我知道它与原来的不一样,但仍然比没有好。我使用的是带有RBF核的概率支持向量机。

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

话虽如此,我可以想到一个神秘的案例,该模型可能有一些价值:有一些公司专门在这种情况下恢复数据,例如从崩溃的HDs中恢复数据。然而,恢复的数据有时会有缺口;在某些情况下,可能会对模型进行反向工程,以填补某些缺失点。然而,这是非常理论化的


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

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

话虽如此,我可以想到一个神秘的案例,该模型可能有一些价值:有一些公司专门在这种情况下恢复数据,例如从崩溃的HDs中恢复数据。然而,恢复的数据有时会有缺口;在某些情况下,可能会对模型进行反向工程,以填补某些缺失点。然而,这是非常理论化的

编辑:与其他答案状态一样,由支持向量表示的数据点的比例可能会有所不同,这取决于特定的问题和参数。然而,如上所述,在大多数情况下,您只能重建原始数据集的一小部分。

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

在模型文件中,在参数和其他信息(如标签)之后,每行表示一个支持向量

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

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

在模型文件中,在参数和其他信息(如标签)之后,每行表示一个支持向量


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

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

 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]。。。[索引n][valuen]

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

x y desired val 
0 0     -1
0 1      1
1 0      1
1 1     -1
一些注意事项和警告。SV数量与数据点之间的比率取决于所使用的参数。在某些情况下,比率很大,与数据相比,SV非常少

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


祝你好运

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

 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]。。。[索引n][valuen]

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

x y desired val 
0 0     -1
0 1      1
1 0      1
1 1     -1
一些注意事项和警告。SV数量与数据点之间的比率取决于所使用的参数。在某些情况下,比率很大,与数据相比,SV非常少

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


祝你好运

这些向量表示类之间的边界;它没有直接引用任何特定的数据点,除非支持向量与训练集直接相关,因为它们是定义类之间的超平面的数据点。幸运的是,该模型相当大,因此即使有这个警告,我也能够恢复相当一部分的数据。这些向量表示类之间的边界;它没有直接引用任何特定的数据点,除非支持向量与训练集直接相关,因为它们是定义类之间的超平面的数据点。幸运的是,该模型相当大,因此即使有这个警告,我也能够恢复相当一部分的数据。谢谢非常感谢你的回答。我猜SV是缩放的,所以我必须取消缩放才能再次获得真实点?@vseguip如果您事先缩放它。。。是的,您需要将其取消缩放。但是,库不会自动缩放它们,因此这取决于您如何构建模型。此外,您应该注意以下一点:模型文件中的标签行非常非常重要。另一方面,你应该总是有这样的备份。例如,Dropbox非常好用。非常感谢您的回答。我猜SV是缩放的,所以我必须取消缩放才能再次获得真实点?@vseguip如果您事先缩放它。。。是的,您需要将其取消缩放。但是,库不会自动缩放它们,因此这取决于您如何构建模型。此外,您应该注意以下一点:模型文件中的标签行非常非常重要。另一方面,你应该总是有这样的备份。例如,Dropbox工作得很好。