Transition probability matrix for markov chain

16 ビュー (過去 30 日間)
John
John 2011 年 9 月 2 日
編集済み: Walter Roberson 2020 年 11 月 28 日
Hi there
I have time, speed and acceleration data for a car in three columns. I'm trying to generate a 2 dimensional transition probability matrix of velocity and acceleration.
The concept is given a particular speed and acceleration I would like to know the next most likely (probable) speed and acceleration.
I have some code below, but cannot fully understand it. Will it generate a 2D transition matrix or a 4D transition matrix?
Thank you
%%First bin data into categories
speedBinN = 5;
aceelBinN = 5;
speed = binit( data(:,2), linspace(min(data(:,2)),max(data(:,2)),speedBinN) ); % bin them into categories
accel = binit( data(:,3), linspace(min(data(:,3)),max(data(:,3)),aceelBinN) );
%%count up transitions
transCountMat = zeros(speedBinN,aceelBinN,speedBinN,aceelBinN);
for ii = 1:size(data,1)-1
transCountMat( speed(ii),accel(ii),speed(ii+1),accel(ii+1) ) = transCountMat( speed(ii),accel(ii),speed(ii+1),accel(ii+1) ) + 1;
end
%%calculate probabilities
sumOverPossibleDestinations = sum( sum(transCountMat, 4), 3);
transMat = bsxfun( @rdivide, transCountMat, sumOverPossibleDestinations );
%%User Interactive stuff
IM = imagesc(squeeze(transMat(1,1,:,:)));
colorbar
set(IM,'ButtonDownFcn',@bdFcn)
set(gca,'ydir','normal')
ylabel speed
xlabel accel
hold on
p = plot(1,1,'w');
updateIndicator(1,1)

回答 (6 件)

Walter Roberson
Walter Roberson 2011 年 9 月 2 日
Looks to me like it will generate a 2D output for transMat. The count matrix is 4 dimensional, but it is summed twice, which reduces that to 2 dimensions.
Looks to me like binit() is just the second output of histc(). With the linspace nature of the bins, that operation could probably be made more efficient than even histc(). Also the transcount loop could probably be replaced with a single accumarray call.

John
John 2011 年 9 月 3 日
Hi Walter,
Thank you for your reply and for explaining this to me. I'm happy that it generates a 2D output.
The code prints out the values of each element in the matrix. For example
val(:,:,1,3) =
NaN 0.2000 0.7692 0.0043 0
0 0 0.1294 0 NaN
0 0 0 0 NaN
NaN NaN 0 0 NaN
NaN NaN NaN 0 NaN
How can I make it just print out the actual matrix? I understand that this is probably a simple question but I don't know to do this.
I appreciate your help.
Thank you
  2 件のコメント
Walter Roberson
Walter Roberson 2011 年 9 月 3 日
There is no "val" in the code you show, so I am unsure what you are asking about?
When MATLAB displays a multidimensional matrix (4 dimensions in this case), it displays a "page" at a time, where a "page" is the first 2 dimensions. What format would you like the 4 dimensional matrix printed out in?
Walter Roberson
Walter Roberson 2011 年 9 月 3 日
Hmmm, looking again, it appears that transMat will be 4 dimensional, not the 2 dimensional that I thought.

サインインしてコメントする。


John
John 2011 年 9 月 5 日
Hi Walter,
Would you know how to change the code to produce a 2D transition probability matrix of velocity and acceleration?
I've uploaded a sample data set to sendspace.com http://www.sendspace.com/file/oqx54r
And here is the full code
Thank you for your help
function transMat = mwExample
load('Sample data set mathworks.mat')
%%First bin data into categories
speedBinN = 5;
aceelBinN = 5;
speed = binit( data(:,2), linspace(min(data(:,2)),max(data(:,2)),speedBinN) ); % bin them into categories
accel = binit( data(:,3), linspace(min(data(:,3)),max(data(:,3)),aceelBinN) );
%%count up transitions
transCountMat = zeros(speedBinN,aceelBinN,speedBinN,aceelBinN);
for ii = 1:size(data,1)-1
transCountMat( speed(ii),accel(ii),speed(ii+1),accel(ii+1) ) = transCountMat( speed(ii),accel(ii),speed(ii+1),accel(ii+1) ) + 1;
end
%%calculate probabilities
sumOverPossibleDestinations = sum( sum(transCountMat, 4), 3);
transMat = bsxfun( @rdivide, transCountMat, sumOverPossibleDestinations );
%%User Interactive stuff
IM = imagesc(squeeze(transMat(1,1,:,:)));
colorbar
set(IM,'ButtonDownFcn',@bdFcn)
set(gca,'ydir','normal')
ylabel speed
xlabel accel
hold on
p = plot(1,1,'w');
updateIndicator(1,1)

Hanane
Hanane 2014 年 3 月 14 日
Hi; what is the role of this function ''binit''?
  1 件のコメント
BolinSV
BolinSV 2016 年 3 月 3 日
I believe it is applied to divide the data into different bins in equal number.

サインインしてコメントする。


Harini pushparaj
Harini pushparaj 2017 年 12 月 27 日
@john..HI can i get your sample data file ..I maybe useful for my work ..I don't understand what is binit is ..it will be great if you could help me..Thank you!!
  3 件のコメント
Harini pushparaj
Harini pushparaj 2018 年 1 月 8 日
if i use binit ..i am getting error saying undefined binit and if i use histc..there is no error ..how come?
Walter Roberson
Walter Roberson 2018 年 1 月 8 日
You would need to store the above two lines in binit.m in your code directory.

サインインしてコメントする。


shahab anjum
shahab anjum 2020 年 3 月 2 日
please help me too if i have 1000x286 matrix how can i calculate the transistion and emission probabilites of that matrix plz
help
  12 件のコメント
Walter Roberson
Walter Roberson 2020 年 3 月 13 日
編集済み: Walter Roberson 2020 年 11 月 28 日
The way you processed your data originally is not compatible with the possibility that your array is an image.
There appear to be a number of techniques available for HMM processing of images for different purposes.
Attilio Pittelli
Attilio Pittelli 2020 年 11 月 28 日
you spoke about a list, but in the previous example he got the velocity and acceleration matrix. In my case i've got a double matrix of those inputs: a duration and a sequence of values. I'm trying to code it out but i'm still getting a transition probability matrix of 0 or 1 and the most of the outputs are 0 and it's not working. Do you have any suggestion? I'm really stucked at this point
Thank you

サインインしてコメントする。

カテゴリ

Help Center および File ExchangeMatrix Indexing についてさらに検索

Community Treasure Hunt

Find the treasures in MATLAB Central and discover how the community can help you!

Start Hunting!

Translated by