Skip to content

Commit

Permalink
Merge pull request #62 from ealcobaca/complexity-revised
Browse files Browse the repository at this point in the history
Complexity revised, Landmarking optimizations & more
  • Loading branch information
ealcobaca committed Dec 17, 2019
2 parents 76ebbfe + 1b2e604 commit f8c75e5
Show file tree
Hide file tree
Showing 13 changed files with 843 additions and 635 deletions.
4 changes: 2 additions & 2 deletions docs/source/api.rst
Original file line number Diff line number Diff line change
Expand Up @@ -24,8 +24,8 @@ This is the full API documentation of the `pymfe` toolbox.

.. _general_ref:

:mod:`pymfe.general`: Geneal Meta-features
==========================================
:mod:`pymfe.general`: General Meta-features
===========================================

.. automodule:: pymfe.general
:no-members:
Expand Down
42 changes: 22 additions & 20 deletions pymfe/clustering.py
Original file line number Diff line number Diff line change
Expand Up @@ -147,11 +147,11 @@ def precompute_group_distances(cls,
"intraclass_dists"
}.issubset(kwargs):
precomp_vals["pairwise_norm_interclass_dist"] = (
MFEClustering._pairwise_norm_interclass_dist(
MFEClustering._calc_pairwise_norm_interclass_dist(
N=N, y=y, dist_metric=dist_metric, classes=classes))

precomp_vals["pairwise_intraclass_dists"] = (
MFEClustering._all_intraclass_dists(
MFEClustering._calc_all_intraclass_dists(
N=N,
y=y,
dist_metric=dist_metric,
Expand Down Expand Up @@ -307,7 +307,7 @@ class (effectively holding the same result as if the argument
return precomp_vals

@classmethod
def _normalized_interclass_dist(
def _calc_normalized_interclass_dist(
cls,
group_inst_a: np.ndarray,
group_inst_b: np.ndarray,
Expand All @@ -324,7 +324,7 @@ def _normalized_interclass_dist(
return norm_interclass_dist / norm_interclass_dist.size

@classmethod
def _pairwise_norm_interclass_dist(
def _calc_pairwise_norm_interclass_dist(
cls,
N: np.ndarray,
y: np.ndarray,
Expand All @@ -335,7 +335,7 @@ def _pairwise_norm_interclass_dist(
classes = np.unique(y)

interclass_dists = np.array([
MFEClustering._normalized_interclass_dist(
MFEClustering._calc_normalized_interclass_dist(
N[y == class_a, :],
N[y == class_b, :],
dist_metric=dist_metric)
Expand All @@ -345,10 +345,10 @@ def _pairwise_norm_interclass_dist(
return interclass_dists

@classmethod
def _intraclass_dists(cls,
instances: np.ndarray,
dist_metric: str = "euclidean",
get_max_dist: bool = True) -> float:
def _calc_intraclass_dists(cls,
instances: np.ndarray,
dist_metric: str = "euclidean",
get_max_dist: bool = True) -> float:
"""Calculate the intraclass distance of the given instances.
The intraclass is the maximum distance between two distinct
Expand All @@ -361,18 +361,18 @@ def _intraclass_dists(cls,
return intraclass_dists.max() if get_max_dist else intraclass_dists

@classmethod
def _all_intraclass_dists(cls,
N: np.ndarray,
y: np.ndarray,
dist_metric: str = "euclidean",
classes: t.Optional[np.ndarray] = None,
get_max_dist: bool = True) -> np.ndarray:
def _calc_all_intraclass_dists(cls,
N: np.ndarray,
y: np.ndarray,
dist_metric: str = "euclidean",
classes: t.Optional[np.ndarray] = None,
get_max_dist: bool = True) -> np.ndarray:
"""Calculate all intraclass (internal to a class) distances."""
if classes is None:
classes = np.unique(y)

intraclass_dists = np.array([
MFEClustering._intraclass_dists(
MFEClustering._calc_intraclass_dists(
N[y == cur_class, :],
dist_metric=dist_metric,
get_max_dist=get_max_dist) for cur_class in classes
Expand Down Expand Up @@ -517,11 +517,11 @@ def ft_vdu(
"""
if pairwise_norm_interclass_dist is None:
pairwise_norm_interclass_dist = (
MFEClustering._pairwise_norm_interclass_dist(
MFEClustering._calc_pairwise_norm_interclass_dist(
N=N, y=y, dist_metric=dist_metric, classes=classes))

if intraclass_dists is None:
intraclass_dists = MFEClustering._all_intraclass_dists(
intraclass_dists = MFEClustering._calc_all_intraclass_dists(
N=N, y=y, dist_metric=dist_metric, classes=classes).max()

vdu = (pairwise_norm_interclass_dist.min() /
Expand Down Expand Up @@ -617,7 +617,7 @@ def ft_int(

if pairwise_norm_interclass_dist is None:
pairwise_norm_interclass_dist = (
MFEClustering._pairwise_norm_interclass_dist(
MFEClustering._calc_pairwise_norm_interclass_dist(
N=N, y=y, dist_metric=dist_metric, classes=classes))

norm_factor = 2.0 / (class_num * (class_num - 1.0))
Expand Down Expand Up @@ -806,7 +806,9 @@ def ft_nre(
if class_freqs is None:
_, class_freqs = np.unique(y, return_counts=True)

return scipy.stats.entropy(class_freqs / y.size)
num_inst = y.size

return scipy.stats.entropy(class_freqs / num_inst)

@classmethod
def ft_sc(cls,
Expand Down

0 comments on commit f8c75e5

Please sign in to comment.