【问题标题】:Build Markov Chains构建马尔可夫链
【发布时间】:2017-07-22 16:13:05
【问题描述】:

我想获取用于构建马尔可夫链模型的转换矩阵以构建推荐系统。我的数据格式为

            Date    StudentID   Subjectid
            201601   123        1
            201601   234        4
            201601   122        2
            201602   123        3
            201602   123        1
            201602   234        2
            201603   122        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)

【问题讨论】:

    标签: r recommendation-engine markov


    【解决方案1】:

    要创建一个转换矩阵,已经有一个post 与此相关。您的数据应如下所示:

    df1 <- as.data.frame.matrix(table(data[,c("StudentID","Subjectid")]))
    #function
    trans.matrix <- function(X, prob=T)
    {
        tt <- table( c(X[,-ncol(X)]), c(X[,-1]) )
        if(prob) tt <- tt / rowSums(tt)
        tt
    }
    transition_df <- trans.matrix(as.matrix(df1))
    

    那么你可以使用这个:

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

    【讨论】:

    【解决方案2】:

    可能有更好的解决方案,但如果我正确理解您在寻找什么,这会返回转换计数矩阵。

    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
    

    【讨论】:

      猜你喜欢
      • 2017-05-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多