Matlab: как реализовать уравнение для динамической системы и временного ряда

Мне трудно понять метод кластеризации и сегментации биомедицинских изображений с использованием концепции временных рядов. Документ, на котором основан Вопрос: М. Lacomi et. др., Сегментация маммографических изображений на основе алгоритма хаотической кластеризации карт скачать ссылка.

В D-мерном пространстве есть набор N точек {r _i}. Каждой точке присваивается действительная переменная x _i в [0,1], а парные взаимодействия J _ij = exp [- (r _i - r _j) ^ 2 / 2a ^ 2], где a - местный масштаб длины. Изменение системы во времени дается  EQuation

Функция f очень похожа на функцию активации в нейронной сети. Это логистическая карта, которая представляет собой одномодальную и одномерную дискретную во времени нелинейную динамическую систему. Я ищу более быстрый и эффективный (векторизованный) способ применить уравнение (1), когда N = 1 миллион точек, которые являются особенностями изображений. t охватывает от 1 до 10 временных изменений. Я так и сделал, но не уверен, правильный ли код. Я случайным образом генерирую матрицу R размерности D = 50 и содержащую 100 точек данных.

N = 100;
D = 50;
T  =10;
R = rand(N,D);
x = zeros(N,T);
y(1) = rand();
for i = 1:N   %// for loop indicating the number of sample points
    y(i+1) = 1-2*y(i)^2; %/* the iterations of the map f */
    r_1(i) = R(i,:);
    r_2(i) = R(i+1,:);
    sum_j = 0.0;
    for t = 1:T
        x(i,:)= y;
        a = var(r(i));
        J = {exp(-(r_1(i) - r_2(i+1))^2)}/2a;
        sum_j = sum_j+J*(1-2*x(i+1,t)));
        x(i,t) =  (1/c(i))*(sum_j);
    end
end

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


person SKM    schedule 13.04.2016    source источник
comment
Ваш код явно не в порядке, он даже не работает без ошибок. Вам следует проверить его еще раз и убедиться, что вы разместили правильную версию.   -  person mikkola    schedule 15.04.2016


Ответы (1)


Я не думаю, что смогу дать простой окончательный ответ на этот вопрос, но я определенно могу дать вам несколько полезных советов:

  1. Вычислите матрицу J один раз заранее. Информация в нем статична, поэтому вы не хотите пересчитывать. То же самое с Ci.

  2. Часть sum(Jij*yj) на самом деле является произведением матрицы на вектор. Быстрее всего это можно сделать с помощью линейной алгебры, т.е. J*y.

  3. Векторизуйте функцию f: вместо выполнения f (x_i) для каждого элемента отдельно, выполните f (x) для всех сразу. Например. f(x) = 1-2*x.^2 с .^ вместо ^ выполняет оператор мощности для каждого элемента x.

  4. Вероятно, вы захотите поместить итерацию по времени в качестве внешнего цикла. Это единственный последовательный расчет, который вам нужно сделать. Все остальное вы хотите делать как можно больше одновременно (~ параллельно), используя векторизацию и линейную алгебру.

Это должно стать хорошей отправной точкой. Если после этого потребуется помощь по другим вопросам, обновите свой вопрос или оставьте комментарий. На данный момент это все, что я могу сделать. Отчасти потому, что ваш образец кода не очень ясен / описателен. Может быть, вы захотите добавить комментарии, если на то есть особые причины.

Удачи!

РЕДАКТИРОВАТЬ:

Пример кода:

% Jmod is a modification of the matrix J:
%    1. Jmod(i,j) = J(i,j)/C(i) ==> the division by Ci is included
%    2. Jmod(i,i) = 0 ==> the diagonal elements are zero such that the term
%       for i=j is not included in the sum.

% Memory allocation
x = zeros(N,T+1); 
y = zeros(N,T+1);

% Initialization with your choice of x0
x(:,1) = x0;

% Time iterations
for t=1:T 
    y(:,t) = 1 - 2*x(:,t).^2;
    x(:,t+1) = Jmod*y(:,t);         
end

На самом деле вам не нужны оба вектора x и y, но я использовал их в этом примере для ясности.

person tvo    schedule 19.04.2016
comment
Спасибо за ваш ответ. Часть, которая до сих пор неясна, - это уравнение (1), где выход x_i в t + 1 получается из входа x_j в t. Как применить функцию / карту f для выполнения этого расчета. Если бы вы могли предоставить код для уравнения (1) и шаги, которые вы обрисовали в общих чертах, используя небольшой массив, тогда я мог бы построить и расширить оттуда. Спасибо за ваше время и терпение. - person SKM; 19.04.2016
comment
Спасибо за ваше редактирование. И последний вопрос, прошу вас уточнить. Уравнение (1) имеет x_j в правой части, а другая точка данных x_i зависит от итерации x_j в момент времени t. i и j - две отдельные точки данных. Следует ли в коде применять переменную x отдельно к парам точек данных вместо выполнения x (:, t + 1)? Должен ли быть цикл для i и j, или код выполняет то же самое? - person SKM; 20.04.2016
comment
Затем все N выборок данных инициализируются одним и тем же скаляром x0. Должна ли инициализация быть разной для каждого x? т.е. должен быть вектор начальных значений x0, по одному для каждой выборки данных? - person SKM; 20.04.2016
comment
1) В общем случае произведение матрицы на вектор (с векторами x, y и матрицей A) выполняет следующие функции: y = Ax - ›y_j = sum_i A_ij x_i. Итак, написав уравнение. 1 с использованием произведения матрица-вектор учитывает влияние всех элементов x (t) на x (t + 1). - person tvo; 20.04.2016
comment
2) Согласно вашему вопросу, x - это вектор с длиной N, поэтому он содержит N элементов. Установив x(:,1) = x0, где x0 - вектор длины N, содержащий начальное состояние x (t), инициализируются все N значений x (t). - person tvo; 20.04.2016
comment
Привет еще раз. Извините за шумный звук. Я строю программу из вашего ответа и есть последняя путаница. Не могли бы вы это прояснить? В комментарии вы сказали, что x0 - это вектор начальных условий, поэтому будет N различных скаляров, каждый из которых представляет начальное условие. Я правильно понимаю? Спасибо за вашу постоянную помощь. - person SKM; 22.04.2016