from math import sqrt
import numpy as np
D = {"A":[sqrt(2), sqrt(3), sqrt(5), 0, 0, 0],
"B":[sqrt(2), 0, sqrt(5), 0, sqrt(6), 0],
"C":[sqrt(2), 0, sqrt(5), 1, sqrt(6), 0],
"D":[0, 0, 0, 0, sqrt(6), 2],
"E":[0, 0, 0, 1, 0, 2]}
affinity = np.zeros((5, 5))
for xi in range(len(D)):
for xj in range(len(D)):
xivec = D[list(D.keys())[xi]]
xjvec = D[list(D.keys())[xj]]
affinity[xi, xj] = round(np.dot(np.array(xivec), np.array(xjvec)))
affinity.tolist()
import networkx as nx
import matplotlib.pyplot as plt
G = nx.Graph()
G.add_nodes_from(list(D.keys()))
for i in range(len(D.keys())):
for j in range(i+1, len(D.keys())):
i_node = list(D.keys())[i]
j_node = list(D.keys())[j]
G.add_edge(i_node, j_node, weight=affinity[i, j])
ax_1 = plt.subplot(111)
pos=nx.spring_layout(G, seed=0)
nx.draw_networkx(G, pos, with_labels=True)
for edge in G.edges(data="weight"):
nx.draw_networkx_edges(G, pos, edgelist=[edge], width=edge[2])
plt.show()
import scipy
A = affinity
k = 2
L = A
eigenvalues, eigenvectors = scipy.linalg.eigh(L)
U = eigenvectors[:,[-k, -1]]
row_sums = np.sqrt(np.square(U).sum(axis=1, keepdims=True))
Y = U / row_sums
Centroids, euclidian_mean = scipy.cluster.vq.kmeans(Y, k)
Clusters, distances = scipy.cluster.vq.vq(Y, Centroids)
list(zip(Y.tolist(),Clusters))
import scipy
A = affinity
k = 2
# network x does weighted degrees for us!
D = np.diag(list(dict(G.degree(weight="weight")).values()))
L = D-A
eigenvalues, eigenvectors = scipy.linalg.eigh(L)
U = eigenvectors[:,:2]
row_sums = np.sqrt(np.square(U).sum(axis=1, keepdims=True))
Y = U / row_sums
Centroids, euclidian_mean = scipy.cluster.vq.kmeans(Y, k)
Clusters, distances = scipy.cluster.vq.vq(Y, Centroids)
list(zip(Y.tolist(),Clusters))
import scipy
A = affinity
k = 2
# network x does weighted degrees for us!
D = np.diag(list(dict(G.degree(weight="weight")).values()))
L = D-A
L_a = np.matmul(np.diag((1/D.diagonal())), L)
L_s = np.matmul(np.matmul(np.diag(1/np.sqrt(D.diagonal())), L), np.diag(1/np.sqrt(D.diagonal())))
def normalized_cut(L):
eigenvalues, eigenvectors = scipy.linalg.eigh(L)
U = eigenvectors[:,:2]
row_sums = np.sqrt(np.square(U).sum(axis=1, keepdims=True))
Y = U / row_sums
Centroids, euclidian_mean = scipy.cluster.vq.kmeans(Y, k)
Clusters, distances = scipy.cluster.vq.vq(Y, Centroids)
return list(zip(Y.tolist(),Clusters))
[ (a[0], a[1], b[0], b[1]) for a, b, in zip(normalized_cut(L_a), normalized_cut(L_s))]