【问题标题】:Encog SVM won't trainEncog SVM 不会训练
【发布时间】:2015-07-04 12:45:49
【问题描述】:

我正在尝试训练 SVM 对两个螺旋数据进行分类。

我的输入是一个 3 列的 CSV 文件,前两列是螺旋上一个点的 (x, y) 坐标(未标准化),第三列是该点所属的螺旋(类) .

我首先对 CSV 文件进行规范化,使前两列介于 0 和 1 之间(第三列保持不变)。

然后我创建并训练一个 SVM,如下所示

    CSVNeuralDataSet trainingSet = new CSVNeuralDataSer(normaliseCSV("/path/to/data/file"), 2, 1, false);

SVM svm = new SVM(2, false);

final SVMSearchTrain train = new SVMSearchTrain(svm, trainingSet);

int epoch = 0;

do {
  train.iteration();
  System.out.println("Epoch $: " + epoch + " Error: " + train.getError());
  epoch++;
} while(train.getError() > 0.01);

train.finishTraining();

但是,do...while 循环最终成为一个无限循环,因为训练误差约为 0.4,而且它永远不会改变。

数据集包含大约 200 个样本,只有两个类(0 和 1)。

谁能告诉我为什么会失败?

编辑:Here is a pastebin link 到大约 10% 的训练数据。

【问题讨论】:

  • 能否分享一段标准化数据?
  • 已编辑以将 pastebin 链接添加到示例数据。

标签: java csv svm encog


【解决方案1】:

很好的问题。您的问题是 SVM 无法为螺旋数据建立分离曲线。我建议你尝试归一化技巧,但不是根据 X、Y 坐标归一化为直线,而是将switch 归一化为polar system of coordinates。并可能考虑阿基米德螺旋、对数螺旋等。请看图片。螺旋数据需要 SVM 构建一些函数,将 1 类和 2 类之间的数据分开,我很确定这对 SVM 来说不是一件容易的事。但是如果你能找到从螺旋数据表示转换为线性数据表示的方法,那么 SVM 将需要在两条曲线之间建立分离,这要容易得多。

【讨论】:

  • 另外请确保 1 类和 2 类不相交
猜你喜欢
  • 1970-01-01
  • 2015-10-27
  • 2013-05-14
  • 2015-05-04
  • 2015-07-25
  • 2012-11-03
  • 2015-04-18
  • 2015-01-22
相关资源
最近更新 更多