Как уменьшить размерность вектора

У меня есть набор векторов. Я работаю над тем, чтобы уменьшить n-мерный вектор до унарного значения (1-d), скажем,

(x1,x2,....,xn) ------> y

Это единственное значение должно быть характеристическим значением вектора. Каждый уникальный вектор создает уникальное выходное значение. Какой из следующих методов подходит:

1-норма вектора - квадратный корень из суммы квадратов, которая измеряет евклидово расстояние от начала координат

2- вычислить хэш F, используя некоторые методы хеширования, избегая столкновения

3- используйте линейную регрессию для вычисления, y = w1*x1 + w2*x2 + ... + wn*xn - вряд ли будет хорошо, если нет хорошей зависимости входных значений от выхода

4-элементный метод извлечения, такой как PCA, который присваивает веса каждому из x1,x2,..xn на основе набора входных векторов

1 ответ

Из метода неясно, какие свойства вам нужны для этого преобразования, поэтому я предполагаю, что вам не нужно преобразование для сохранения каких-либо свойств, кроме уникальности и, возможно, обратимости.

Ни один из методов, которые вы предлагаете, в целом не может избежать столкновений:

  1. Норма - два вектора, указывающие в противоположных направлениях, имеют одинаковую норму.

  2. Хеш - если входные данные не известны априори - то, что обычно подразумевается под хеш-функцией, имеет конечное изображение, и у вас есть бесконечное число возможных векторов - бесполезно.

  3. Легко найти векторы, которые дают одинаковый результат для любого результата линейной регрессии (подумайте об этом).

  4. PCA - это особый вид линейного преобразования - следовательно, та же проблема, что и с линейной регрессией.

Так что - если вы просто ищете уникальность, вы можете "зачеркнуть" свои векторы. Один из способов сделать это - записать их в виде текстовых строк с различными координатами, разделенными специальным символом (подчеркивание, например). Затем возьмите двоичное значение этой строки в качестве вашего представления.

Если пробел важен и вам нужно более эффективное представление, вы можете подумать о более эффективной битовой кодировке: каждый символ в наборе 0,1,..., 9, '.', '' Может быть представлен 4 битами - шестнадцатеричная цифра (отобразите '.' в A и '' в B). Теперь закодируйте эту строку как шестнадцатеричное число, экономя половину пробела.

Другие вопросы по тегам