Thanks to visit codestin.com
Credit goes to github.com

Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
18 changes: 5 additions & 13 deletions graph/generate_dimension_histogram.py
Original file line number Diff line number Diff line change
@@ -1,10 +1,9 @@
from pathlib import Path

import matplotlib.pyplot as plt
import numpy as np
from tap import Tap

from lib.experiment import get_covariance_matrix
from lib.data import get_experiment_data
from lib.points_generator import generate_mix_distribution


Expand All @@ -14,22 +13,15 @@ class ArgumentParser(Tap):

def main():
args = ArgumentParser().parse_args()
path = args.path
args.path.mkdir(exist_ok=True)

dimension = 20
n_points = 100

sigma_list = [1, 1]
prob = 0.5
mu_list = [np.array([x + [0] * (dimension-2)])
for x in [[-4, 0], [4, 0]]]
n_clusters, prob, mu_list, cov_matrices = get_experiment_data(experiment_id=1, dimension=dimension)


cov_matrices = [get_covariance_matrix(
sigma, dimension) for sigma in sigma_list]

for t in [0, 0.3, 0.7, 0.9]:
filename = path / f'2cluster_hist_t_{t}.png'
for t in [0.2, 0.4, 0.9]:
filename = args.path / f'{n_clusters}_cluster_hist_t_{t}.png'
clusters, _, _ = generate_mix_distribution(
probability=prob,
mu_list=mu_list,
Expand Down
73 changes: 73 additions & 0 deletions graph/plot_minkowski.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,73 @@
from pathlib import Path
from typing import Union

import matplotlib.pyplot as plt
import numpy as np
from tap import Tap

from lib.data import get_experiment_data
from lib.kmeans import assign_to_cluster
from lib.minkowski import minkowski_distance, pairwise_minkowski_distance
from lib.points_generator import generate_mix_distribution


class ArgumentParser(Tap):
path: Path = Path('images/')
'''Path to save image'''

p: float | int = 2
'''Minkowski parameter'''

t: float = 0.
'''Parameter of data distribution'''

@staticmethod
def to_number(string: str) -> Union[float, int]:
return float(string) if '.' in string else int(string)

def configure(self):
self.add_argument('-p', type=self.to_number)


# pylint: disable=too-many-locals
def main():
args = ArgumentParser().parse_args()
args.path.mkdir(exist_ok=True)
p = args.p

dimension = 20
n_points = 10

n_clusters, prob, mu_list, cov_matrices = get_experiment_data(experiment_id=1, dimension=dimension)

filename = args.path / f'plot_minkowski_function_with_p_{p}.png'
samples, _, centroids = generate_mix_distribution(
probability=prob,
mu_list=mu_list,
cov_matrices=cov_matrices,
n_samples=n_points,
t=0.1
)

dim = 0

clusters, _ = assign_to_cluster(samples, centroids, n_clusters, p)
cluster = np.array(clusters[0])
dimension_data = cluster[:,dim]

points = np.linspace(min(dimension_data), max(dimension_data), 100)
minkowski_values = pairwise_minkowski_distance(
point_a = dimension_data,
points=points,
p=p
)

fig, ax = plt.subplots(figsize=(5, 3))
ax.scatter(points, minkowski_values)
ax.scatter(centroids[0][dim], minkowski_distance(centroids[0][dim], dimension_data, p))
fig.savefig(str(filename), dpi=300, bbox_inches='tight')
plt.close(fig)


if __name__ == '__main__':
main()
32 changes: 32 additions & 0 deletions lib/data.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
import numpy as np

from lib.experiment import get_covariance_matrix


def get_experiment_data(experiment_id: int, dimension: int) -> tuple[int, float, list[np.ndarray], list[np.ndarray]]:

n_clusters: int = 0
prob: float = 0.
mu_prefix: list[list[float | int]] = [[]]
sigma_list: list[float | int] = []

if experiment_id == 1:
print('Experiment with 2 clusters')
n_clusters = 2
sigma_list = [1, 1]
prob = 0.5
mu_prefix = [[-4, 0], [4, 0]]

elif experiment_id == 2:
print('Experiment with 3 clusters')
n_clusters = 3
sigma_list = [1, 1, 1]
prob = 1/3
mu_prefix = [[4, 0, 0], [0, 4, 0], [0, 0, 4]]

else:
KeyError(f'Not supported experiment type: {experiment_id}')

mu_list = [np.array([x + [0] * (dimension - len(x))]) for x in mu_prefix]
cov_matrix = [get_covariance_matrix(sigma, dimension) for sigma in sigma_list]
return n_clusters, prob, mu_list, cov_matrix
35 changes: 3 additions & 32 deletions main.py
Original file line number Diff line number Diff line change
@@ -1,9 +1,9 @@
from pathlib import Path

import numpy as np
from tap import Tap

from lib.experiment import get_covariance_matrix, run_experiment
from lib.data import get_experiment_data
from lib.experiment import run_experiment


class ArgumentParser(Tap):
Expand All @@ -19,35 +19,6 @@ class ArgumentParser(Tap):
'''


def _get_experiment_data(experiment_id: int, dimension: int) -> tuple[int, float, list[np.ndarray], list[np.ndarray]]:

n_clusters: int = 0
prob: float = 0.
mu_prefix: list[list[float | int]] = [[]]
sigma_list: list[float | int] = []

if experiment_id == 1:
print('Experiment with 2 clusters')
n_clusters = 2
sigma_list = [1, 1]
prob = 0.5
mu_prefix = [[-4, 0], [4, 0]]

elif experiment_id == 2:
print('Experiment with 3 clusters')
n_clusters = 3
sigma_list = [1, 1, 1]
prob = 1/3
mu_prefix = [[4, 0, 0], [0, 4, 0], [0, 0, 4]]

else:
KeyError(f'Not supported experiment type: {experiment_id}')

mu_list = [np.array([x + [0] * (dimension - len(x))]) for x in mu_prefix]
cov_matrix = [get_covariance_matrix(sigma, dimension) for sigma in sigma_list]
return n_clusters, prob, mu_list, cov_matrix


def main():
args = ArgumentParser().parse_args()
experiments_path = args.path
Expand All @@ -59,7 +30,7 @@ def main():

dimension = 20
T_parameter = [0.4, 1]
n_clusters, prob, mu_list, cov_matrices = _get_experiment_data(
n_clusters, prob, mu_list, cov_matrices = get_experiment_data(
experiment_id=args.experiment_id, dimension=dimension)

for points in n_points:
Expand Down