构建马尔可夫链
Build Markov Chains
我想获取构建马尔可夫链模型的转换矩阵来构建推荐系统。我的数据格式为
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)
要创建转换矩阵,已经有一个 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)
...
可能有更奇特的解决方案,但如果我正确理解您要查找的内容,此 returns 转换计数矩阵。
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
我想获取构建马尔可夫链模型的转换矩阵来构建推荐系统。我的数据格式为
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)
要创建转换矩阵,已经有一个 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)
...
可能有更奇特的解决方案,但如果我正确理解您要查找的内容,此 returns 转换计数矩阵。
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