PMML中NormContinous的orig、norm属性的计算

Calculation of orig, norm attributes of NormContinous in PMML

概览

我目前正在使用 c# 编写规范化 PMML 模型执行程序。

这些 PMML 规范化模型如下所示:

 <TransformationDictionary>
    <DerivedField displayName="BU01" name="BU01*" optype="continuous" dataType="double">
      <Extension name="summary" extender="KNIME" value="Min/Max (0.0, 1) normalization on 17 column(s)"/>
      <NormContinuous field="BU01">
        <LinearNorm orig="0.0" norm="-0.6148417019560395"/>
        <LinearNorm orig="1.0" norm="-0.6140350877192982"/>
      </NormContinuous>
    </DerivedField>
(...)

我知道最小-最大归一化在理论上是如何工作的

z_i = (x_i - min(x)) / (max(x) - min(x))

将数据集归一化到 0-1 的范围内,显然不难反转这个等式。

问题

因此,为了执行规范化和反规范化,我必须以某种方式将这个原始规范值转换为最小值、最大值。但我只是无法弄清楚这些 orig/norm 值是如何计算的以及它们与 min/max.

的关系

问题

所以我问是否有人知道将 orig/norm 转换为 min/max 并返回的方程式。或者有人能够解释如何直接将 orig/norm 值用于 normalize/denormalize 我的字段?

进一步说明

编辑:好像我没有说清楚问题到底是什么,所以这是另一种方法:

我尝试将数据集标准化属性放入0-1[=73]的范围内=] 使用 Min-Max normalization method(又名 Feature Scaling)。使用数据分析工具 Knime 我可以做到这一点,并且 将我的 "scaling" 导出为 PMML 模型。 (这方面的例子是上面提供的 XML)

使用这些标准化属性,我训练了我的 MLP 模型。现在,如果我将我的 MLP 模型导出为 PMML,我必须在计算预测时将标准化值放入并输出标准化输出。 (计算 MLP 网络已经有效)

在 Knime 无法为我执行此规范化的部署场景中,我想使用我的规范化模型。如前所述,我确实知道 Feature Scaling 背后的理论,并且可以轻松计算 de-/normalization 如果我提供了我的属性的 min 和 max。问题是 PMML 还有另一个让我们说 "notation" 来保存这个最小-最大信息,它以某种方式在 orignorm 值内。

所以我最终要寻找的是一种将 orig/norm 转换为 min/max 或 min/max 信息如何 "encoded" 转换为 orig/norm 值的方法。

额外信息

[为什么这个 "encoding" 首先完成似乎是因为计算速度的原因(这在我的场景中并不重要)并且更容易编码 min/max 以外的范围的规范化信息0-1.]

示例 #1

举个例子: 假设我想将 [0, 1, 2, 4, 8] 的数组归一化到 0-1 的范围内。很明显,答案是 [0, 0.125, 0.25, 0.5, 1],由 Feature Scaling 计算得出,最小值 = 0,最大值 = 8。简单。但是现在如果我看一下 PMML 规范化模型:

<TransformationDictionary>
  <DerivedField displayName="column1" name="column1*" optype="continuous" dataType="double">
    <Extension name="summary" extender="KNIME" value="Min/Max (0.0, 1) normalization on 1 column(s)"/>
    <NormContinuous field="column1">
      <LinearNorm orig="0.0" norm="0.0"/>
      <LinearNorm orig="1.0" norm="0.125"/>
    </NormContinuous>
  </DerivedField>
</TransformationDictionary>

示例 #2

[1, 2, 4, 8] -> [0, 0.333, 0.667, 1] 有:

<TransformationDictionary>
  <DerivedField displayName="column1" name="column1*" optype="continuous" dataType="double">
    <Extension name="summary" extender="KNIME" value="Min/Max (0.0, 1) normalization on 1 column(s)"/>
    <NormContinuous field="column1">
      <LinearNorm orig="0.0" norm="-0.3333333333333333"/>
      <LinearNorm orig="1.0" norm="0.0"/>
    </NormContinuous>
  </DerivedField>
</TransformationDictionary>

问题

那么我应该如何使用 orig/norm 缩放或根据这些值计算 min/max?

我要说的取决于你(min, max)的意思。

我假设 min 等于总计的 0.5% 低于的值,max 等于总计的 0.5% 高于的值。

如果我们同意这一点,则对称正态分布的平均值约为 mean ~ (max+min)/2。 (你称均值为原点。)

六个标准差包含 99% 的正态分布,因此标准差约为 sigma ~ (max-min)/6.

归一化z = (x - mean)/sigma.definition.

使用这些值,您可以让自己回到非规范化分布。

找到答案了。在仔细阅读 Documentation 之后(在我看来这非常令人困惑)我遇到了这句话:

The sequence of LinearNorm elements defines a sequence of points for a stepwise linear interpolation function. The sequence must contain at least two elements. Within NormContinous the elements LinearNorm must be strictly sorted by ascending value of orig.

这基本上说明了一切。 PMML 中的归一化是通过使用只有 2 个点的逐步插值来完成的。所以其实只是一个简单的转换函数。

在归一化到 0-1 范围的情况下,它甚至变得更容易,因为 两个点 将始终位于 x1=0x2=1 (原始值)。因此它们的 y 轴截距总是在 orig=0 范数值。就函数的斜率而言,也很容易通过 slope = (y2-y1)/(x2-x1) = (y2-y1)/(1-0) = y2-y1 计算,这只是 2 个标准值。

因此,为了得到我们的插值函数,它始终是一个多项式,我们只需计算:

f(x) = ax + b = (y2-y1)x + y1 = (norm(orig=1)-norm(orig=0) * x + norm(orig=0) 这用于规范化

现在我们可以计算倒数了:

x = (f(x) - norm(orig=0)) / (norm(orig=1)-norm(orig=0)) 这用于去规范化

希望这对将来也将经历实现自己的 PMML 执行器引擎的麻烦并陷入此主题的每个人有所帮助。