рдкреЗрдЬрд░реИрдВрдХ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ: рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдФрд░ рд╡рд┐рджреНрдпреБрдд рд╡рд┐рдзрд┐ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдЖрд░ рдореЗрдВ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди

рд╣реИрд▓реЛ, рд╣рдмреНрд░реЛрд╕реНрдХ рдирд╛рдЧрд░рд┐рдХреЛрдВ!

рдореЗрд░рд╛ рдирд╛рдо рдПрд▓реЗрдХреНрд╕ рд╣реИред рдЗрд╕ рдмрд╛рд░ рдореИрдВрдиреЗ ITAR-TASS рдореЗрдВ рдХрд╛рд░реНрдпрд╕реНрдерд▓ рд╕реЗ рдкреНрд░рд╕рд╛рд░рдг рдХрд┐рдпрд╛ред

рдЗрд╕ рд▓рдШреБ рдкрд╛рда рдореЗрдВ, рдореИрдВ рдЖрдкрдХреЛ R рднрд╛рд╖рд╛ рдореЗрдВ рд╕рд░рд▓, рд╕рдордЭ рдореЗрдВ рдЖрдиреЗ рд╡рд╛рд▓реЗ рдЙрджрд╛рд╣рд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдкреЗрдЬрд░реИрдВрдХ ┬й (рдЗрд╕рдХреЗ рдмрд╛рдж рдореИрдВ рдЗрд╕реЗ рдкреАрдЖрд░ рдХрд╣реВрдВрдЧрд╛) рдХреА рдЧрдгрдирд╛ рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐ рд╕реЗ рдкрд░рд┐рдЪрд┐рдд рдХрд░рд╛рдКрдВрдЧрд╛ред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо Google рдХреА рдПрдХ рдмреМрджреНрдзрд┐рдХ рд╕рдВрдкрджрд╛ рд╣реИ, рд▓реЗрдХрд┐рди, рдбреЗрдЯрд╛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рд▓рд┐рдП рдЗрд╕рдХреА рдЙрдкрдпреЛрдЧрд┐рддрд╛ рдХреЗ рдХрд╛рд░рдг, рдХрдИ рдХрд╛рд░реНрдпреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред , рдЬрд┐рд╕реЗ рдЧреНрд░рд╛рдл рдореЗрдВ рдмрдбрд╝реЗ рдиреЛрдбреНрд╕ рдХреА рдЦреЛрдЬ рдХрд░рдиреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдорд╣рддреНрд╡ рджреЗрдХрд░ рд░реИрдВрдХрд┐рдВрдЧ рдореЗрдВ рдХрдореА рдХреА рдЬрд╛ рд╕рдХрддреА рд╣реИред

рдХрд┐рд╕реА рдмрдбрд╝реА рдХрдВрдкрдиреА рдХрд╛ рдХрд┐рд╕реА рдкреЛрд╕реНрдЯ рдореЗрдВ рдЙрд▓реНрд▓реЗрдЦ рдХрд░рдирд╛ рд╡рд┐рдЬреНрдЮрд╛рдкрди рдирд╣реАрдВ рд╣реИред

рдЪреВрдБрдХрд┐ рдореИрдВ рдПрдХ рдкреЗрд╢реЗрд╡рд░ рдЧрдгрд┐рддрдЬреНрдЮ рдирд╣реАрдВ рд╣реВрдБ, рдЗрд╕рд▓рд┐рдП рдореИрдВ рдЗрд╕ рд▓реЗрдЦ рдФрд░ рдЗрд╕ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рдПрдХ рдорд╛рд░реНрдЧрджрд░реНрд╢рдХ рдХреЗ рд░реВрдк рдореЗрдВ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдБ - рдФрд░ рдЖрдкрдХреЛ рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдБред

рдкреАрдЖрд░ рдХреА рд╕рд╣рдЬ рд╕рдордЭ


рдпрд╣ рд╕рдордЭрдирд╛ рдХрд┐ рдпрд╣ рдХреИрд╕реЗ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ рдореБрд╢реНрдХрд┐рд▓ рдирд╣реАрдВ рд╣реИред рддрддреНрд╡реЛрдВ рдХрд╛ рдПрдХ рд╕рдореВрд╣ рд╣реЛрддрд╛ рд╣реИ рдЬреЛ рдкрд░рд╕реНрдкрд░ рдЬреБрдбрд╝реЗ рд╣реЛрддреЗ рд╣реИрдВред рдпрд╣рд╛рдВ рдмрддрд╛рдпрд╛ рдЧрдпрд╛ рд╣реИ рдХрд┐ рд╡реЗ рдХреИрд╕реЗ рдЬреБрдбрд╝реЗ рд╣реБрдП рд╣реИрдВ - рдпрд╣ рдПрдХ рд╡реНрдпрд╛рдкрдХ рдкреНрд░рд╢реНрди рд╣реИ: рд╢рд╛рдпрдж рд▓рд┐рдВрдХ рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ (рдЬреИрд╕реЗ Google), рд╢рд╛рдпрдж рдПрдХ-рджреВрд╕рд░реЗ рдХреЗ рд╕рдВрджрд░реНрдн (рд▓рдЧрднрдЧ рд╕рдорд╛рди рд▓рд┐рдВрдХ) рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ, рддрддреНрд╡реЛрдВ (рдорд╛рд░реНрдХреЛрд╡ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕) рдХреЗ рдмреАрдЪ рд╕рдВрдХреНрд░рдордг рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рднреМрддрд┐рдХ рдХреЛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рдмрд┐рдирд╛ рдПрдХ рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╣реЛ рд╕рдХрддреА рд╣реИрдВред рд╕рдВрдЪрд╛рд░ рдХрд╛ рдЕрд░реНрдеред рдореИрдВ рдЗрди рддрддреНрд╡реЛрдВ рдХреЛ рдорд╣рддреНрд╡ рдХрд╛ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдорд╛рдирджрдВрдб рд╕реМрдВрдкрдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛, рдЬреЛ рдЗрд╕ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдЬрд╛рдирдХрд╛рд░реА рд▓реЗрдЧрд╛ рдХрд┐ рдЗрд╕ рддрддреНрд╡ рдХреЛ рдкреНрд░рд╕рд╛рд░ рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдЧреНрд░рд╛рдл рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рдпрд╛рддреНрд░рд╛ рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рдХреБрдЫ рдЕрдореВрд░реНрдд рдХрдг рджреНрд╡рд╛рд░рд╛ рджреМрд░рд╛ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛ред

рдЙрдо, рдпрд╣ рдмрд╣реБрдд рд╕реНрдкрд╖реНрдЯ рдирд╣реАрдВ рд▓рдЧрддрд╛ рд╣реИред рдПрдХ рдЦрд╕рдЦрд╕ рдХреЗ рд╕рд╛рде рдПрдХ рд▓реИрдкрдЯреЙрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рдПрдХ рдЖрджрдореА рдХреА рдХрд▓реНрдкрдирд╛ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реИ, рдЦреЛрдЬ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЗ рдкреГрд╖реНрдареЛрдВ рдХреЛ рд╕рд░реНрдл рдХрд░рдирд╛, рдПрдХ рд╣реБрдХреНрдХрд╛ рдзреВрдореНрд░рдкрд╛рди рдХрд░рдирд╛, рдПрдХ рдкреГрд╖реНрда рд╕реЗ рджреВрд╕рд░реЗ рдкреГрд╖реНрда рдХреЗ рд▓рд┐рдВрдХ рдХреЗ рдмрд╛рдж рдФрд░ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдмрд╛рд░ рдПрдХ рд╣реА рдкреГрд╖реНрда (рдпрд╛ рдкреГрд╖реНрда) рдкрд░ рджрд┐рдЦрд╛рдИ рджреЗрддреЗ рд╣реИрдВред

рдпрд╣ рдЗрд╕ рддрдереНрдп рдХреЗ рдХрд╛рд░рдг рд╣реИ рдХрд┐ рдЙрдирдХреЗ рджреНрд╡рд╛рд░рд╛ рджреЗрдЦреЗ рдЧрдП рдХреБрдЫ рдкреГрд╖реНрда рдореВрд▓ рд╕реНрд░реЛрдд рдореЗрдВ рдРрд╕реА рд░реЛрдЪрдХ рдЬрд╛рдирдХрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдХрд┐ рдЕрдиреНрдп рдкреГрд╖реНрда рд▓рд┐рдВрдХ рдХреЗ рд╕рдВрдХреЗрдд рдХреЗ рд╕рд╛рде рдЗрд╕реЗ рдкреБрди: рдЫрд╛рдкрдиреЗ рдХреЗ рд▓рд┐рдП рдордЬрдмреВрд░ рд╣реЛ рдЬрд╛рддреЗ рд╣реИрдВред

Google рдореЗрдВ рдРрд╕реЗ рд╡реНрдпрдХреНрддрд┐ рдХрд╛ рдирд╛рдо рд░реИрдВрдбрдо рд╕рд░реНрдлрд░ рдерд╛ред рд╡рд╣ рдкреНрд░рд╕рд╛рд░ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдореЗрдВ рдПрдХ рдХрдг рд╣реИ: рд╕рдордп рдХреЗ рд╕рд╛рде рдЧреНрд░рд╛рдл рдкрд░ рд╕реНрдерд┐рддрд┐ рдХрд╛ рдПрдХ рдЕрд╕рддрдд рдкрд░рд┐рд╡рд░реНрддрдиред рдФрд░ рд╡рд╣ рд╕рдВрднрд╛рд╡рдирд╛ рдЬрд┐рд╕рдХреЗ рд╕рд╛рде рд╡рд╣ рдкреГрд╖реНрда рдкрд░ рдЬрд╛рддрд╛ рд╣реИ рдПрдХ рдкреНрд░рд╕рд╛рд░ рд╕рдордп рдХреЗ рд╕рд╛рде рдЕрдирдВрдд рддрдХ рдЬрд╛рддрд╛ рд╣реИ рдкреАрдЖрд░ред

рдкреАрдЖрд░ рдЧрдгрдирд╛ рдХрд╛ рд╕рд░рд▓ рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди


рдЖрдЗрдП рд╕рд╣рдордд рд╣реИрдВ - рд╣рдо 10 рддрддреНрд╡реЛрдВ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ, рдРрд╕реЗ рдЫреЛрдЯреЗ, рдЖрд░рд╛рдорджрд╛рдпрдХ рдЫреЛрдЯреЗ рдЧреНрд░рд╛рдл рдореЗрдВред

# clear environment rm(list = ls()); gc() ## load libs library(data.table) library(magrittr) library(markovchain) ## dummy data number_nodes <- 10 node_names <- letters[seq_len(number_nodes)] set.seed(1) nodes <- sapply( seq_len(number_nodes), function(x) { paste( c( node_names[-x] , sample(node_names[-x], sample(1:5, 1), replace = T) ) , collapse = ' ' ) } ) names(nodes) <- node_names print( paste(nodes, collapse = '; ') ) ## make long dt dt <- data.table( citing_node = node_names , cited_node = nodes ) %>% .[, .(cited_node = unlist(strsplit(cited_node, ' '))), by = citing_node] %>% dcast( . , cited_node ~ citing_node , fun.aggregate = length ) dt apply(dt[,-1,with=F], 2, sum) ## affinity matrix A <- as.matrix(dt[, 2:dim(dt)[2]]) A <- sweep(A, 2, colSums(A), `/`) A[is.nan(A)] <- 0 rowSums(A) colSums(A) mark <- new("markovchain", transitionMatrix = t(A), states = node_names, name = "mark") plot(mark) 

10 рддрддреНрд╡реЛрдВ рдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ (рдиреЛрдбреНрд╕) рдореЗрдВ рдпрд╛рджреГрдЪреНрдЫрд┐рдХ рдХреНрд░рдо рдореЗрдВ рдЕрдиреНрдп рдиреЛрдбреНрд╕ рдХреЗ 10 рд╕реЗ 14 рд╕рдВрджрд░реНрдн рд╢рд╛рдорд┐рд▓ рд╣реИрдВ, рдЦреБрдж рдХреЛ рдЫреЛрдбрд╝рдХрд░ред рдлрд┐рд▓рд╣рд╛рд▓, рд╣рдо рдХреЗрд╡рд▓ рдпрд╣ рддрдп рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рдбреЗрдЯрд╛ рдПрдХ рд╡реЗрдм рд▓рд┐рдВрдХ рд╣реИред

рдпрд╣ рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рдРрд╕рд╛ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ рдХрд┐ рдХреБрдЫ рддрддреНрд╡ рджреВрд╕рд░реЛрдВ рдХреА рддреБрд▓рдирд╛ рдореЗрдВ рдЕрдзрд┐рдХ рдмрд╛рд░ рдЙрд▓реНрд▓рд┐рдЦрд┐рдд рд╣реЛрдВред рдЗрд╕реЗ рджреЗрдЦреЗрдВред
рд╡реИрд╕реЗ, рдореИрдВ рдкреНрд░рдпреЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП data.table рдкреИрдХреЗрдЬ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВред Tidyverse рдХреЗ рд╕рд┐рджреНрдзрд╛рдВрддреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдВрдпреЛрдЬрди рдореЗрдВ, рд╕рдм рдХреБрдЫ рдХреБрд╢рд▓рддрд╛рдкреВрд░реНрд╡рдХ рдФрд░ рдЬрд▓реНрджреА рд╕реЗ рдирд┐рдХрд▓рддрд╛ рд╣реИред


рдЗрд╕ рддрд░рд╣ рд╕реЗ рд╣рдорд╛рд░рд╛ рд▓рд┐рдВрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рджрд┐рдЦрддрд╛ рд╣реИ (рдЕрдВрдЧреНрд░реЗрдЬреА рдореЗрдВ рдЗрд╕реЗ рдЕрдХреНрд╕рд░ рдЖрд╕рдиреНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ)ред

рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрдВрдн рдореЗрдВ рдпреЛрдЧ рд╢реВрдиреНрдп рд╕реЗ рдЕрдзрд┐рдХ рд╣реИ, рдЬрд┐рд╕рдХрд╛ рдЕрд░реНрде рд╣реИ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рддрддреНрд╡ рдХрд╛ рдХрд┐рд╕реА рдЕрдиреНрдп рддрддреНрд╡ рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдз рд╣реИ (рдпрд╣ рдЖрдЧреЗ рдХреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ)ред
> рд▓рд╛рдЧреВ рдХрд░реЗрдВ (рдбреАрдЯреА [, - 1, рд╕рд╛рде = рдПрдл], 2, рдпреЛрдЧ)
abcdefghij
11 14 10 10 11 13 11 11 11 12

рдЗрд╕ рддрд╛рд▓рд┐рдХрд╛ рдХреЗ рдЖрдзрд╛рд░ рдкрд░, рд╣рдо рддрдерд╛рдХрдерд┐рдд рдПрдлрд╝рд┐рдирд┐рдЯреА рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ, рдпрд╛, рд╣рдорд╛рд░реА рд░рд╛рдп рдореЗрдВ, рдирд┐рдХрдЯрддрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рдФрд░ рдЗрд╕реЗ рд╕рдВрдХреНрд░рдордг рдореИрдЯреНрд░рд┐рдХреНрд╕ рднреА рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИ), рдЬрд┐рд╕реЗ рдЧрдгрд┐рддрдЬреНрдЮ рд╕реНрдЯреЛрдХреЗрд╕реНрдЯрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ (рд╕реНрддрдВрдн-рд╕реНрдЯреЛрдХреЗрд╕реНрдЯрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕) рдХрд╣рддреЗ рд╣реИрдВ: рдореБрдЦреНрдп рд╕реНрд░реЛрдд

рдЗрд╕реЗ A рдирд╛рдо рдХреЗ рдПрдХ рд╡реЗрд░рд┐рдПрдмрд▓ рдХреЛ рдЕрд╕рд╛рдЗрди рдХрд░реЗрдВред



рдЕрдм рд╕рдмрд╕реЗ рдорд╣рддреНрд╡рдкреВрд░реНрдг рдмрд╛рдд рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рдпреЛрдЧ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИред
> colSums (рдП)
abcdefghij
1 1 1 1 1 1 1 1 1 1

рдпрд╣рд╛рдБ рдпрд╣ рд╣реИ - рд╕рдВрдХреНрд░рдордг рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕, рдпрд╣ рдорд╛рд░реНрдХреЛрд╡ рд╣реИ, рдпрд╣ рд╕рдорд╛рдирддрд╛ рд╣реИред рдПрдХ рдХреЙрд▓рдо рдореЗрдВ рдПрдХ рддрддреНрд╡ рд╕реЗ рдПрдХ рдкрдВрдХреНрддрд┐ рдореЗрдВ рдПрдХ рддрддреНрд╡ рдХреЗ рд▓рд┐рдП рд╕рдВрдХреНрд░рдордг рдХреА рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред

рдпреЗ, рдирд┐рд╢реНрдЪрд┐рдд рд░реВрдк рд╕реЗ, "рд╕рдорд╛рдирддрд╛рдПрдВ" рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдирд╣реАрдВ рд╣реИрдВред рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдпрджрд┐ рд╣рдо рджрд╕реНрддрд╛рд╡реЗрдЬреЛрдВ рдХреА рдкреНрд░рд╕реНрддреБрддрд┐ рдХреЗ рдмреАрдЪ рдХреЛрдг рдХреЗ рдХреЛрд╕рд╛рдЗрди рдХреА рдЧрдгрдирд╛ рдХрд░реЗрдВрдЧреЗред рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ рдХрд┐ рд╕рдВрдХреНрд░рдордг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЛ (рдЫрджреНрдо) рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреЗ рд▓рд┐рдП рдХрдо рдХрд░ рджрд┐рдпрд╛ рдЬрд╛рдП рддрд╛рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрдВрдн рдкрд░ рдпреЛрдЧ рдПрдХ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛред

рдЪрд▓реЛ рдорд╛рд░реНрдХреЛрд╡ рд╕рдВрдХреНрд░рдордг рдЧреНрд░рд╛рдл (рд╣рдорд╛рд░реЗ рдП) рдХреЛ рджреЗрдЦреЗрдВ:



рд╕рдм рдХреБрдЫ рд▓рдЧрднрдЧ рд╕рдорд╛рди рд░реВрдк рд╕реЗ рднреНрд░рдорд┐рдд рд╣реИ)ред рдРрд╕рд╛ рдЗрд╕рд▓рд┐рдП рд╣реИ рдХреНрдпреЛрдВрдХрд┐ рд╣рдордиреЗ рдкрд░рд┐рд╡рд░реНрддрдиреАрдп рдкрд░рд┐рд╡рд░реНрддрди рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд┐рдП рд╣реИрдВред

рдФрд░ рдЕрдм рдЬрд╛рджреВ рдХрд╛ рд╕рдордп рд╣реИ!

 ## calculate pagerank ei <- eigen(A) as.numeric(ei$values[1]) pr <- as.numeric(ei$vectors[,1] / sum(ei$vectors[,1])) sum(pr) names(pr) <- node_names print(round(pr, 2)) 

рд╕реНрдЯреЛрдХреЗрд╕реНрдЯрд┐рдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдП рдХреЗ рд▓рд┐рдП, рдкрд╣рд▓рд╛ рдЖрдЗрдЧреЗрдирд╡реЗрд▓реНрдпреВ рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реЛрдирд╛ рдЪрд╛рд╣рд┐рдП, рдФрд░ рд╕рдВрдмрдВрдзрд┐рдд рдЖрдЗрдЧреЗрдирд╡реЗрдХреНрдЯрд░ рдкреЗрдЬрд░реИрдВрдХ рд╡реЗрдХреНрдЯрд░ рд╣реИред
> рдкреНрд░рд┐рдВрдЯ (рдЧреЛрд▓ (рдкреАрдЖрд░, 2))
abcdefghij
0.09 0.11 0.09 0.10 0.10 0.11 0.10 0.11 0.08 0.11

рдпрд╣ рдкреАрдЖрд░ рдорд╛рдиреЛрдВ рдХрд╛ рд╕рджрд┐рд╢ рд╣реИ - рдпрд╣ рд╕рдВрдХреНрд░рдордг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдП рдХрд╛ рд╕рд╛рдорд╛рдиреНрдпреАрдХреГрдд рдЖрдЗрдЬрдирд╡реЗрдХреНрдЯрд░ рд╣реИ, рдЬреЛ рдЗрд╕ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рдЖрдЗрдЧреЗрдирд╡реЗрд▓реНрдпреВ рдХреЗ рд╕рд╛рде рдПрдХрддрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╣реИ - рдкреНрд░рдореБрдЦ рдИрдЬрдирд╡реЗрдХреНрдЯрд░ред

рдЕрдм рдЖрдк рддрддреНрд╡реЛрдВ рдХреЛ рд░реИрдВрдХ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рд▓реЗрдХрд┐рди рдкреНрд░рдпреЛрдЧ рдХреА рдмрд╛рд░реАрдХрд┐рдпреЛрдВ рдХреЗ рдХрд╛рд░рдг, рдЙрдирдХрд╛ рд╡рдЬрди рдХрд╛рдлреА рд╕рдорд╛рди рд╣реИред

рдмрд┐рдЬрд▓реА рдХреА рд╡рд┐рдзрд┐ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдорд╕реНрдпрд╛рдУрдВ рдФрд░ рдЙрдирдХреЗ рд╕рдорд╛рдзрд╛рди


рд╕рдВрдХреНрд░рдордг рдореИрдЯреНрд░рд┐рдХреНрд╕ A рд╕реНрдЯреЛрдЪреИрд╕реНрдЯрд┐рд╕ рд╕реНрдерд┐рддрд┐рдпреЛрдВ рдХреЛ рд╕рдВрддреБрд╖реНрдЯ рдирд╣реАрдВ рдХрд░ рд╕рдХрддрд╛ рд╣реИред

рд╕рдмрд╕реЗ рдкрд╣рд▓реЗ, рдРрд╕реЗ рддрддреНрд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдХрд╣реАрдВ рднреА рд╕рдВрджрд░реНрднрд┐рдд рдирд╣реАрдВ рдХрд░рддреЗ рд╣реИрдВ, рдЕрд░реНрдерд╛рдд рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рдХреА рдЕрдиреБрдкрд╕реНрдерд┐рддрд┐ рдХреЗ рд╕рд╛рде (рд╡реЗ рдЙрдиреНрд╣реЗрдВ рд╕рдВрджрд░реНрднрд┐рдд рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ)ред рдмрдбрд╝реЗ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рд░реЗрдЦрд╛рдВрдХрди рдХреЗ рд▓рд┐рдП рдпрд╣ рдПрдХ рд╕рдорд╕реНрдпрд╛ рд╣реИред рдЗрд╕рдХрд╛ рдорддрд▓рдм рдпрд╣ рд╣реИ рдХрд┐ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕реНрддрдВрднреЛрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдореЗрдВ рдХреЗрд╡рд▓ рд╢реВрдиреНрдп рд╣реЛрдЧрд╛ред рдЗрд╕ рдорд╛рдорд▓реЗ рдореЗрдВ, eigenvectors рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╕рдорд╛рдзрд╛рди рдХрд╛рдо рдирд╣реАрдВ рдХрд░реЗрдЧрд╛ред

Google рдиреЗ рдПрдХ рд╕рдорд╛рди рд╕рдВрднрд╛рд╡реНрдпрддрд╛ рд╡рд┐рддрд░рдг p = 1 / N рдХреЗ рд╕рд╛рде рдПрдХ рдХреЙрд▓рдо рднрд░рдХрд░ рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдХрд┐рдпрд╛ред рдЬрд╣рд╛рдБ N рд╕рднреА рддрддреНрд╡реЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛ рд╣реИред

 dim.1 <- dim(A)[1] A <- as.data.table(A) nul_cols <- apply(A, 2, function(x) sum(x) == 0) if( sum(nul_cols) > 0 ) { A[ , (colnames(A)[nul_cols]) := lapply(.SD, function(x) 1 / dim.1) , .SDcols = colnames(A)[nul_cols] ] } A <- as.matrix(A) 

рджреВрд╕рд░реЗ, рдЧреНрд░рд╛рдлрд╝ рдореЗрдВ рдПрдХ рджреВрд╕рд░реЗ рдХреЗ рдкреНрд░рддрд┐ рдкреНрд░рддрд┐рдХреНрд░рд┐рдпрд╛ рд╡рд╛рд▓реЗ рддрддреНрд╡ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВ, рд▓реЗрдХрд┐рди рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд╢реЗрд╖ рддрддреНрд╡ рдирд╣реАрдВред рдпрд╣ рдорд╛рдиреНрдпрддрд╛рдУрдВ рдХреЗ рдЙрд▓реНрд▓рдВрдШрди рдХреЗ рдХрд╛рд░рдг рд░реИрдЦрд┐рдХ рдмреАрдЬрдЧрдгрд┐рдд рдХреЗ рд▓рд┐рдП рднреА рдПрдХ рджреБрд░реНрдЧрдо рд╕рдорд╕реНрдпрд╛ рд╣реИред

рдпрд╣ рдПрдХ рдирд┐рд░рдВрддрд░рддрд╛ рдирд╛рдордХ рдбрдВрдкрд┐рдВрдЧ рдХрд╛рд░рдХ рдХреЛ рдкреЗрд╢ рдХрд░рдХреЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рдХрд┐рд╕реА рднреА рддрддреНрд╡ рд╕реЗ рдХрд┐рд╕реА рднреА рдЕрдиреНрдп рдХреЗ рд▓рд┐рдП рдПрдХ рд╕рдВрдХреНрд░рдордг рдХреА рдкреНрд░рд╛рдердорд┐рдХрддрд╛ рд╕рдВрднрд╛рд╡рдирд╛ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рддрд╛ рд╣реИ, рднрд▓реЗ рд╣реА рдХреЛрдИ рднреМрддрд┐рдХ рд▓рд┐рдВрдХ рди рд╣реЛред рджреВрд╕рд░реЗ рд╢рдмреНрджреЛрдВ рдореЗрдВ, рдХрд┐рд╕реА рднреА рдЕрд╡рд╕реНрдерд╛ рдореЗрдВ рдкреНрд░рд╕рд╛рд░ рд╕рдВрднрд╡ рд╣реИред

 d = 0.15 #damping factor (to ensure algorithm convergence) M <- (1 - d) * A + d * (1 / dim.1 * matrix(1, nrow = dim.1, ncol = dim.1)) # google matrix 

рдпрджрд┐ рд╣рдо рдЕрдкрдиреЗ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдореЗрдВ рдЗрди рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддреЗ рд╣реИрдВ, рддреЛ рдЗрд╕реЗ рдлрд┐рд░ рд╕реЗ eigenvectors рдХреЗ рдорд╛рдзреНрдпрдо рд╕реЗ рд╣рд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ!

рддреАрд╕рд░рд╛, рдХреЙрд░реНрди рдореИрдЯреНрд░рд┐рдХреНрд╕ рдЪреМрдХреЛрд░ рдирд╣реАрдВ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ, рд▓реЗрдХрд┐рди рдпрд╣ рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ! рдореИрдВ рдЗрд╕ рдХреНрд╖рдг рдкрд░ рдзреНрдпрд╛рди рдХреЗрдВрджреНрд░рд┐рдд рдирд╣реАрдВ рдХрд░реВрдВрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдореЗрд░рд╛ рдорд╛рдирдирд╛ тАЛтАЛрд╣реИ рдХрд┐ рдЖрдк рд╕реНрд╡рдпрдВ рдпрд╣ рдкрддрд╛ рд▓рдЧрд╛рдПрдВрдЧреЗ рдХрд┐ рдЗрд╕реЗ рдХреИрд╕реЗ рдареАрдХ рдХрд┐рдпрд╛ рдЬрд╛рдПред

рд▓реЗрдХрд┐рди рдПрдХ рддреЗрдЬрд╝ рдФрд░ рдЕрдзрд┐рдХ рд╕рдЯреАрдХ рддрд░реАрдХрд╛ рд╣реИ, рдЬреЛ рдореЗрдореЛрд░реА рдореЗрдВ рдЕрдзрд┐рдХ рдХрд┐рдлрд╛рдпрддреА рд╣реИ (рдЬреЛ рдмрдбрд╝реЗ рдЧреНрд░рд╛рдлрд╝ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╛рд╕рдВрдЧрд┐рдХ рд╣реЛ рд╕рдХрддрд╛ рд╣реИ): рдкрд╛рд╡рд░ рд╡рд┐рдзрд┐ред

 ## pagerank function (tested on example from tutorial) rm(pagerank_func) pagerank_func <- function( A #transition matrix , eps = 0.00001 #sufficiently small error , d = 0.15 #damping factor (to ensure algorithm convergence) ) { dim.1 <- dim(A)[1] A <- as.data.table(A) nul_cols <- apply(A, 2, function(x) sum(x) == 0) if( sum(nul_cols) > 0 ) { A[ , (colnames(A)[nul_cols]) := lapply(.SD, function(x) 1 / dim.1) , .SDcols = colnames(A)[nul_cols] ] } A <- as.matrix(A) M <- (1 - d) * A + d * (1 / dim.1 * matrix(1, nrow = dim.1, ncol = dim.1)) # google matrix rank = as.numeric(rep(1 / dim.1, dim.1)) ## iterate until convergence while( sum( (rank - M %*% rank) ^ 2 ) > eps ) { rank <- M %*% rank } return(rank) } pr2 <- pagerank_func(A) pr2=as.vector(pr2) names(pr2)=node_names 

рджреЗрдЦрд╛!
> рдкреНрд░рд┐рдВрдЯ (рдЧреЛрд▓ (рдкреАрдЖрд░, 2))
abcdefghij
0.09 0.11 0.09 0.10 0.10 0.11 0.10 0.11 0.08 0.11
> рдкреНрд░рд┐рдВрдЯ (рд░рд╛рдЙрдВрдб (pr2, 2))
abcdefghij
0.09 0.11 0.09 0.10 0.10 0.11 0.10 0.11 0.08 0.11

рдЗрд╕ рдкрд░ рдореИрдВ рдЯреНрдпреВрдЯреЛрд░рд┐рдпрд▓ рдХреЛ рд╕рдорд╛рдкреНрдд рдХрд░ рджреВрдВрдЧрд╛ред рдореБрдЭреЗ рдЖрд╢рд╛ рд╣реИ рдХрд┐ рдЖрдк рдЗрд╕реЗ рдЙрдкрдпреЛрдЧреА рдкрд╛рдПрдВрдЧреЗред

рдореИрдВ рдпрд╣ рдХрд╣рдирд╛ рднреВрд▓ рдЧрдпрд╛ рдХрд┐ рдкрд░рд┐рд╡рд░реНрддрди (рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ) рдХрд╛ рдПрдХ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдЧреНрд░рдВрдереЛрдВ рдХреА рд╕рдорд╛рдирддрд╛, рд╕рдВрджрд░реНрднреЛрдВ рдХреА рд╕рдВрдЦреНрдпрд╛, рдПрдХ рд▓рд┐рдВрдХ рдХреЗ рддрдереНрдп, рдФрд░ рдЕрдиреНрдп рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ рдЬреЛ рдЫрджреНрдо рд╕рдВрднрд╛рд╡рдирд╛рдУрдВ рдХреА рдУрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдпрд╛ рд╕рдВрднрд╛рд╡рдирд╛рдПрдВ рд╣реИрдВред рдкреВрд░реЗ рдкрд╛рда рдХреЛ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдкреНрд░рд╕реНрддреБрдд рдХрд░рдиреЗ рд╡рд╛рд▓реЗ рд╡рд╛рдХреНрдп рдХреЛ рдЙрдЬрд╛рдЧрд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рд╢рдмреНрдж рдмреИрдЧ tf-idf рдХреА рд╕рдорд╛рдирддрд╛ рдореИрдЯреНрд░рд┐рдХреНрд╕ рдкрд░ рдкрд╛рда рдореЗрдВ рд╡рд╛рдХреНрдпреЛрдВ рдХреА рд░реИрдВрдХрд┐рдВрдЧ рджрд┐рд▓рдЪрд╕реНрдк рдЙрджрд╛рд╣рд░рдг рд╣реИред рдкреАрдЖрд░ рдХреЗ рдЕрдиреНрдп рд░рдЪрдирд╛рддреНрдордХ рдЙрдкрдпреЛрдЧ рд╣реЛ рд╕рдХрддреЗ рд╣реИрдВред

рдореИрдВ рдЕрдкрдиреЗ рдЖрдк рдХреЛ рд╕рдВрдХреНрд░рдордг рдореИрдЯреНрд░рд┐рдХреНрд╕ рдХреЗ рд╕рд╛рде рдЦреЗрд▓рдиреЗ рдХреА рдХреЛрд╢рд┐рд╢ рдХрд░рдиреЗ рдХреА рд╕рд▓рд╛рд╣ рджреЗрддрд╛ рд╣реВрдВ рдФрд░ рд╕реБрдирд┐рд╢реНрдЪрд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ рдЖрдкрдХреЛ рд╢рд╛рдВрдд рдкреАрдЖрд░ рдорд╛рди рдорд┐рд▓реЗ, рдЬреЛ рд╡реНрдпрд╛рдЦреНрдпрд╛ рдХрд░рдирд╛ рднреА рдХрд╛рдлреА рдЖрд╕рд╛рди рд╣реИред

рдпрджрд┐ рдЖрдк рдореЗрд░реЗ рд╕рд╛рде рдЧрд▓рддрд┐рдпрд╛рдБ рдпрд╛ рддреНрд░реБрдЯрд┐рдпрд╛рдВ рджреЗрдЦрддреЗ рд╣реИрдВ - рдЯрд┐рдкреНрдкрдгрд┐рдпреЛрдВ рдпрд╛ рд╕рдВрджреЗрд╢ рдореЗрдВ рдЗрдВрдЧрд┐рдд рдХрд░реЗрдВ, рдФрд░ рдореИрдВ рд╕рдм рдХреБрдЫ рдареАрдХ рдХрд░ рджреВрдВрдЧрд╛ред

рд╕рднреА рдХреЛрдб рдпрд╣рд╛рдБ рд╕рдВрдХрд▓рд┐рдд рд╣реИрдВ:

рдХреЛрдб
 # clear environment rm(list = ls()); gc() ## load libs library(data.table) library(magrittr) library(markovchain) ## dummy data number_nodes <- 10 node_names <- letters[seq_len(number_nodes)] set.seed(1) nodes <- sapply( seq_len(number_nodes), function(x) { paste( c( node_names[-x] , sample(node_names[-x], sample(1:5, 1), replace = T) ) , collapse = ' ' ) } ) names(nodes) <- node_names print( paste(nodes, collapse = '; ') ) ## make long dt dt <- data.table( citing_node = node_names , cited_node = nodes ) %>% .[, .(cited_node = unlist(strsplit(cited_node, ' '))), by = citing_node] %>% dcast( . , cited_node ~ citing_node , fun.aggregate = length ) dt apply(dt[,-1,with=F], 2, sum) ## affinity matrix A <- as.matrix(dt[, 2:dim(dt)[2]]) A <- sweep(A, 2, colSums(A), `/`) A[is.nan(A)] <- 0 rowSums(A) colSums(A) mark <- new("markovchain", transitionMatrix = t(A), states = node_names, name = "mark") plot(mark) ## calculate pagerank ei <- eigen(A) as.numeric(ei$values[1]) pr <- as.numeric(ei$vectors[,1] / sum(ei$vectors[,1])) sum(pr) names(pr) <- node_names print(round(pr, 2)) ## pagerank function (tested on example from tutorial) rm(pagerank_func) pagerank_func <- function( A #transition matrix , eps = 0.00001 #sufficiently small error , d = 0.15 #damping factor (to ensure algorithm convergence) ) { dim.1 <- dim(A)[1] A <- as.data.table(A) nul_cols <- apply(A, 2, function(x) sum(x) == 0) if( sum(nul_cols) > 0 ) { A[ , (colnames(A)[nul_cols]) := lapply(.SD, function(x) 1 / dim.1) , .SDcols = colnames(A)[nul_cols] ] } A <- as.matrix(A) M <- (1 - d) * A + d * (1 / dim.1 * matrix(1, nrow = dim.1, ncol = dim.1)) # google matrix rank = as.numeric(rep(1 / dim.1, dim.1)) ## iterate until convergence while( sum( (rank - M %*% rank) ^ 2 ) > eps ) { rank <- M %*% rank } return(rank) } pr2 <- pagerank_func(A) pr2=as.vector(pr2) names(pr2)=node_names print(round(pr, 2)) print(round(pr2, 2)) 


рдкреБрдирд╢реНрдЪ: рдЗрд╕ рдкреВрд░реЗ рд╡рд┐рдЪрд╛рд░ рдХреЛ рдЕрдиреНрдп рднрд╛рд╖рд╛рдУрдВ рдореЗрдВ рднреА рдЖрд╕рд╛рдиреА рд╕реЗ рд▓рд╛рдЧреВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдХрдо рд╕реЗ рдХрдо рдкрд╛рдпрдерди рдореЗрдВ, рдореИрдВрдиреЗ рдмрд┐рдирд╛ рдХрд┐рд╕реА рдХрдард┐рдирд╛рдИ рдХреЗ рд╕рдм рдХреБрдЫ рдХрд┐рдпрд╛ред

Source: https://habr.com/ru/post/hi439332/


All Articles