Upload files to "src"
This commit is contained in:
commit
901303c4d7
86
src/graph_graphical.py
Normal file
86
src/graph_graphical.py
Normal file
@ -0,0 +1,86 @@
|
||||
import networkx as nx
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
from sklearn.cluster import KMeans
|
||||
|
||||
def random_walk(graph, start_node, walk_length):
|
||||
walk = [start_node]
|
||||
for _ in range(walk_length - 1):
|
||||
neighbors = list(graph.neighbors(walk[-1]))
|
||||
if not neighbors:
|
||||
break
|
||||
walk.append(np.random.choice(neighbors))
|
||||
return walk
|
||||
|
||||
def random_walks_matrix(graph, num_walks, walk_length):
|
||||
nodes = list(graph.nodes)
|
||||
visit_counts = {node: {neighbor: 0 for neighbor in nodes} for node in nodes}
|
||||
|
||||
for node in nodes:
|
||||
for _ in range(num_walks):
|
||||
walk = random_walk(graph, node, walk_length)
|
||||
for neighbor in walk:
|
||||
visit_counts[node][neighbor] += 1
|
||||
|
||||
visit_matrix = np.array([[visit_counts[node][neighbor] for neighbor in nodes] for node in nodes])
|
||||
return visit_matrix
|
||||
|
||||
def cluster_nodes(visit_matrix, num_clusters):
|
||||
kmeans = KMeans(n_clusters=num_clusters, random_state=0)
|
||||
kmeans.fit(visit_matrix)
|
||||
return kmeans.labels_
|
||||
|
||||
def critical_nodes(graph, visit_matrix, num_clusters):
|
||||
initial_clusters = cluster_nodes(visit_matrix, num_clusters)
|
||||
critical_nodes = []
|
||||
|
||||
for node in graph.nodes:
|
||||
temp_graph = graph.copy()
|
||||
temp_graph.remove_node(node)
|
||||
|
||||
temp_visit_matrix = random_walks_matrix(temp_graph, num_walks, walk_length)
|
||||
new_clusters = cluster_nodes(temp_visit_matrix, num_clusters)
|
||||
|
||||
if not np.array_equal(initial_clusters, new_clusters):
|
||||
critical_nodes.append(node)
|
||||
|
||||
return critical_nodes
|
||||
|
||||
def draw_graph_with_clusters(graph, clusters, critical_nodes):
|
||||
pos = nx.spring_layout(graph)
|
||||
plt.figure(figsize=(10, 7))
|
||||
|
||||
unique_clusters = np.unique(clusters)
|
||||
colors = plt.cm.rainbow(np.linspace(0, 1, len(unique_clusters)))
|
||||
|
||||
for cluster, color in zip(unique_clusters, colors):
|
||||
nodes_in_cluster = [node for node, cluster_id in enumerate(clusters) if cluster_id == cluster]
|
||||
nx.draw_networkx_nodes(graph, pos, nodelist=nodes_in_cluster, node_color=[color], node_size=300)
|
||||
|
||||
nx.draw_networkx_edges(graph, pos, alpha=0.5)
|
||||
|
||||
critical_pos = {node: pos[node] for node in critical_nodes}
|
||||
nx.draw_networkx_nodes(graph, pos, nodelist=critical_nodes, node_color='black', node_size=100, label='Critical Nodes')
|
||||
|
||||
labels = {node: node for node in graph.nodes}
|
||||
nx.draw_networkx_labels(graph, pos, labels, font_size=8)
|
||||
|
||||
plt.title("Graph Clustering and Critical Nodes")
|
||||
plt.legend()
|
||||
plt.show()
|
||||
|
||||
# Przykładowa użycie
|
||||
num_walks = 100
|
||||
walk_length = 10
|
||||
num_clusters = 3
|
||||
|
||||
# Dla grafu nieskierowanego
|
||||
G = nx.karate_club_graph()
|
||||
visit_matrix = random_walks_matrix(G, num_walks, walk_length)
|
||||
clusters = cluster_nodes(visit_matrix, num_clusters)
|
||||
critical = critical_nodes(G, visit_matrix, num_clusters)
|
||||
|
||||
print("Klasteryzacja:", clusters)
|
||||
print("Krytyczne wierzchołki:", critical)
|
||||
|
||||
draw_graph_with_clusters(G, clusters, critical)
|
Loading…
Reference in New Issue
Block a user