2017-07-22 10 views
0

リコメンダ・システムを構築するためのマルコフ・チェーン・モデルを構築するための遷移行列を取得したいと考えています。私のデータは形になっていますマルコフ・チェーンを構築する

  Date StudentID Subjectid 
      201601 123  1 
      201601 234  4 
      201601 122  2 
      201602 123  3 
      201602 123  1 
      201602 234  2 
      201603 122  3 

私は、次の3つの科目が、学生が最も選ぶ可能性が高いと予測したいと思います。 私はマルコフ連鎖モデルを構築できるように、遷移行列の形でこのデータを得ることは困難です。

私は次のコードを試しましたが、どのように遷移行列が生成されるか分かりません。助けてください!

   rf <- (data$Subjectid) 
       n <- (length(train$Subjectid)) 
       trf <- table(data.frame(data$Subjectid[1:(n- 
       2)],data$Subjectid[1:(n-1)],data$Subjectid[2:n])) 
       trf/rowSums(trf) 

答えて

1

遷移行列を作成するには、すでにpostがあります。あなたのデータは次のようになります。

​​

が、あなたは、この使用することができます。

install.packages('markovchain') 
library(markovchain) 
... 
+0

あなたはこの論文を実装しようとしていますか? http://jmlr.csail.mit.edu/papers/volume6/shani05a/shani05a.pdf –

0

あり、おそらく手の込んだソリューションがありますが、私はあなたが探しているものを理解している場合、これは、遷移カウント行列を返します。正しく

df = read.table(text="Date StudentID Subjectid 
201601 123  1 
201601 234  4 
201601 122  2 
201602 123  3 
201602 123  1 
201602 234  2 
201603 122  3",header=T) 

library(dplyr) 
library(tidyr) 

df1 = do.call(rbind,lapply(split(df,df$StudentID), function(x) {x$prev_id = c(NA,x$Subjectid[1:(nrow(x)-1)]); return(x)})) 

df1$prev_id = factor(df1$prev_id,levels=unique(sort(c(df1$prev_id,df1$Subjectid)))) 
df1$Subjectid = factor(df1$Subjectid,levels=unique(sort(c(df1$prev_id,df1$Subjectid)))) 

df1 = df1[!is.na(df1$prev_id),] %>% group_by(Subjectid,prev_id) %>% 
    tally %>% spread(Subjectid,n,drop=FALSE,fill=0) %>% as.data.frame 

出力:

prev_id 1 2 3 4 
1  1 0 0 1 0 
2  2 0 0 1 0 
3  3 1 0 0 0 
4  4 0 1 0 0 
関連する問題