Генерация случайных индексных векторов - PullRequest
4 голосов
/ 24 апреля 2011

Мне нужно сгенерировать случайные индексные векторы (с большим числом измерений около 1000), которые были бы в основном редкими (в основном нулевыми значениями).Векторы могут содержать значения 1 (положительное измерение), -1 (отрицательное измерение) и 0. Эти векторы генерируются для каждого слова в корпусе текста.Что может быть лучшим способом достижения этого в Java, обеспечивая при этом случайность получающихся векторов?

Спасибо

Ответы [ 2 ]

1 голос
/ 24 апреля 2011

Чтобы сохранить вектор, сохраните список его ненулевых позиций и битов + 1 / -1. Вам потребуется байт для бита + 1 / -1.

Если вы действительно хотите сохранить как можно больше памяти, вы можете сохранить длинный BitSet , содержащий информацию + 1 / -1 для всех векторов вместе, и каждый вектор запомнит свой начальный индекс в BitSet.

Чтобы сгенерировать векторы, ортогональные другим, вы можете сделать:

 [0 1 0 0 -1 ...]
 [1 0 1 0 0 ...]  // zeros where the first vector is non-zero
 ...

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

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

0 голосов
/ 24 апреля 2011

Если вы хотите попробовать недорогой подход (с точки зрения программирования), то HashMap<Integer, Byte> или что-то близкое может создать приличный разреженный вектор.

...