-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathproject1.py
99 lines (69 loc) · 3.22 KB
/
project1.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
"""Skripta za analizu citiranosti naučnih radova. Kao input uzima graf. U primeru koji je korišćen ispod,
graf ima 27 770 čvorova (radova iz fizike visokih energija) i 352,768 grana (veza između pojedinačnih radova).
Program prvo računa citiranost svakog pojedinačnog rada, a zatim izračunava distribuciju dobijene citiranosti, koju potom normalizuje.
Nakon normalizacije skripta formira dijagram koji na ordinati ima normalizovanu distribuciju citiranosti,
a na apscisi broj citata svakog pojedinačnog rada.
Na ovaj način prikazani podaci ukazuju na zastupljenost određene citiranosti rada u odnosu na ukupnu populaciju citiranosti radova.
U navedonom primeru sa radovima iz fizike visokih energija, na osnovu grafika se može videti da najveći udeo u populaciji imaju
radovi sa malim (jednocifrenim) brojem citata, dok radovi sa velikim (trocifrenim i četvorocifrenim) brojem citata zauzimaju najmanji
udeo u populaciji. Drugim rečima, zavisnost između broja citata pojedinačnog rada, i zastupljenosti količine radova sa tim brojem
citatata u ukupnoj populaciji je obrnuto proporcionalna."""
import matplotlib.pyplot as plt
import urllib2
import itertools
CITATION_URL = "http://storage.googleapis.com/codeskulptor-alg/alg_phys-cite.txt"
def compute_in_degrees(digraph):
"""Compute how many nodes enter current node"""
degrees = {key: 0 for key in digraph.iterkeys()}
for value in digraph.itervalues():
for val in value:
degrees[val] += 1
return degrees
def in_degree_distribution(digraph):
"""Computes how many different indegrees we have in the graph"""
dicti = {}
in_degree = compute_in_degrees(digraph).values()
for value in in_degree:
if value not in dicti:
dicti[value] = 1
else:
dicti[value] += 1
return dicti
def norm(dicti):
""""this function normalizes values from a given dictionary"""
distri = in_degree_distribution(dicti)
normalized = {}
for key in distri.iterkeys():
normalized[key] = float(distri[key]) / sum([i for i in distri.itervalues()])
return normalized
def graph1(graph):
"""Creates a plot from a normalized graph and presents in_degree distribution"""
dicti = norm(graph)
y = [value for value in dicti.itervalues()]
x = [key for key in dicti.iterkeys()]
plt.plot(x, y, 'co', ms=7.0)
plt.title('Normalized in-degree distribution of a graph (log-log)')
plt.xlabel('In-degree')
plt.ylabel('Normalized weight')
plt.loglog()
plt.show()
def load_graph(graph_url):
"""
Function that loads a graph given the URL
for a text representation of the graph
Returns a dictionary that models a graph
"""
graph_file = urllib2.urlopen(graph_url)
graph_text = graph_file.read()
graph_lines = graph_text.split('\n')
graph_lines = graph_lines[ : -1]
print "Loaded graph with", len(graph_lines), "nodes"
answer_graph = {}
for line in graph_lines:
neighbors = line.split(' ')
node = int(neighbors[0])
answer_graph[node] = set([])
for neighbor in neighbors[1 : -1]:
answer_graph[node].add(int(neighbor))
return answer_graph
graph1(load_graph(CITATION_URL))