Source code for representations
# -*- coding: utf-8 -*-
import numpy as np
from sklearn.metrics.pairwise import euclidean_distances
from tsam.utils.durationRepresentation import durationRepresentation
def representations(
candidates,
clusterOrder,
default,
representationMethod=None,
representationDict=None,
distributionPeriodWise=True,
timeStepsPerPeriod=None,
):
clusterCenterIndices = None
if representationMethod is None:
representationMethod = default
if representationMethod == "meanRepresentation":
clusterCenters = meanRepresentation(candidates, clusterOrder)
elif representationMethod == "medoidRepresentation":
clusterCenters, clusterCenterIndices = medoidRepresentation(
candidates, clusterOrder
)
elif representationMethod == "maxoidRepresentation":
clusterCenters, clusterCenterIndices = maxoidRepresentation(
candidates, clusterOrder
)
elif representationMethod == "minmaxmeanRepresentation":
clusterCenters = minmaxmeanRepresentation(
candidates, clusterOrder, representationDict, timeStepsPerPeriod
)
elif representationMethod == "durationRepresentation" or representationMethod == "distributionRepresentation":
clusterCenters = durationRepresentation(
candidates, clusterOrder, distributionPeriodWise, timeStepsPerPeriod, representMinMax=False,
)
elif representationMethod == "distributionAndMinMaxRepresentation":
clusterCenters = durationRepresentation(
candidates, clusterOrder, distributionPeriodWise, timeStepsPerPeriod, representMinMax=True,
)
else:
raise ValueError("Chosen 'representationMethod' does not exist.")
return clusterCenters, clusterCenterIndices
[docs]def maxoidRepresentation(candidates, clusterOrder):
"""
Represents the candidates of a given cluster group (clusterOrder)
by its medoid, measured with the euclidean distance.
:param candidates: Dissimilarity matrix where each row represents a candidate. required
:type candidates: np.ndarray
:param clusterOrder: Integer array where the index refers to the candidate and the
Integer entry to the group. required
:type clusterOrder: np.array
"""
# set cluster member that is farthest away from the points of the other clusters as maxoid
clusterCenters = []
clusterCenterIndices = []
for clusterNum in np.unique(clusterOrder):
indice = np.where(clusterOrder == clusterNum)
innerDistMatrix = euclidean_distances(candidates, candidates[indice])
mindistIdx = np.argmax(innerDistMatrix.sum(axis=0))
clusterCenters.append(candidates[indice][mindistIdx])
clusterCenterIndices.append(indice[0][mindistIdx])
return clusterCenters, clusterCenterIndices
[docs]def medoidRepresentation(candidates, clusterOrder):
"""
Represents the candidates of a given cluster group (clusterOrder)
by its medoid, measured with the euclidean distance.
:param candidates: Dissimilarity matrix where each row represents a candidate. required
:type candidates: np.ndarray
:param clusterOrder: Integer array where the index refers to the candidate and the
Integer entry to the group. required
:type clusterOrder: np.array
"""
# set cluster center as medoid
clusterCenters = []
clusterCenterIndices = []
for clusterNum in np.unique(clusterOrder):
indice = np.where(clusterOrder == clusterNum)
innerDistMatrix = euclidean_distances(candidates[indice])
mindistIdx = np.argmin(innerDistMatrix.sum(axis=0))
clusterCenters.append(candidates[indice][mindistIdx])
clusterCenterIndices.append(indice[0][mindistIdx])
return clusterCenters, clusterCenterIndices
[docs]def meanRepresentation(candidates, clusterOrder):
"""
Represents the candidates of a given cluster group (clusterOrder)
by its mean.
:param candidates: Dissimilarity matrix where each row represents a candidate. required
:type candidates: np.ndarray
:param clusterOrder: Integer array where the index refers to the candidate and the
Integer entry to the group. required
:type clusterOrder: np.array
"""
# set cluster centers as means of the group candidates
clusterCenters = []
for clusterNum in np.unique(clusterOrder):
indice = np.where(clusterOrder == clusterNum)
currentMean = candidates[indice].mean(axis=0)
clusterCenters.append(currentMean)
return clusterCenters
[docs]def minmaxmeanRepresentation(
candidates, clusterOrder, representationDict, timeStepsPerPeriod
):
"""
Represents the candidates of a given cluster group (clusterOrder)
by either the minimum, the maximum or the mean values of each time step for
all periods in that cluster depending on the command for each attribute.
:param candidates: Dissimilarity matrix where each row represents a candidate. required
:type candidates: np.ndarray
:param clusterOrder: Integer array where the index refers to the candidate and the
Integer entry to the group. required
:type clusterOrder: np.array
:param representationDict: A dictionary which defines for each attribute whether the typical
period should be represented by the minimum or maximum values within each cluster.
optional (default: None)
:type representationDict: dictionary
:param timeStepsPerPeriod: The number of discrete timesteps which describe one period. required
:type timeStepsPerPeriod: integer
"""
# set cluster center depending of the representationDict
clusterCenters = []
for clusterNum in np.unique(clusterOrder):
indice = np.where(clusterOrder == clusterNum)
currentClusterCenter = np.zeros(len(representationDict) * timeStepsPerPeriod)
for attributeNum in range(len(representationDict)):
startIdx = attributeNum * timeStepsPerPeriod
endIdx = (attributeNum + 1) * timeStepsPerPeriod
if list(representationDict.values())[attributeNum] == "min":
currentClusterCenter[startIdx:endIdx] = candidates[
indice, startIdx:endIdx
].min(axis=1)
elif list(representationDict.values())[attributeNum] == "max":
currentClusterCenter[startIdx:endIdx] = candidates[
indice, startIdx:endIdx
].max(axis=1)
elif list(representationDict.values())[attributeNum] == "mean":
currentClusterCenter[startIdx:endIdx] = candidates[
indice, startIdx:endIdx
].mean(axis=1)
else:
raise ValueError(
'At least one value in the representationDict is neither "min", "max" nor "mean".'
)
clusterCenters.append(currentClusterCenter)
return clusterCenters