Как уменьшить размерность вектора
У меня есть набор векторов. Я работаю над тем, чтобы уменьшить n-мерный вектор до унарного значения (1-d), скажем,
(x1,x2,....,xn) ------> y
Это единственное значение должно быть характеристическим значением вектора. Каждый уникальный вектор создает уникальное выходное значение. Какой из следующих методов подходит:
1-норма вектора - квадратный корень из суммы квадратов, которая измеряет евклидово расстояние от начала координат
2- вычислить хэш F, используя некоторые методы хеширования, избегая столкновения
3- используйте линейную регрессию для вычисления, y = w1*x1 + w2*x2 + ... + wn*xn - вряд ли будет хорошо, если нет хорошей зависимости входных значений от выхода
4-элементный метод извлечения, такой как PCA, который присваивает веса каждому из x1,x2,..xn на основе набора входных векторов
1 ответ
Из метода неясно, какие свойства вам нужны для этого преобразования, поэтому я предполагаю, что вам не нужно преобразование для сохранения каких-либо свойств, кроме уникальности и, возможно, обратимости.
Ни один из методов, которые вы предлагаете, в целом не может избежать столкновений:
Норма - два вектора, указывающие в противоположных направлениях, имеют одинаковую норму.
Хеш - если входные данные не известны априори - то, что обычно подразумевается под хеш-функцией, имеет конечное изображение, и у вас есть бесконечное число возможных векторов - бесполезно.
Легко найти векторы, которые дают одинаковый результат для любого результата линейной регрессии (подумайте об этом).
PCA - это особый вид линейного преобразования - следовательно, та же проблема, что и с линейной регрессией.
Так что - если вы просто ищете уникальность, вы можете "зачеркнуть" свои векторы. Один из способов сделать это - записать их в виде текстовых строк с различными координатами, разделенными специальным символом (подчеркивание, например). Затем возьмите двоичное значение этой строки в качестве вашего представления.
Если пробел важен и вам нужно более эффективное представление, вы можете подумать о более эффективной битовой кодировке: каждый символ в наборе 0,1,..., 9, '.', '' Может быть представлен 4 битами - шестнадцатеричная цифра (отобразите '.' в A и '' в B). Теперь закодируйте эту строку как шестнадцатеричное число, экономя половину пробела.