Nano Hash - криптовалюты, майнинг, программирование

Распараллелить цикл MATLAB for для вычисления MLE

Я пытаюсь ускорить свой код MATLAB с помощью parfor, однако делаю это неправильно. Мой код довольно прост, я подгоняю некоторые данные, используя встроенную функцию MATLAB mle, используя различные начальные предположения для среднего (mm) и дисперсии (vv). onestagepdf2 — моя функция плотности вероятности.

Вот фрагмент кода:

mm=linspace(.1, 1, 2); % mean
vv=linspace(.1, 2, 2); % variance
N=length(mm);
n=length(vv);

pd=zeros(n*N,2);
ld = NaN*ones(n*N,1);

options = statset('MaxIter',10000, 'MaxFunEvals',10000);

parfor i=1:N  % pick a mean
    m=mm(i);
    parfor j=1:n  %  pick a variance
        v=vv(j);
        x0=[m,v];
        [p,conf1]=mle(data,'pdf',@onestagepdf2,'start',x0, 'upperbound', [Inf Inf],'lowerbound',[0 0],'options',options)
        pd(n*(i-1)+j,:)=p;  % store parameter values from mle
        l=onestagepdf2(data,p(1),p(2)); % evaluate pdf with parameter values
        ld(n*(i-1)+j)=sum(log(l));  % store likelihood value

    end
end

Ошибка, которую я получаю:

«Переменная pd в парфоре не может быть классифицирована».


Ответы:


1
pd = zeros(n, N, 2); %initialise culprits
ld= zeros(n,N);
parfor ii=1:N  % pick a mean
    m=mm(ii);
    for jj=1:n  %  Parallellise the second parfor
        v=vv(jj);
        x0=[m,v];
        [p,conf1]=mle(data,'pdf',@onestagepdf2,'start',x0, 'upperbound', [Inf Inf],'lowerbound',[0 0],'options',options)
        pd(ii, jj, :) = p;=p;  % store parameter values from mle
        l=onestagepdf2(data,p(1),p(2)); % evaluate pdf with parameter values
        ld(ii,jj)=sum(log(l));  % store likelihood value

    end
end

Как заявил @Trilarion, ваш pd действительно был виновником полученной вами ошибки. Вероятно, ld тоже не слишком хорош, с тем же синтаксисом, так что инициализируйте и его. Это произошло потому, что parfor хочет знать размер всех переменных в цикле < em>перед выполнением. То, что это фиксированный максимальный размер, неизвестно MATLAB, поскольку вы используете переменные цикла для «изменения» размера.

Вероятно, у вас были «оранжевые покачивания» под этими двумя строками (например, ошибки проверки орфографии), когда вы запускали это как цикл for, говорящий, что «размер pd увеличивается с каждой итерацией. Пожалуйста, рассмотрите предварительное выделение для скорости». Это требуется для parfor, поскольку порядок итераций не является последовательным, таким образом невозможно наращивать массивы.

Во-вторых, нельзя вкладывать parfor циклов. Вы можете использовать такие вещи, как функция с parfor и запускать ее в parfor, но это не даст вам ускорения, поскольку вы уже используете всех своих воркеров.

См. Экономия времени и памяти с помощью parfor в Matlab? для получения более общей информации о parfor особенно о скорости.

03.11.2015
  • Мне нужно инициализировать pd и ld внутри цикла parfor, а не снаружи? 03.11.2015
  • хм, нет. Действительно, вам нужно инициализировать их снаружи, мой плохой, я обновлю сообщение. 03.11.2015
  • n*(i-1)+j здесь не больше, чем n*N, поэтому размер переменной не увеличивается. Просто Matlab не уверен в этом. 03.11.2015
  • @Trilarion, это именно то, о чем я говорю. 03.11.2015

  • 2

    Вам нужна нарезанная выходная переменная, но Matlab недостаточно умен, чтобы определить, что n*(i-1)+j на самом деле разумно и не будет мешать асинхронной оценке.

    Просто сделайте это как отдельные измерения

    pd = zeros(n, N, 2);
    ...
      % in the loop
      pd(i, j, :) = p;
    

    Это будет работать.

    Обратите внимание, что Matlab не поддерживает вложенные парфоры. Однако они вам также не нужны, если N больше, чем количество воркеров. См. также документацию.

    03.11.2015
  • То же самое касается лд. 03.11.2015
  • @Adriaan Скажем, 4-8 рабочих и N, вероятно, больше, чем это, запрашивающему в любом случае не нужен второй параметр. Но ему все еще нужно расширить размерность pd и ld, чтобы заставить работать внешний параметр. 03.11.2015
  • это, казалось, решило проблему. У меня есть дополнительный вопрос: когда я печатаю max(ld), он печатает максимальное значение дважды, то есть -746.8349 -746.8349. Не могли бы вы объяснить, почему? 03.11.2015
  • @user3603290 user3603290 Если у вас есть новый вопрос, который существенно отличается от этого, задайте новый вопрос. Если один из ответов в этом посте решил вашу проблему, рассмотрите возможность принятия его. 03.11.2015
  • Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

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

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

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

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

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

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..