2D нормализация координат - PullRequest
4 голосов
/ 05 октября 2010

Мне нужно реализовать функцию, которая нормализует координаты.Я определяю нормализацию как (пожалуйста, предложите лучший термин, если я не прав):

Отображение записей набора данных из их естественного диапазона в значения между 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 ]

6 голосов
/ 05 октября 2010

Кажется, вы хотите, чтобы каждый вектор (1D, 2D или ND) имел длину <= 1.
Если это единственное требование, вы можете просто разделить каждый вектор на длину самого длинного.

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

Это сделает самый длинный вектор в списке результатов иметь длину 1.

Но это не будет эквивалентно вашему текущему коду для одномерного случая, поскольку вы не можете найти минимум или максимум в наборе точек на плоскости. Таким образом, нет delta.

2 голосов
/ 05 августа 2018

Я публикую свой ответ как ответ, потому что у меня недостаточно очков, чтобы оставить комментарий.

Моя интерпретация вопроса: Как нам нормализовать координаты набора точек в 2-мерном пространстве?

Операция нормализации включает «сдвиг и масштаб» . В случае 1-мерного пространства это довольно просто и интуитивно понятно (как указал @Mizipzor).

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

В этом случае мы сначала смещаем значение на расстояние minX , а затем масштабируем его на диапазон, заданный ( Maxx-Minx) . Операция shift гарантирует, что минимум перемещается к 0, а операция scale сжимает распределение так, что распределение имеет верхний предел 1

В случае 2d простого деления на наибольшее измерение не достаточно. Почему?

Рассмотрим упрощенный случай с двумя точками, как показано ниже. enter image description here Максимальным значением любого измерения является Y значение точки B и это 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.

Предпочтительный подход для нормализации 2d координат

Чтобы получить более равномерное распределение, мы должны выполнить операцию «сдвига» вокруг минимума всех значений X и минимума всех значений Y. Это может быть сделано также относительно среднего значения X и среднего значения Y. Учитывая приведенный выше пример,

  • минимум всех X составляет 5000
  • минимум всех Y составляет 8000

Шаг 1 - Сдвиг

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

Шаг 2 - операция масштабирования

Чтобы уменьшить значения, нам нужен максимум. Мы могли бы использовать диагональ AB, длина которой 2000

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)

Как изменится эта логика, если у нас более двух измерений?

Концепция остается прежней. - Находим минимальное значение в каждом из измерений (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)
1 голос
/ 05 октября 2010

Простая идея: выяснить, какое измерение больше, и нормализовать в этом измерении. Второе измерение может быть вычислено с использованием отношения. Таким образом, соотношение сохраняется, и ваши значения находятся в диапазоне от 0 до 1.

...