Как программировать в Matlab для получения матрицы вероятности перехода?

У меня есть последовательность x= [12,14,6,15,15,15,15,6,8,8,18,18,14,14], поэтому я хочу сделать матрицу вероятности перехода. Матрица вероятности перехода рассчитывается по уравнению, т.е. вероятность =(количество пар x(t), за которыми следует x(t+1))/(количество пар x(t), за которыми следует любое состояние). Матрица должна быть как ниже

                  6      8    12     14     15      18

           6      0     1/2   0       0     1/2     0
           8      0     1/2   0       0      0     1/2
           12     0      0    0       1      0      0
           14    1/2     0    0      1/2     0      0
           15    1/4     0    0       0     3/4     0
           18     0      0    0       0     1/2    1/2

с помощью следующего кода я могу сделать

m = max(x);
n = numel(x);
y = zeros(m,1);
p = zeros(m,m);
for k=1:n-1
    y(x(k)) = y(x(k)) + 1;
    p(x(k),x(k+1)) = p(x(k),x(k+1)) + 1;
end
p = bsxfun(@rdivide,p,y); p(isnan(p)) = 0;

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

3 ответа

x=[12,14,6,15,15,15,15,6,8,8,18,18,14,14]; %discretized driving cycle
n=numel(x);%total no of data points in driving cycle
j=0;
z=unique(x); % unique data points in the driving cycle and also in arranged form
m=numel(z); % total number of unique data points
N=zeros(m); % square matrix for counting all unique data points

for k=1:1:m; % using loop cycle for unique data points all combinations; for this k is used
    for l=1:1:m;
        for i=1:1:n-1;
          j=i+1;
            if x(i)== z(k) & x(j)==z(l);
              N(k,l) = N(k,l)+1;
            end
         i=i+1;
        end
     l=l+1;
    end
  k=k+1;
end
N
s=sum(N,2);
Tpm= N./s %transition probability matrix

Шаг 1 - организовать данные и создать пустую таблицу переходов

x= [12,14,6,15,15,15,15,6,8,8,18,18,14,14] 
xind = zeros(1,length(x));
u = unique(x) % find unique elements and sort
for ii = 1:length(u)
    xmask = x==u(ii); % locate all elements of a single value
    xind = xind+ii*xmask; % number them in the order listed in u
end

Вывод помечен цепью Маркова (элементы являются метками вместо значимых значений)

>> u

u =

     6     8    12    14    15    18

>> xind

xind =

     3     4     1     5     5     5     5     1     2     2     6     6     4     4

Шаг 2 - построить таблицу "от-до" для каждого прыжка

>> T = [xind(1:end-1);xind(2:end)]

T =

     3     4     1     5     5     5     5     1     2     2     6     6     4
     4     1     5     5     5     5     1     2     2     6     6     4     4

Каждый столбец является переходом. Первая строка - метка "от", вторая строка - метка "на".

Шаг 3 - подсчитайте частоты и создайте таблицу переходов

p = zeros(length(u));
for ii = 1:size(T,2)
    px = T(1,ii); % from label
    py = T(2,ii); % to label
    p(px,py) = p(px,py)+1;
end

Вывод агрегированной частотной таблицы. Каждый элемент является количеством прыжков. Номер строки "от", а номер столбца "до".

>> p

p =

     0     1     0     0     1     0
     0     1     0     0     0     1
     0     0     0     2     0     0
     2     0     0     1     0     0
     1     0     0     0     3     0
     0     0     0     1     0     1

Например, 3 означает 3 перехода с 5-й метки на 5-ю метку (фактическое значение 15 в 15)

Шаг 4 - нормализуйте векторы строк, чтобы получить таблицу вероятностей

>> p./repmat(sum(p,2),1,length(u))

ans =

         0    0.5000         0         0    0.5000         0
         0    0.5000         0         0         0    0.5000
         0         0         0    1.0000         0         0
    0.5000         0         0    0.5000         0         0
    0.2500         0         0         0    0.7500         0
         0         0         0    0.5000         0    0.5000

версия альтернативного цикла

for ii = 1:size(p,1)
    count = sum(p(ii,:));
    p(ii,:) = p(ii,:)/count;
end
%%Sample matrix
p=magic(8)
%%Fill rows and cols 3,5 with 0's
p([3 5],:)=0
p(:,[3 5])=0

%%The code

lb=[]
for k = [length(p):-1:1]
  if any(p(k,:)) | any(p(:,k))
     lb=[ [k],lb ]
  else
     p(k,:)=[]
     p(:,k)=[]
  end
end

lb сохраняет ваш первоначальный индекс

Другие вопросы по тегам