0

我有一个机器学习方案,其中我使用 Weka 的 java 类在 matlab 脚本中实现机器学习。然后我将分类器的模型上传到数据库,因为我需要在不同的机器上以不同的语言(obj-c)执行分类。网络评估的编程相当简单,但我需要 WEKA 用于在训练之前对数据集进行归一化的值,以便稍后在网络评估中使用它们。有谁知道如何获得 weka 用于训练多层感知器网络的归一化因子?我希望答案是在 Java 中。

4

1 回答 1

2

在对 WEKA 源代码和文档进行了一些挖掘之后……这就是我想出的。尽管 WEKA 中有一个名为“Normalize”的过滤器,但 Multilayer Perceptron 并没有使用它,而是在内部使用了一些看起来像这样的代码。

m_attributeRanges = new double[inst.numAttributes()];
m_attributeBases = new double[inst.numAttributes()];
  for (int noa = 0; noa < inst.numAttributes(); noa++) {
min = Double.POSITIVE_INFINITY;
max = Double.NEGATIVE_INFINITY;
for (int i=0; i < inst.numInstances();i++) {
  if (!inst.instance(i).isMissing(noa)) {
    value = inst.instance(i).value(noa);
    if (value < min) {
      min = value;
    }
    if (value > max) {
      max = value;
    }
  }
}

m_attributeRanges[noa] = (max - min) / 2;
m_attributeBases[noa] = (max + min) / 2;
if (noa != inst.classIndex() && m_normalizeAttributes) {
  for (int i = 0; i < inst.numInstances(); i++) {
    if (m_attributeRanges[noa] != 0) {
      inst.instance(i).setValue(noa, (inst.instance(i).value(noa)  
                      - m_attributeBases[noa]) /
                m_attributeRanges[noa]);
    }
    else {
      inst.instance(i).setValue(noa, inst.instance(i).value(noa) - 
                m_attributeBases[noa]);
    }

所以我需要传输到我试图用来评估这个网络的其他系统的唯一值是最小值和最大值。对我来说幸运的是,过滤器上有一个方法,weka.filters.unsupervised.attribute.Normalize它返回处理数据集的最小值和最大值的双数组。然后我所要做的就是告诉多层感知器不要自动规范化我的数据,并使用过滤器单独处理它,这样我就可以提取最小值和最大值以及权重和其他所有内容发送到数据库。

于 2013-08-21T20:35:37.293 回答