# "Power-Method" powerMethod <- function(A, r0 = rep(1, nrow(A)), treshold = 10^(-10)) { r_alt <- r0 matExp <- A for (i in 2:10000) { matExp <- matExp%*%A r <- matExp%*%r0/norm(matExp%*%r0,'F') #print(r) if (norm(r-r_alt,'F') < treshold) { print(paste0("Found solution after ", i, " iterations.")) break } r_alt <- r } return(r[,1]) } # Type 0: A with a_ij equals 1 for win, 0.5 for draw and 0 for loss # Type 1: S_ij: team i scored s_ij points versus team j # Type 2: A with a_ij = (S_ij+1)/(S_ij+S_ji+2) generateA <- function(dataSet, type = 0) { teams <- as.character(unique(dataSet$HomeTeam)) A <- matrix(0, nrow=length(teams), ncol=length(teams)) rownames(A) <- teams colnames(A) <- teams for (i in 1:nrow(dataSet)) { homeTeam <- as.character(dataSet$HomeTeam[i]) awayTeam <- as.character(dataSet$AwayTeam[i]) if (type == 0) { gd <- dataSet$FTHG[i] - dataSet$FTAG[i] if (gd > 0) { A[homeTeam,awayTeam] <- A[homeTeam,awayTeam] + 1 } else if (gd < 0) { A[awayTeam,homeTeam] <- A[awayTeam,homeTeam] + 1 } else { A[homeTeam,awayTeam] <- A[homeTeam,awayTeam] + 0.5 A[awayTeam,homeTeam] <- A[awayTeam,homeTeam] + 0.5 } } else if (type == 1) { A[homeTeam,awayTeam] <- A[homeTeam,awayTeam] + dataSet$FTHG[i] A[awayTeam,homeTeam] <- A[awayTeam,homeTeam] + dataSet$FTAG[i] } else if (type == 2) { A[homeTeam,awayTeam] <- A[homeTeam,awayTeam] + (dataSet$FTHG[i]+1)/(dataSet$FTHG[i]+dataSet$FTAG[i]+2) A[awayTeam,homeTeam] <- A[awayTeam,homeTeam] + (dataSet$FTAG[i]+1)/(dataSet$FTHG[i]+dataSet$FTAG[i]+2) } } return(A) } generateS <- function(dataSet) { return(generateA(dataSet, type = 1)) } generateB <- function(dataSet) { S <- generateS(dataSet) B <- matrix(0, nrow=nrow(S), ncol=ncol(S)) rownames(B) <- rownames(S) colnames(B) <- colnames(S) for (i in 1:nrow(S)) { for (j in 1:ncol(S)) { if (i != j) { B[i,j] <- -S[i,j]*S[j,i] } else # (i == j) { sum <- 0 for (k in 1:nrow(S)) { #sum <- sum + S[i,k]^2 sum <- sum + S[k,i]^2 } B[i,j] <- sum } } } return(B) } minL <- function(B) { l <- 0 for (i in 1:nrow(B)) { mrsum <- 0 for (j in 1:ncol(B)) { if (i != j) { mrsum <- mrsum + abs(B[i,j]) } else # (i == j) { mrsum <- mrsum - abs(B[i,j]) } } if ((mrsum > 0) & (mrsum > l)) { l <- mrsum } } return(l) }