From 561df931a238c6f483f9e6324bde9ed2dbbddf16 Mon Sep 17 00:00:00 2001 From: Mark Hoekveen Date: Sat, 18 Nov 2023 13:04:21 +0100 Subject: [PATCH] initial commit --- generate.py | 90 +++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 90 insertions(+) create mode 100755 generate.py diff --git a/generate.py b/generate.py new file mode 100755 index 0000000..ae2e592 --- /dev/null +++ b/generate.py @@ -0,0 +1,90 @@ +#/usr/bin/python +import random +import math +import time +import matplotlib.pyplot as plt + +fig = plt.figure() + +def plotShit(points, centroids=None): + """splits dimensions for matplotlib, scatterplots it""" + if dim >= 2: + x = [point[0] for point in points] + y = [point[1] for point in points] + if centroids: + xc = [point[0] for point in centroids] + yc = [point[1] for point in centroids] + if dim >= 3: + threedplot = fig.add_subplot(projection='3d') + z = [point[2] for point in points] + threedplot.scatter(x, y, z) + if centroids: + zc = [point[1] for point in centroids] + threedplot.scatter(xc, yc, zc, s=190.0) + else: + plot = fig.add_subplot() + plot.scatter(x, y) + if centroids: + plot.scatter(xc, yc) + plt.show() + +def printPixels(pixels): + print(chr(27) + "[2J") #Clear + print('┌' + '─'*len(pixels[0])+'┐', flush=False) + for row in pixels: + print('│', end='', flush=False) + for cell in row: + print((' ' if cell == 0 else f'\033[{31+cell}m{cell}\033[0m'), end='', flush=False) + print('│') + print('└' + '─'*len(pixels[0])+'┘', flush=False) + + +n = 2000 # initial points +dim = 2 # in 2 of 3 dimensies. Alleen zinnig voor 2, maar werkt ook voor 3 +k = 10 # aantal clusters/kamers +domains = [(0,1000)]*dim + +points = [tuple(round(random.uniform(lb, ub),2) for lb, ub in domains) for _ in range(n)] +centroids = random.sample(points, k) +epochs = 0 +while epochs < 5: + dists = [tuple(math.dist(p, c) for c in centroids) for p in points] + point_cluster_index = list(map(lambda x: x.index(min(x)), dists)) + points_per_cluster = [[p for i, p in enumerate(points) if point_cluster_index[i] == j] for j in range(k)] + centroids = [tuple(sum(col) / float(len(col)) for col in zip(*points_per_cluster[i])) for i in range(k)] + epochs += 1 + #print(points) + #print(centroids) + #print(dists) + #print(point_cluster_index) + #print(points_per_cluster) + #print("---") + +plotShit(points, centroids) + +width= 64 +height = 24 +#pixels=[[0]*width]*height #kut python +pixels=[[0]*width for _ in range(height)] # aanspreken als pixels[y][x] (rows columns, verwarrend). + +# map cluster centers to pixels: +cluster_pixels = [(int(c[0]/domains[0][1]*width), int(c[1]/domains[1][1]*height))for c in centroids] +for i, c in enumerate(cluster_pixels): + pixels[c[1]][c[0]] = i + +epochs = 0 +while epochs < 20: + for i, c in enumerate(cluster_pixels): + for y, row in enumerate(pixels): + for x, cell in enumerate(row): + if cell == i: + nx = x-random.randrange(-1,2) # randrange heeft non-inclusive upperbound. leuk. + ny = y-random.randrange(-1,2) + if nx >= 0 and ny >= 0 and nx < width and ny < height and pixels[ny][nx] == 0: + pixels[ny][nx] = i + epochs += 1 + printPixels(pixels) + + + +