在Weka多层感知器中提取用于归一化的值

时间:2013-08-21 18:46:25

标签: java matlab machine-learning neural-network weka

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

1 个答案:

答案 0 :(得分:1)

在深入了解WEKA源代码和文档之后......这就是我想出来的。即使在WEKA中有一个名为“Normalize”的过滤器,多层感知器也不会使用它,而是在内部使用一些看起来像这样的代码。

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上的一个方法,它返回分钟的双数组和已处理数据集的最大值。我所要做的就是告诉多层感知器不会自动标准化我的数据,并使用过滤器单独处理它,这样我就可以提取分钟和最大值以及权重和其他所有内容一起发送到数据库。