2D坐标归一化

时间:2010-10-05 08:45:59

标签: algorithm language-agnostic 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;
    }

我也需要一个2D版本,并且必须保持宽高比不变。但我有一些麻烦搞清楚数学。

虽然发布的代码在C#中,但答案不一定是。

提前致谢。 :)

3 个答案:

答案 0 :(得分:5)

您似乎希望每个矢量(1D,2D或ND)的长度为<= 1 如果这是唯一的要求,你可以将每个向量除以最长的长度。

double max = maximum (|vector| for each vector in 'data');
foreach (Vector v : data) {
    li.add(v / max);
}

这将使结果列表中最长的向量长度为​​1。

但是这不等于你当前的1维情况代码,因为你无法在平面上的一组点中找到最小值或最大值。因此,没有delta

答案 1 :(得分:1)

简单的想法:找出哪个维度更大并在此维度中标准化。可以通过使用比率来计算第二维度。这样就保持了比例,你的值在0到1之间。

答案 2 :(得分:1)

我将自己的回复发布为答案,因为我没有足够的观点发表评论。

我对这个问题的解释:我们如何标准化二维空间中一组点的坐标?

归一化操作涉及“移位和缩放” 操作。对于一维空间,这非常简单直观(如@Mizipzor指出的那样)。

normalizedX=(originalX-minX)/(maxX-minX)

在这种情况下,我们先移动该值达 minX 的距离,然后缩放该值,该范围由< strong>(maxX-minX)。 shift 操作可确保最小值移至0,而 scale 操作可挤压分布,以使分布的上限为1

在2d的情况下,仅将其除以最大尺寸是不够的。为什么?

仅用2点考虑简化情况,如下所示。 enter image description here 任何维度的最大值是点 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

X和Y值都为0和1。但是,归一化值的分布远非均匀。最小值仅为0.5。理想情况下,该值应接近0。

标准化二维坐标的首选方法

要获得更均匀的分布,我们应该围绕所有X值的最小值和所有Y值的最小值进行“移位”操作。这也可以围绕X的平均值和Y的平均值进行。考虑以上示例,

  • 所有X的最小值为5000
  • 所有Y的最小值为8000

第1步-Shift操作

A=>(5000-5000,8000-8000), i.e (0,0)
B=>(7000-5000,10000-8000), i.e. (2000,2000)

第2步-规模操作

要缩小数值,我们需要一些最大值。我们可以使用长度为2000的对角线AB

A=>(0/2000,0/2000),     i.e. (0,0)
B=>(2000/2000,2000/2000)i.e. (1,1)

当得分超过2时会发生什么? enter image description here  该方法仍然相似。我们找到适合所有点的最小边界框的坐标。

  • 我们从所有点中找到X的最小值(MinX)和Y的最小值(MinY),然后执行 shift 操作。这样会将原点更改为边界框的左下角。
  • 我们从所有点中找到X的最大值(MaxX)和Y的最大值(MaxY)。
  • 我们计算对角线连接的长度(MinX,MinY)和(MaxX,MaxY),并使用此值进行 scale 操作。

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)

如果我们有2个以上的维度,此逻辑将如何改变?

概念保持不变。  -我们在每个尺寸(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)