AI-Midterm-IDNN / idnns /information /mutual_information_calculation.py
Ashley Goluoglu
add files from pantelis/IDNN
96283ff
raw
history blame
1.89 kB
'Calculation of the full plug-in distribuation'
import numpy as np
import multiprocessing
from joblib import Parallel, delayed
NUM_CORES = multiprocessing.cpu_count()
def calc_entropy_for_specipic_t(current_ts, px_i):
"""Calc entropy for specipic t"""
b2 = np.ascontiguousarray(current_ts).view(
np.dtype((np.void, current_ts.dtype.itemsize * current_ts.shape[1])))
unique_array, unique_inverse_t, unique_counts = \
np.unique(b2, return_index=False, return_inverse=True, return_counts=True)
p_current_ts = unique_counts / float(sum(unique_counts))
p_current_ts = np.asarray(p_current_ts, dtype=np.float64).T
H2X = px_i * (-np.sum(p_current_ts * np.log2(p_current_ts)))
return H2X
def calc_condtion_entropy(px, t_data, unique_inverse_x):
# Condition entropy of t given x
H2X_array = np.array(
Parallel(n_jobs=NUM_CORES)(delayed(calc_entropy_for_specipic_t)(t_data[unique_inverse_x == i, :], px[i])
for i in range(px.shape[0])))
H2X = np.sum(H2X_array)
return H2X
def calc_information_from_mat(px, py, ps2, data, unique_inverse_x, unique_inverse_y, unique_array):
"""Calculate the MI based on binning of the data"""
H2 = -np.sum(ps2 * np.log2(ps2))
H2X = calc_condtion_entropy(px, data, unique_inverse_x)
H2Y = calc_condtion_entropy(py.T, data, unique_inverse_y)
IY = H2 - H2Y
IX = H2 - H2X
return IX, IY
def calc_probs(t_index, unique_inverse, label, b, b1, len_unique_a):
"""Calculate the p(x|T) and p(y|T)"""
indexs = unique_inverse == t_index
p_y_ts = np.sum(label[indexs], axis=0) / label[indexs].shape[0]
unique_array_internal, unique_counts_internal = \
np.unique(b[indexs], return_index=False, return_inverse=False, return_counts=True)
indexes_x = np.where(np.in1d(b1, b[indexs]))
p_x_ts = np.zeros(len_unique_a)
p_x_ts[indexes_x] = unique_counts_internal / float(sum(unique_counts_internal))
return p_x_ts, p_y_ts