WedX - журнал о программировании и компьютерных науках

Как заполнить матрицу матрицами из их распределений по строкам и столбцам

Мне нужно заполнить матрицу значениями 1 и 0. Предоставляемые данные представляют собой размеры матрицы и распределение строк и столбцов 1 (через два разных вектора, поскольку они могут быть разными для каждого случая). Итак, у нас есть два вектора, v и h, элементы которых определены как:

v_i = i-th element of vector v. 

Указывает долю столбцов с весом i (доля столбцов от общего количества, содержащих i единиц).

fh_i = i-th element of vector h. 

Указывает долю строк с весом i (доля строк от общего количества, содержащих i единиц).

Учитываемая процедура подразумевается как алгоритм Маккея Нила. Состоит из заполнения матрицы по столбцам слева направо. Вес каждого столбца выбирается так, чтобы получить допустимое распределение 1. Расположение этих 1 в каждом файле выбирается случайным образом между теми, которые еще не заполнены.

Ниже прилагается мой код. Вы также можете найти на этой веб-странице документ PDF, с которым я сейчас консультируюсь, чтобы выполнить эту часть мой проект. Все, что я упомянул ранее, можно найти на страницах 10 и 11. Алгоритм Маккея реализован в псевдокоде на странице 14.

function H = MacKayNeal(N,r,v,h)
H = zeros(N*(1-r),N);
a = [];
for i = 1:length(v)
    for j = 1:(v(i)*N)
        a = [a,i];
    end
end
b = [];
for i = 1:length(h)
    for j = 1:(h(i)*(N*(1-r)))
        b = [b,i];
    end
end
for i = 1:N
   c = datasample(b,length(a(i)),'Replace',false);
   for j = 1:a(i)
       H(c(j),i) = 1;
   end
a = a - c;
end
%     while 1 % cycles removed
%         for i = 1:(N-1)
%             for j = (i+1):N
%                 if 1 %
%                 end
%             end
%         end
%     end              
end

Обратите внимание, что значения a и b соответственно относятся к переменным alpha и beta, используемым в псевдокоде прикрепленного текста. Их значения указывают количество 1 на столбец и файл в каждом случае.

В моем случае все шло нормально, пока я не выполнил вычитание a = a - c в строке 20. Я провел целый день, ломая себе голову над этим, и в итоге возникло два вопроса:

  • Почему это вычитание a = a - c, а не b = b - [one unity in each corresponding position from c]? Для меня было бы гораздо больше смысла в том, что появляется в теоретическом объяснении до псевдокода в PDF-файле, прикрепленном по ссылке.

  • Что произойдет, если вы выберете подмножество b, которое содержит как минимум два равных значения, чтобы выполнить следующее присвоение 1 в H матрице? Мне кажется, что это вполне реальная ситуация, в которой a_i 1 не будут добавлены, но меньше того.

Если кто-нибудь может также помочь мне с решением последней части задачи, той, которая ссылается в псевдокоде на стирание длины 4 'циклов (это просто означает, что в двух отдельных столбцах не может быть двух пар 1 занимая те же должности) тоже был бы очень благодарен.

В моем случае я работаю со следующими данными:

N = 100
k = 0.5
v = [0 0.17 0.03 0.2 0 0 0.17 0.3 0.03 0.1]
h = [0 0.1 0 0 0 0.7 0.2]

Для обоих векторов v и h их элементы могут принимать любое значение от 0 до 1, если их сумма равна 1 в обоих случаях, и также в обоих случаях первый элемент равен 0. Кроме того, k tan принимает любое значение от 0 до 1.

Заранее большое спасибо за внимание!


Редактировать 01.06.2017

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

В этом случае, учитывая h распределение, может быть только три разных значения (2, 6 и 7) для каждого элемента из β вектора. В тех случаях, когда αi больше трех (в нашем примере это может быть до десяти), вектор c будет иметь как минимум два равных значения, несмотря на попытки избежать этого в предложении «образец данных».

Я полагаю, это то, о чем вы имели в виду ранее, когда упоминали, что этот алгоритм не всегда может завершаться - но в этом случае он никогда не будет этого делать!


Редактировать 01/03/2017

Теперь у меня есть еще одна проблема, связанная с построением векторов a/b. Моя проблема в том, что когда N высокий, например N = 100, и, следовательно, размер нашей матрицы для r = 0.5 (50x100) у нас будет вектор, представляющий распределение весов столбцов длиной 1x100. Приведу один краткий пример. Например, у нас может быть распределение столбцов, состоящее из v_2 = 0.8258 (напомним, что согласно спецификациям v_1 = 0), а остальные значения до v_100 намного меньше, например около v_i = 0.0018 или около того в нашем случае.

В этом случае наш код не сработает, так как эти значения будут намного меньше 1 при умножении на N = 100 (подробнее см. Ниже предлагаемое мной решение). То есть не будет никаких столбцов с весом 1 или более, даже если сумма всех из них достигнет единицы согласно теории. К тому времени, когда алгоритм будет выполнен, индекс i не достигнет N = 100, а будет 82 для этого случая (и та же проблема происходит с векторами h / b). Чтобы лучше понять мою проблему, я рекомендую запустить свой код ниже со следующими параметрами:

N = 100;
r = 0.5;
v = [0 0.8258 0.0048 0.0033 0.0027 0.0024 0.0023 0.0022 0.0021 0.0020 0.0019 0.0019 0.0019 0.0019 0.0019 0.0019 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0018 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0016 0.0016 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0017 0.0016 0.0016 0.0016 0.0016 0.0017 0.0017 0.0017 0.0016 0.0017 0.0017 0.0016 0.0016 0.0016 0.0016 0.0017 0.0017 0.0017 0.0016 0.0016 0.0016 0.0017 0.0017 0.0017 0.0016 0.0017 0.0016 0.0016 0.0016 0.0016 0.0016 0.0017 0.0016 0.0017 0.0016 0.0016 0.0016 0.0016 0.0016 0.0016 0.0016 0.0017];
h = [0 0.0179 0.0102 0.0277 0.0392 0.0272 0.0027 0.0055 0.0148 0.0151 0.0137 0.0259 0.0103 0.0336 0.0386 0.0049 0.0065 0.0051 0.0081 0.0441 0.0298 0.0147 0.0243 0.0207 0.0198 0.0006 0.0287 0.0425 0.0088 0.0094 0.0368 0.0090 0.0181 0.0306 0.0158 0.0325 0.0108 0.0268 0.0163 0.0448 0.0395 0.0262 0.0097 0.0114 0.0283 0.0437 0.0103 0.0058 0.0249 0.0083];

Заранее большое спасибо и с наилучшими пожеланиями.


  • Будет полезно, если вы предоставите простой ввод и ожидаемый результат. 05.01.2017
  • Добрый вечер, Рахнема, Большое спасибо за быстрый ответ. Пожалуйста, ознакомьтесь с моими последними строчками кода. Там вы можете найти параметры, которые нужно передать моей функции. Ожидаемый результат должен быть матрицей, состоящей из «1» и «0». Спасибо за внимание! 06.01.2017
  • Я подумал об одном возможном ответе, но сначала хотел бы обсудить его осуществимость с вами. Что, если все параметры округлить до двух цифр? Возможно, сделав это до выражения суммы, если возможно, мы сможем избежать любых проблем, подобных тем, которые были указаны в моем последнем обновлении. 02.03.2017

Ответы:


1

Я считаю, что вы правы, и оба ваших пункта являются ошибками в конспектах лекции.

Думаю, будет больше смысла, если мы заменим:

c = random subset of β, of size αi
for j = 1 : αi do
   H(cj , i) = 1
end for
α = α − c

с участием

c = random distinct subset of β, of size αi (not allowed to return elements of the same value)
for j = 1 : αi do
   H(cj , i) = 1
end for
β = β − c

Раздел 3.2 НОВАЯ КОНСТРУКЦИЯ КОДОВ LDPC КОРОТКОЙ ДЛИНЫ ДЛЯ ПРОСТОГО ДЕКОДИРОВАНИЯ, Фатма А. Ньюэги , Yasmine A. Fahmy и Magdi MS El-Soudani содержит эту версию алгоритма (где u играет роль β)

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

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

Обратите внимание, что существует два основных варианта этого алгоритма:

Алгоритм 1

(Я считаю, что это оригинальный алгоритм Маккея Нила)

Вектор с длиной, равной количеству строк, хранит желаемый вес каждой строки.

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

Алгоритм 2

(Я считаю, что это обычное улучшение.)

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

Это делается путем подготовки вектора длины, равной общему количеству единиц во всей матрице. Элементы вектора соответствуют номерам строк.

Случайная выборка этого вектора дает набор номеров строк. Эти записи удаляются из вектора.

Так, например, если мы хотим в конечном итоге иметь четыре единицы в строке 2, тогда число 2 (соответствующее строке 2) появится в векторе четыре раза. Это означает, что строка 2 будет выбрана четыре раза и, следовательно, в ней будет четыре единицы.

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

Это означает, что если β = [1,1,2,2,3,3] и мы выберем вектор c из [2,3], то операция β-c должна дать результат [1,1,2,3].

05.01.2017
  • Добрый вечер Питер, Большое спасибо за быстрый ответ. Хотя у меня все еще есть один вопрос по поводу вашего вычитания «β = β - c». Разве это вычитание не должно состоять только из одной единицы из тех позиций β, которые были взяты с помощью команды 'datasample'? Что касается этого, я до сих пор не знаю, как решить эту проблему. Я имею в виду, что `` образец данных '' может предоставить вам некоторые значения из β (а не их положения, более того, β может легко иметь несколько повторяющихся значений), поэтому вы не можете выполнить вычитание, поскольку оба вектора могут иметь разные размеры. Надеюсь, я ясно дал понять . С наилучшими пожеланиями! 06.01.2017
  • Как ни странно, я думаю, что может быть два варианта алгоритма. Я добавил некоторые объяснения этих двух. Я считаю, что в вашем комментарии предлагается использовать алгоритм 1. Это нормально для использования (он может быть немного медленнее), но я считаю, что псевдокод относится к использованию алгоритма 2. 06.01.2017
  • Добрый вечер, Питер, еще раз спасибо за вашу поддержку. Я обнаружил несколько новых проблем, поэтому отредактировал свое первое сообщение, включая снимок экрана моего экрана Matlab. Прошу прощения, если стиль не точен - я впервые публикую в Stackoverflow. Что касается моей проблемы, алгоритм не завершается, потому что, как я предполагаю, β заканчивает свои значения до того, как это произойдет. Кроме того, при увеличении αi некоторые значения β не могут не повторяться в c. Я полагаю, вы имели в виду это, когда упомянули, что алгоритм не всегда завершается. Но будет ли это когда-нибудь в таком случае? С наилучшими пожеланиями 06.01.2017
  • Я понимаю что ты имеешь ввиду. Интересно, нужно ли нам иначе интерпретировать входной вектор h? Кажется, имеет больше смысла, если вектор h определяет желаемый вес для каждой строки. Таким образом, чтобы иметь 100% строк с весом 50%, мы должны ввести h = [0.5,0.5, ..., 0.5,0.5] вместо текущего [0,0,0,0,0,1,0 , 0]. Этот вектор h не будет единичной суммой в 1, но, похоже, имеет больше смысла с остальной частью алгоритма. Тем не менее, это начинает казаться слишком большим количеством исправлений, и теперь я беспокоюсь, что привел вас в неправильном направлении, извините! 06.01.2017
  • Вы не должны извиняться! Фактически, я очень благодарен вам за то, что вы помогли мне :) Вы придумали другой вариант реализации этого, определив h таким образом? Я просто пытался следовать инструкциям, изложенным в документе, на который я впервые ссылался в своем сообщении (вы можете найти его здесь; страница 10 - начало обсуждения алгоритма Маккея и страница 14, где вы можете найти соответствующий псевдокод). Но я полагаю, что должны быть и другие варианты! 07.01.2017
  • Новые материалы

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

    Работа с цепями Маркова, часть 4 (Машинное обучение)
    Нелинейные цепи Маркова с агрегатором и их приложения (arXiv) Автор : Бар Лайт Аннотация: Изучаются свойства подкласса случайных процессов, называемых дискретными нелинейными цепями Маркова..

    Crazy Laravel Livewire упростил мне создание электронной коммерции (панель администратора и API) [Часть 3]
    Как вы сегодня, ребята? В этой части мы создадим CRUD для данных о продукте. Думаю, в этой части я не буду слишком много делиться теорией, но чаще буду делиться своим кодом. Потому что..

    Использование машинного обучения и Python для классификации 1000 сезонов новичков MLB Hitter
    Чему может научиться машина, глядя на сезоны новичков 1000 игроков MLB? Это то, что исследует это приложение. В этом процессе мы будем использовать неконтролируемое обучение, чтобы..

    Учебные заметки: создание моего первого пакета Node.js
    Это мои обучающие заметки, когда я научился создавать свой самый первый пакет Node.js, распространяемый через npm. Оглавление Глоссарий I. Новый пакет 1.1 советы по инициализации..

    Забудьте о Matplotlib: улучшите визуализацию данных с помощью умопомрачительных функций Seaborn!
    Примечание. Эта запись в блоге предполагает базовое знакомство с Python и концепциями анализа данных. Привет, энтузиасты данных! Добро пожаловать в мой блог, где я расскажу о невероятных..

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


    © 2024 wedx.ru, WedX - журнал о программировании и компьютерных науках
    Для любых предложений по сайту: wedx@cp9.ru