Miz*_*zor 4 language-agnostic algorithm math coordinate-transformation
我需要实现一个规范化坐标的函数.我将normalize定义为(如果我错了,请建议一个更好的术语):
将数据集的条目从其自然范围映射到0到1之间的值.
现在这在一个方面很容易:
static List<float> Normalize(float[] nums)
{
float max = Max(nums);
float min = Min(nums);
float delta = max - min;
List<float> li = new List<float>();
foreach (float i in nums)
{
li.Add((i - min) / delta);
}
return li;
}
Run Code Online (Sandbox Code Playgroud)
我也需要一个2D版本,并且必须保持宽高比不变.但我有一些麻烦搞清楚数学.
虽然发布的代码在C#中,但答案不一定是.
提前致谢.:)
看起来你希望每个矢量(1D,2D或ND)都有长度<= 1.
如果这是唯一的要求,您可以将每个向量除以最长的长度.
double max = maximum (|vector| for each vector in 'data');
foreach (Vector v : data) {
li.add(v / max);
}
Run Code Online (Sandbox Code Playgroud)
这将使结果列表中最长的向量具有长度1.
但这不等同于您当前的1维情况代码,因为您无法在平面上的一组点中找到最小值或最大值.因此,没有delta.
我发布我的回复作为答案,因为我没有足够的分数来发表评论。
我对这个问题的解释:我们如何规范化二维空间中一组点的坐标?
归一化操作涉及“移位和缩放”操作。在1 维空间的情况下,这是相当简单和直观的(正如@Mizipzor 所指出的)。
normalizedX=(originalX-minX)/(maxX-minX)
Run Code Online (Sandbox Code Playgroud)
在这种情况下,我们首先转换法通过的距离的值其minX然后缩放通过由给定的范围内它(maxX的-其minX) 。所述换档操作确保最小移动到0,比例操作南瓜的分布,使得分布具有1的上限
在 2d 的情况下,仅仅除以最大维度是不够的。为什么?
考虑只有 2 个点的简化情况,如下所示。
任何维度的最大值是B点的Y值和这个10000。
Coordinates of normalized A=>5000/10000,8000/10000 ,i.e 0.5,0.8
Coordinates of normalized A=>7000/10000,10000/10000 ,i.e 0.7,1.0
Run Code Online (Sandbox Code Playgroud)
X 和 Y 值都为 0 和 1。但是,归一化值的分布远非均匀。最小值仅为 0.5。理想情况下,这应该更接近于 0。
标准化二维坐标的首选方法
为了获得更均匀的分布,我们应该围绕所有 X 值的最小值和所有 Y 值的最小值进行“移位”操作。这也可以围绕 X 的平均值和 Y 的平均值来完成。考虑到上面的例子,
步骤 1 - 移位操作
A=>(5000-5000,8000-8000), i.e (0,0)
B=>(7000-5000,10000-8000), i.e. (2000,2000)
Run Code Online (Sandbox Code Playgroud)
第 2 步 - 缩放操作
要缩小这些值,我们需要一些最大值。我们可以使用长度为 2000 的对角线 AB
A=>(0/2000,0/2000), i.e. (0,0)
B=>(2000/2000,2000/2000)i.e. (1,1)
Run Code Online (Sandbox Code Playgroud)
当分数超过 2 分时会发生什么?
方法仍然相似。我们找到适合所有点的最小边界框的坐标。
.
length of diagonal=sqrt((maxX-minX)*(maxX-minX) + (maxY-minY)*(maxY-minY))
normalized X = (originalX - minX)/(length of diagonal)
normalized Y = (originalY - minY)/(length of diagonal)
Run Code Online (Sandbox Code Playgroud)
如果我们有两个以上的维度,这个逻辑会如何变化?
这个概念保持不变。- 我们在每个维度 (X,Y,Z) 中找到最小值 - 我们在每个维度 (X,Y,Z) 中找到最大值 - 计算对角线的长度作为比例因子 - 使用移动原点的最小值。
length of diagonal=sqrt((maxX-minX)*(maxX-minX)+(maxY-minY)*(maxY-minY)+(maxZ-minZ)*(maxZ-minZ))
normalized X = (originalX - minX)/(length of diagonal)
normalized Y = (originalY - minY)/(length of diagonal)
normalized Z = (originalZ - minZ)/(length of diagonal)
Run Code Online (Sandbox Code Playgroud)