Java 如何将svm_问题划分为5层进行自定义交叉验证-LIBSVM

Java 如何将svm_问题划分为5层进行自定义交叉验证-LIBSVM,java,data-structures,svm,libsvm,cross-validation,Java,Data Structures,Svm,Libsvm,Cross Validation,我正在尝试为LIBSVM实现我自己的交叉验证功能,但是我对如何处理基于输入数据提供给我的数据结构感到困惑 数据存储在一个结构中svm\u问题: public class svm_problem implements java.io.Serializable { public int l; public double[] y; public svm_node[][] x; } 其中: l是数据集的长度; y是包含其目标值的数组; x是指针数组,每个指针指向一个训练向量的表

我正在尝试为LIBSVM实现我自己的交叉验证功能,但是我对如何处理基于输入数据提供给我的数据结构感到困惑

数据存储在一个结构中svm\u问题

public class svm_problem implements java.io.Serializable
{
    public int l;
    public double[] y;
    public svm_node[][] x;
}
其中: l是数据集的长度; y是包含其目标值的数组; x是指针数组,每个指针指向一个训练向量的表示形式

svm_节点定义为:

public class svm_node implements java.io.Serializable
{
    public int index;
    public double value;
}
我的目标是将训练数据分成5倍,使用其中的4倍进行训练(函数svm_-train),并使用剩余的一倍对结果进行测试(svm_-predict),以找到哪一个C值具有最佳的预测结果(基于误差函数)

我的问题是如何在给定数据结构的情况下将数据分成5个部分。如何将数据结构正确地划分为5个层次,以便我继续优化C

我一直以此为指导:


如果有人能提供一个例子或链接到一个如何最好地做到这一点的例子,将不胜感激。谢谢。

对于
i=0,1,…,l-1
,svm_问题
描述了
f(x[i])
对于学习函数
f
,应该大致等于
y[i]
。可以将每个元组
(x[i],y[i])
视为您试图查找的函数
f
中的一个噪声样本


要将数据集拆分为训练、交叉验证和测试数据集,只需将集合
{0,1,…,l-1}
随机拆分为这3部分即可。这通常是通过将数字列表
0,1,…,l-1
洗牌,然后说“前60%的数字是训练,下20%是交叉验证,下20%是测试”或类似的话来完成的。对于数据集的每一个子集,您可以构造一个新的
svm_问题
,该问题只描述该部分数据。

我已经有两个数据集,一个用于训练,一个用于测试。我试图将训练数据集拆分为5倍,以便执行交叉验证以找到最佳C值。当整个数据集用于训练svm时,将使用此C值。我不确定如何使用其他四个来验证每个集合,以找到最佳的C。(C将由我手动更新)。其他四个是否应该组合,然后传递到svm_序列中,还是应该分别传递到svm_序列中?函数包含在Libsvm中。@MattKoczwara假设
svm\u train
正在增量更新模型参数,实际上,输入四个20%
svm\u问题
实例还是一个80%
svm\u问题
实例并不重要。我不熟悉特定的库,但我描述的分解数据的方式在机器学习方面非常普遍。