Skip to content

Instantly share code, notes, and snippets.

Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save WinstonCampeau/d56b4e7ccc26b71dd7087b163df8ba3c to your computer and use it in GitHub Desktop.
Save WinstonCampeau/d56b4e7ccc26b71dd7087b163df8ba3c to your computer and use it in GitHub Desktop.
SageMath - Diversity Measures of Weighted Bipartite Graphs (Tokenism & Entropy)
#Code generated with the help of Dr. Brett Stevens @ Carleton University
#input matrices are easily generated by, G.reduced_adjacency_matrix()
#Mutual information is minimized when p(x,y)=p(x)*p(y). Otherwise, the joint probability is equal to the product of the marginals
def mutual_entropy(input_matrix):
matrix_sum = (matrix([1]*input_matrix.nrows())*input_matrix*(matrix([1]*input_matrix.ncols())).transpose())[0][0]
row_probabilities = (input_matrix*(matrix([1]*input_matrix.ncols())).transpose()).transpose()[0]
column_probabilities = ((matrix([1]*input_matrix.nrows()))*input_matrix)[0]
entropy = 0
for (i,j) in itertools.product(range(input_matrix.nrows()),range(input_matrix.ncols())):
if input_matrix[i][j] > 0:
entropy += input_matrix[i][j] *log_b(1.*(matrix_sum*input_matrix[i][j])/(row_probabilities[i]*column_probabilities[j]),2) / (matrix_sum)
return entropy
def joint_entropy(input_matrix):
matrix_sum = (matrix([1]*input_matrix.nrows())*input_matrix*(matrix([1]*input_matrix.ncols())).transpose())[0][0]
row_probabilities = (input_matrix*(matrix([1]*input_matrix.ncols())).transpose()).transpose()[0]
column_probabilities = ((matrix([1]*input_matrix.nrows()))*input_matrix)[0]
#Joint entropy is maximized by a matrix who is evenly distributed. Think a complete bipartite graph with all edges of equal weight
jointentropy = 0
for (i,j) in itertools.product(range(input_matrix.nrows()),range(input_matrix.ncols())):
if input_matrix[i][j] > 0:
jointentropy += -1.*(input_matrix[i][j]/matrix_sum *log_b((input_matrix[i][j]/matrix_sum),2))
return jointentropy
#Naive tokenism is maximized by the identity matrix
def naive_tokenism(input_matrix):
naive_tokenism_measure = 0
for i in range(input_matrix.nrows()):
if len(input_matrix.nonzero_positions_in_row(i)) >0:
naive_tokenism_measure += 1
for i in range(input_matrix.ncols()):
if len(input_matrix.nonzero_positions_in_column(i)) >0:
naive_tokenism_measure += 1
return Fraction(naive_tokenism_measure, (input_matrix.ncols()+input_matrix.nrows()))
#return (naive_tokenism_measure)/(input_matrix.ncols()+input_matrix.nrows())
#Subtle tokenism is maximized by the matrix of all-ones
def subtle_tokenism(input_matrix):
subtle_tokenism_measure = len(input_matrix.nonzero_positions())
stm_denominator = (input_matrix.ncols()*input_matrix.nrows())
# subtle_tokenism_meafsure = len(input_matrix.nonzero_positions())/(input_matrix.ncols()*input_matrix.nrows())
# print subtle_tokenism_measure, stm_denominator
return Fraction(subtle_tokenism_measure, stm_denominator)
#return (1*subtle_tokenism_measure)/(stm_denominator)
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment