2016-05-07 1 views
0

J'ai une séquence x = [12,14,6,15,15,15,15,6,8,8,18,18,14,14] donc je veux faire une matrice de probabilité de transition. Matrice de probabilité de transition calculée par l'équation, c'est-à-dire la probabilité = (nombre de paires x (t) suivi de x (t + 1))/(nombre de paires x (t) suivi de n'importe quel état). Matrice devrait être comme par le code suivant ci-dessouscomment programmer dans Matlab pour obtenir une matrice de probabilité de transition?

    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 

Je peux faire

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; 

mais avec cette forme matrice de code d'ordre état actuel maximal en séquence à-dire la matrice devient de 18 * 18, et beaucoup plus d'endroits zéro se produit. Je veux une matrice comme ci-dessus posté par moi comment le faire.

+0

ceci différent de [votre autre question sans réponse sur les matrices de probabilité de transition] (http://stackoverflow.com/questions/37054721/how-to-obtain-transition-probability-matrix-in-matrix)? –

+1

@AndrasDeak Il veut maintenant supprimer les numéros qui ne sont pas impliqués dans une probabilité quelconque. – xvan

+0

@Rams cette question est mal formulée, supprimer toutes les informations relatives à la génération de probabilités de transition car ce n'est pas pertinent, il suffit de poster la matrice 18 * 18, et la matrice cible. – xvan

Répondre

-1
%%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 maintient votre index original

+0

Je l'ai essayé mais je ne comprends pas, pouvez-vous donner le code entier. –

+0

ce code supprime la nième ligne et la colonne de p, si les deux ont seulement 0 – xvan

+0

pouvez-vous poster le code entier avec le début de la fin. –

1

Étape 1 - organiser les données et générer table de transition vide

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 

sortie est marqué par chaîne de Markov (éléments sont des étiquettes au lieu des valeurs significatives)

>> u 

u = 

    6  8 12 14 15 18 

>> xind 

xind = 

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

Étape 2 - construire "de-à" table f ou chaque saut

>> 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 

Chaque colonne est une transition. La première ligne est "from", la deuxième ligne est "to".

Étape 3 - fréquences de comptage et de créer la table de transition

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 

sortie sont agrégées table de fréquence. Chaque élément est le compte d'un saut. Le numéro de ligne est "de" et le numéro de colonne est "à".

>> 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 

Par exemple, le 3 moyens 3 transitions de cinquième étiquette au 5 étiquette (valeur réelle est 15 à 15)

Étape 4 - normaliser les vecteurs lignes pour obtenir la table de probabilité

>> 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 

alternatif version de boucle

for ii = 1:size(p,1) 
    count = sum(p(ii,:)); 
    p(ii,:) = p(ii,:)/count; 
end 
+0

Mais xind non défini, Matlab montrant comme ceci 'Undefined fonction ou variable' xind '. –

+0

code mis à jour pour initialiser le tableau d'index. – Yvon

+0

Matlab montrant une erreur comme ceci 'Erreur lors de l'utilisation + Les dimensions de la matrice doivent être conformes.' –