2016-05-03 12 views
0

Was wäre ein gutes Programm, das die Matrix A automatisieren und ausfüllen könnte?Wie fügt man Wahrscheinlichkeiten in eine Matrix ein?

Wir haben die col-Vektor:

col=c(1,1,2,3,4,5,10,7,7,3,1,5,3,7,6,3,4,2,1,1,2,2,6,4,8,8,9,1,3,2) 
col 
[1] 1 1 2 3 4 5 10 7 7 3 1 5 3 7 6 3 4 2 1 1 2 2 6 4 8 
[26] 8 9 1 3 2 

Und wir haben die Matrix:

A=rbind(c(0:10),c(1,rep(0,10)),c(2,rep(0,10)),c(3,rep(0,10)),c(4,rep(0,10)),c(5,rep(0,10)),c(6,rep(0,10)),c(7,rep(0,10)),c(8,rep(0,10)),c(9,rep(0,10)),c(10,rep(0,10))) 
A 
     [,1] [,2] [,3] [,4] [,5] [,6] [,7] [,8] [,9] [,10] [,11] 
[1,] 0 1 2 3 4 5 6 7 8  9 10 
[2,] 1 0 0 0 0 0 0 0 0  0  0 
[3,] 2 0 0 0 0 0 0 0 0  0  0 
[4,] 3 0 0 0 0 0 0 0 0  0  0 
[5,] 4 0 0 0 0 0 0 0 0  0  0 
[6,] 5 0 0 0 0 0 0 0 0  0  0 
[7,] 6 0 0 0 0 0 0 0 0  0  0 
[8,] 7 0 0 0 0 0 0 0 0  0  0 
[9,] 8 0 0 0 0 0 0 0 0  0  0 
[10,] 9 0 0 0 0 0 0 0 0  0  0 
[11,] 10 0 0 0 0 0 0 0 0  0  0 

Die erste Spalte der Matrix A repräsentiert die vorangehenden Werte in der Spalte Vektor

der erste Zeile der Matrix A repräsentiert die folgenden Werte in dem Spaltenvektor In der Matrix A möchten wir die 0 ersetzen und das bedingte Probab speichern Fähigkeiten.

Mit Blick auf den Col-Vektor, schaue ich alle Instanzen, die 1 als eine vorangehende Zahl wie 1,1,2, 1,5, 1,1,2 1,3 beinhalten.

Und ich kam mit den folgenden bedingten Wahrscheinlichkeiten bis:

Da die vorhergehende Nummer 1 in der Spalte Vektor war die Wahrscheinlichkeit, dass die folgende Nummer 1 gleich zu: 2/6.

Da die vorhergehende Zahl 1 war, entspricht die Wahrscheinlichkeit, dass die folgende Zahl 2 ist: 2/6.

Da die vorhergehende Zahl 1 war, entspricht die Wahrscheinlichkeit, dass die folgende Zahl 3 ist: 1/6.

Da die vorhergehende Zahl 1 war, entspricht die Wahrscheinlichkeit, dass die folgende Zahl 5 ist: 1/5.

Wir verwenden diese Werte die erste Zeile der Matrix zu füllen A.And erhalten wir eine neue Version von A.

A=rbind(c(0:10),c(1,2/6,2/6,1/6,0,1/6,0,0,0,0,0),c(2,rep(0,10)),c(3,rep(0,10)),c(4,rep(0,10)),c(5,rep(0,10)),c(6,rep(0,10)),c(7,rep(0,10)),c(8,rep(0,10)),c(9,rep(0,10)),c(10,rep(0,10))) 
> A 
     [,1]  [,2]  [,3]  [,4] [,5]  [,6] [,7] [,8] [,9] [,10] [,11] 
[1,] 0 1.0000000 2.0000000 3.0000000 4 5.0000000 6 7 8  9 10 
[2,] 1 0.3333333 0.3333333 0.1666667 0 0.1666667 0 0 0  0  0 
[3,] 2 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[4,] 3 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[5,] 4 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[6,] 5 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[7,] 6 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[8,] 7 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[9,] 8 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[10,] 9 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 
[11,] 10 0.0000000 0.0000000 0.0000000 0 0.0000000 0 0 0  0  0 

Wir wollen die zweite Reihe füllen, den dritten die ganzen Weg bis 10.

Ich habe es manuell gemacht, aber was wäre ein gutes Programm, das die Matrix A automatisieren und ausfüllen könnte?

Antwort

1

nicht sicher, ob dies der effizienteste Ansatz ist, mit aggregate und dcast:

# Get data. 
col=c(1,1,2,3,4,5,10,7,7,3,1,5,3,7,6,3,4,2,1,1,2,2,6,4,8,8,9,1,3,2) 

# Make shifted vector and make a data frame. 
index <- 1:length(col) - 1 
index <- tail(index, length(col) - 1) 
col.shift <- c(col[index + 1], NA) 
df <- data.frame(list("value" = col, "next.value" = col.shift)) 

# Count number of values per combination. 
df$count <- 1 
# Count number of value appearences.. 
df.agg.row <- aggregate(count ~ value, df, FUN = sum) 

# Pivot the data. 
library(reshape2) 
res <- dcast(df, value ~ next.value, fun.aggregate = length) 

# Get probability of number (row) being followed by number (col). 
res2 <- res[, 2:11]/df.agg.row$count 
0

Vielen Dank für Ihre Eingabe. Ich konnte eine Antwort auf meine eigene Frage finden. Wenn jemand interessiert ist, dann können Sie meine Lösung überprüfen.

A=rbind(c(0:10),c(1,rep(0,10)),c(2,rep(0,10)),c(3,rep(0,10)),c(4,rep(0,10)),c(5,rep(0,10)),c(6,rep(0,10)),c(7,rep(0,10)),c(8,rep(0,10)),c(9,rep(0,10)),c(10,rep(0,10))) 
    col=c(1,1,2,3,4,5,10,7,7,3,1,5,3,7,6,3,4,2,1,1,2,2,6,4,8,8,9,1,3,2) 
    j=length(col) 
    A 
    while (j>1){ 
    if (col[j]==col[j-1]){A[match(col[j],A[,1]),match(col[j-1],A[1,])]=A[match(col[j],A[,1]),match(col[j-1],A[1,])]+1}else{ 
    if (col[j]!=col[j-1]){A[match(col[j],A[,1]),match(col[j-1],A[1,])]=A[match(col[j],A[,1]),match(col[j-1],A[1,])]+1} } 
    j=j-1 
    } 
    A 
    A=t(A) 
    A=A[-1,-1] 
    for (i in 1:nrow(A)){ 
    A[i,]=A[i,]/sum(A[1,]) 
    } 
    A 
+0

Dies wird sehr langsam sein. 'for' oder' while' in R sollte in Ausnahmefällen verwendet werden. – Bulat