Как программировать в 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
сохраняет ваш первоначальный индекс