Существует ли быстрый способ отбора образцов из подгруппы GLn? - PullRequest
6 голосов
/ 17 мая 2011

Правила этой проблемы довольно специфичны, потому что я на самом деле смотрю на подмножество GLn, где векторы строк и столбцов должны иметь определенную форму (назовите эти векторы valid - примеры ниже), поэтому, пожалуйста, потерпите меня. Вот правила:

  1. Вы можете случайным образом выбрать правильный ненулевой вектор длины n.

  2. Учитывая действительные векторы v1, v2, ..., vk, вы можете определить, являются ли формируемые ими неполные столбцы префиксами действительных векторов (например, встречается ли [v1_1 v2_1 ... vk_1] в качестве первых k записей действительного вектора), используя функцию isPrefix.

  3. Учитывая действительные векторы v1, v2, ..., vk, вы можете определить, являются ли они линейно зависимыми, используя функцию areIndependent.

Целью является выборка из этого подмножества GLn равномерно случайным образом. Вот наивное решение, которое терпит неудачу:

    Step 1: Select a valid v1 uniformly at random. 
            If isPrefix(v1) then Go to Step 2.
            Otherwise repeat Step 1.

    Step 2: Select a valid v2 uniformly at random. 
            If areIndependent(v1,v2) & isPrefix(v1,v2), then go to Step 3. 
            Otherwise, repeat Step 2.

    ...

    Step n: Select a valid vn uniformly at random. 
            If areIndependent(v1,v2,...,vn) & isPrefix(v1,v2,...,vn), then END. 
            Otherwise, repeat Step n.

Проблема с этим потенциальным решением состоит в том, что он может застрять в бесконечном цикле в не слишком маловероятном событии, которое areIndependent(v1,v2,...,vk) & isPrefix(v1,v2,...,vk) правильно возвращает TRUE, но нет способа завершить этот k-кортеж для линейно независимый действительный n-кортеж. Типичным примером этого является случай, когда k=n-1 и существует уникальный действительный вектор vn, такой, что isPrefix(v1,v2,...,vn) равен TRUE, но этот вектор не независимо от предыдущих n-1 векторов.

Поэтому мне нужно каким-то образом добавить, чтобы сделать резервную копию шага или двух, когда я нахожусь в этом цикле, но я не обязательно знаю, когда я в нем. Я ищу решение по следующим направлениям: Если шаг k не пройден f(k) раз для некоторой явной функции f, которая может зависеть от распределения действительных векторов, то вернитесь к шагу k-1 (или даже дальше, каким-то явным образом).

Любые предложения, комментарии, ссылки и т. Д. Будет принята с благодарностью! Спасибо!

Примеры:

Я на самом деле ищу общий справочник или руководство для того, как продолжить выборку. У меня есть несколько примеров допустимых векторов, по которым я хотел бы сделать это, и для меня более полезно иметь возможность сделать это самостоятельно в конечном счете, чем перечислять каждый пример и иметь решения хеш-сообщества сообщества SO. Однако, чтобы быть конкретными и дать представление о трудностях, приведенных ниже, приведем один пример:

Матрицы знаковых переменных : вектор действителен, если все его записи равны 0, -1, 1, ненулевые записи чередуются между 1 и -1, а сумма записей равна 1. Например, каждая матрица перестановок будет состоять из действительных векторов, а также следующего:

 0  1  0
 1 -1  1
 0  1  0

Отдельные записи : вектор действителен, если он имеет разные записи. Это особенно раздражает, потому что условие применяется как к строкам, так и к столбцам.

Еще раз спасибо всем, кто смотрел на это!

1 Ответ

3 голосов
/ 17 мая 2011

Я подозреваю, что вам, возможно, придется перейти к алгоритму Марковской цепи Монте-Карло - http://en.wikipedia.org/wiki/Metropolis%E2%80%93Hastings_algorithm - не обязательно для скорости, но убедитесь, что ваши случайные выборки разумно распределены.

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

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

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

Возможно, вам придётся кодировать разные подходы для разных правил валидности, и вам придется беспокоиться осколько времени понадобится вашей цепочке Маркова, чтобы «сжечь» и стать достаточно случайным.Есть одно (вроде) исключение из более позднего момента.Если вы пытаетесь определить хвостовую вероятность, чтобы исключить возможность того, что данная конфигурация была выбрана случайным образом, вы можете запустить свою цепь Маркова с этой точки, потому что - по нулевой гипотезе - эта точка уже выбрана случайным образом, так что есливсе ваши сгенерированные значения имеют большую статистику, чем эта начальная точка, что-то подозрительное происходит.

...