c# - 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值内。orig
norm
所以我最终要寻找的是一种将 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 Scaling
min = 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 呢?
解决方案
找到了答案。在仔细阅读文档(这让我非常困惑)之后,我遇到了这句话:
LinearNorm 元素的序列定义了逐步线性插值函数的点序列。该序列必须至少包含两个元素。在 NormContinous 中,元素 LinearNorm 必须严格按 orig 的升序值排序。
这基本上解释了一切。PMML 中的归一化是通过使用只有 2 个点的逐步插值来完成的。所以实际上只是一个简单的转换函数。
在归一化到 0-1 范围的情况下,它甚至变得更容易,因为这两个点将始终位于x1=0
和x2=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 执行器引擎并陷入这个话题的人。
推荐阅读
- ios - Metal Tessellation on subdivided quad
- ios - 广播上传扩展正在抑制其他应用程序的音量输出
- python - django-sendgrid-v5 一切似乎工作正常,但邮件没有送达
- windows - 在 Windows 上安装 Memcached
- java - 如何制作Spring Boot多模块项目的单个war文件
- angular - 提交按钮上的离子表单错误处理
- c# - 如何从 C# 中的特定行将 Excel 文件导入 DataGridView?
- r - 如何在马赛克图中更改 R VCD 包中的标签?
- python - 在 argparse 中传递不同的参数组合
- r - 用多个标签绘制条形图?