Created
July 27, 2018 05:10
-
-
Save WinstonCampeau/d56b4e7ccc26b71dd7087b163df8ba3c to your computer and use it in GitHub Desktop.
SageMath - Diversity Measures of Weighted Bipartite Graphs (Tokenism & Entropy)
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#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