95 lines
2.9 KiB
R
95 lines
2.9 KiB
R
# Homework 1 for the University of Tulsa's CS-7863 Network Theory Course
|
|
# Degree, Eigenvector, Katz, and Page Rank Centralities on igraph networks
|
|
# Professor: Dr. McKinney, Fall 2021
|
|
# Noah Schrick - 1492657
|
|
|
|
# Imports
|
|
#install.packages("igraph")
|
|
#install.packages("igraphdata")
|
|
library(igraph)
|
|
library(igraphdata)
|
|
data(karate)
|
|
data(yeast)
|
|
|
|
# Create our graph object
|
|
g <- karate
|
|
g.netname <- "karate"
|
|
#g <- yeast
|
|
#g.netname <- "yeast"
|
|
############### Degree ###############
|
|
|
|
# Get degree
|
|
g.deg <- degree(g)
|
|
# Plots
|
|
mainname <- paste("Network based on Degree for the", g.netname, "network", sep=" ")
|
|
sizemult <- 25/max(g.deg)
|
|
if(g.netname == "yeast"){
|
|
plot(g, vertex.size = g.deg*sizemult, main=mainname, vertex.label=NA)
|
|
} else{plot(g, vertex.size = g.deg*sizemult, main=mainname)}
|
|
g.hist <- hist(g.deg,-1:max(g.deg),plot=F)
|
|
plot(g.hist)
|
|
|
|
############### Eigenvector Centrality ###############
|
|
|
|
# igraph's eigenvector centrality
|
|
g.eigs <- eigen_centrality(g)$vector # resolves degree ties
|
|
g.eigs.sorted <- sort(g.eigs,decreasing=T)
|
|
t(t(g.eigs.sorted)) #print one element per line
|
|
sizemult <- 25/g.eigs.sorted[1]
|
|
V(g)$size <- (g.eigs*sizemult) #size the network nodes by eigenvector centrality
|
|
mainname <- paste("Network based on Eigenvector Centrality for the", g.netname, "network", sep=" ")
|
|
if(g.netname == "yeast"){
|
|
plot(g, main=mainname, vertex.label=NA)
|
|
} else{plot(g, main=mainname)}
|
|
|
|
|
|
|
|
############### Page Rank ###############
|
|
# via library:
|
|
g.pr <- page.rank(g,)$vector
|
|
g.pr.sorted <- sort(g.pr, decreasing = T)
|
|
t(t(g.pr.sorted))
|
|
sizemult <- 25/g.pr.sorted[1]
|
|
V(g)$size <- (g.pr*sizemult) #size the network nodes by page rank
|
|
mainname <- paste("Network based on Page Rank for the", g.netname, "network", sep=" ")
|
|
if(g.netname == "yeast"){
|
|
plot(g, main=mainname, vertex.label=NA)
|
|
} else{plot(g, main=mainname)}
|
|
|
|
############### Katz ###############
|
|
katz.cent <- function(A, alpha=NULL, beta=NULL){ #NULL sets the default value
|
|
if (class(A) == 'igraph'){
|
|
#Error checking. Turn into adj matrix.
|
|
A <- get.adjacency(A)
|
|
}
|
|
|
|
lam.dom <- eigen(A)$values[1] #dom eigenvec
|
|
if (is.null(alpha)){
|
|
alpha <- 0.9 * (1/lam.dom) #Set alpha to 90% of max allowed
|
|
}
|
|
|
|
n <- nrow(A)
|
|
if (is.null(beta)){
|
|
beta <- matrix(rep(1/n, n),ncol=1)
|
|
}
|
|
|
|
#Katz scores
|
|
scores <- solve(diag(n) - alpha*A,beta)
|
|
|
|
return(scores)
|
|
}
|
|
|
|
kcs <- katz.cent(g) # call the function
|
|
kcs.df <- data.frame(as.matrix(kcs), row.names = V(g)$name) # add the names
|
|
kcs.df <- kcs.df[order(-kcs.df[,1]), , drop = FALSE] # sort by decreasing
|
|
kcs.df <- kcs.df/max(kcs.df) # make non-neg
|
|
kcs.df
|
|
|
|
sizemult <- 25/kcs.df[,1][1]
|
|
V(g)$size <- (kcs*sizemult) #size the network nodes by page rank
|
|
mainname <- paste("Network based on Katz Centrality for the", g.netname, "network", sep=" ")
|
|
if(g.netname == "yeast"){
|
|
plot(g, main=mainname, vertex.label=NA)
|
|
} else{plot(g, main=mainname)}
|
|
|