首页 > 解决方案 > PMML中NormContinous的orig、norm属性的计算

问题描述

概述

我目前正在使用 c# 开发规范化 PMML-Model 执行器。

这些 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 值来规范化/非规范化我的字段?

进一步说明

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

我尝试使用Min-Max 归一化方法(又名)将数据集的属性归一化为0-1 的范围。使用数据分析工具 Knime 我可以做到这一点并将我的“缩放”导出为 PMML 模型。(示例是上面提供的 XML)Feature Scaling

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

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

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

额外信息

[为什么首先进行这种“编码”似乎是因为计算速度的原因(这在我的场景中并不重要)并且更容易对 0-1 以外的范围的最小/最大规范化信息进行编码。]

示例 #1

举个例子:假设我想将 [0, 1, 2, 4, 8] 的数组归一化到 0-1 的范围内。显然,答案是 [0, 0.125, 0.25, 0.5, 1],由Feature Scalingmin = 0, max = 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 呢?

标签: c#mathpmml

解决方案


找到了答案。在仔细阅读文档(这让我非常困惑)之后,我遇到了这句话:

LinearNorm 元素的序列定义了逐步线性插值函数的点序列。该序列必须至少包含两个元素。在 NormContinous 中,元素 LinearNorm 必须严格按 orig 的升序值排序。

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

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

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

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 执行器引擎并陷入这个话题的人。


推荐阅读