Seeking help creating a transition probability matrix for a markov chain
Show older comments
Hello,
I was hoping that somebody might be able to help me out in creating a transition probability matrix?
I normally use excel for statistical modelling but this particular problem takes hours to execute using spreadsheets and it is too large and complicated for a spreadsheet .
I have created a variables called 'data' and it contains velocity and acceleration data in 2 columns.
For example
Vel Acc
1 0.28
2 0.28
2 0.00
3 0.28
5 0.56
6 0.28
I was hoping to create a transition probability matrix of the probability of transition from one velocity acceleration pair to another. First of all you would create a frequency matrix counting all the transitions from one velocity acceleration pair to another and convert to a transition probability matrix by dividing by the row total.
Here is a graphical illustration of the matrix.

I would be very grateful if somebody had the time to help me with this. I'm trying to develop my matlab stills but would appreciate if somebody could show me how they would approach the problem.
Kind regards
Answers (2)
Roger Stafford
on 3 Jan 2013
It would be very similar to the solution I gave in your earlier posting. Let VA be your list of velocities and accelerations.
[uv,~,nv] = unique(VA(:,1));
[ua,~,na] = unique(VA(:,2));
F = accumarray([nv,na],1,[length(nv),length(na)]);
T = bsxfun(@rdivide,F,sum(F,2));
Again, the rows would correspond to velocity values in uv and the columns to corresponding accelerations in ua.
8 Comments
John
on 3 Jan 2013
John
on 3 Jan 2013
Roger Stafford
on 4 Jan 2013
My apologies, John. My thinking wasn't clear on this problem. Ignore the code I wrote above and replace it with the following:
[u,~,n] = unique(data,'rows');
N = length(n);
F = accumarray([n(1:N-1),n(2:N)],1,[N,N]);
T = bsxfun(@rdivide,F,sum(F,2));
The relationship between entries in T and velocity/acceleration pairs is this. An element T(n1,n2) = p means that the conditional probability of a transition from the velocity/acceleration pair at u(n1,:) to the pair at u(n2,:) is p.
In other words if you were to list all the possible N velocity/acceleration pairs in lexicographical order along the row side and along the column top of T you would have an N x N transition matrix between all these pairs of velocity/acceleration pairs.
Roger Stafford
on 4 Jan 2013
I set N to the wrong value. It should be the length of u, not the length of n. As it was you should have gotten NaNs on the last 115 rows when normalizing them. Again my apologies. Here is the corrected code. Let me know if there are any further errors.
[u,~,n] = unique(data,'rows');
N = length(u);
F = accumarray([n(1:end-1),n(2:end)],1,[N,N]);
T = bsxfun(@rdivide,F,sum(F,2));
Yes, Sean's code looks valid to me. He correctly uses 'histc' to choose the next state rather than the more inefficient 'find'. I probably would have generated all the 'rand' values in a vector at one time and then used elements from that vector in 'histc' sequentially in the for-loop but I think it makes little difference.
John
on 6 Jan 2013
Sri Santhosh
on 8 Jan 2015
Hello John
Have u succeeded in creating a transition probability matrix for state vectors velocity and acceleration? I am working on the similar task. However, By using the above code provided by Roger, I cannot generate a correct matrix. Could anyone help me?
Attilio Pittelli
on 27 Nov 2020
Hi, i'm still getting a row of NaN, but not at the last row. Could you tell me why?
Thank you
shahab anjum
on 2 Mar 2020
0 votes
please help me too if i have 1000x286 matrix how can i calculate the transistion and emission probabilites of that matrix plz
help
Categories
Find more on Creating and Concatenating Matrices in Help Center and File Exchange
Community Treasure Hunt
Find the treasures in MATLAB Central and discover how the community can help you!
Start Hunting!