-
Notifications
You must be signed in to change notification settings - Fork 11
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
- Loading branch information
Showing
4 changed files
with
244 additions
and
0 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -1 +1,3 @@ | ||
.idea | ||
__pycache__/ | ||
*.pyc |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,9 @@ | ||
import math | ||
|
||
|
||
def euclid_squared(a, b): | ||
return sum((x_a - x_b) ** 2 for x_a, x_b in zip(a, b)) | ||
|
||
|
||
def euclid(a, b): | ||
return math.sqrt(euclid_squared(a, b)) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,128 @@ | ||
# | ||
# Python 3! | ||
# | ||
|
||
import dist | ||
from functools import reduce | ||
from collections import defaultdict | ||
|
||
_size_data = 0 | ||
_dim = 0 | ||
|
||
|
||
def generate_codebook(data, size_codebook, epsilon=0.00001): | ||
global _size_data, _dim | ||
|
||
_size_data = len(data) | ||
assert _size_data > 0 | ||
|
||
_dim = len(data[0]) | ||
assert _dim > 0 | ||
|
||
codebook = [] | ||
codebook_abs_weights = [_size_data] | ||
codebook_rel_weights = [1.0] | ||
|
||
# calculate initial codevector: average vector of whole input data | ||
c0 = avg_vec_of_vecs(data, _dim, _size_data) | ||
codebook.append(c0) | ||
|
||
while len(codebook) < size_codebook: | ||
avg_dist = avg_distortion_c0(c0, data) | ||
|
||
codebook, codebook_abs_weights, codebook_rel_weights = split_codebook(data, codebook, | ||
codebook_abs_weights, | ||
codebook_rel_weights, | ||
epsilon, avg_dist) | ||
|
||
return codebook, codebook_abs_weights, codebook_rel_weights | ||
|
||
|
||
def split_codebook(data, codebook, abs_weights, rel_weights, epsilon, initial_avg_dist): | ||
# split codevectors | ||
new_codevectors = [] | ||
for c in codebook: | ||
c1 = new_codevector(c, epsilon) | ||
c2 = new_codevector(c, -epsilon) | ||
new_codevectors.extend((c1, c2)) | ||
|
||
codebook = new_codevectors | ||
len_codebook = len(codebook) | ||
abs_weights = [0] * len_codebook | ||
rel_weights = [0.0] * len_codebook | ||
|
||
# print('> splitting to size', len_codebook) | ||
|
||
avg_dist = 0 | ||
err = epsilon + 1 | ||
num_iter = 0 | ||
while err > epsilon: | ||
# find closest codevectors for each vector in data | ||
closest_c_list = [None] * _size_data | ||
vecs_near_c = defaultdict(list) | ||
vec_idxs_near_c = defaultdict(list) | ||
for i, vec in enumerate(data): | ||
min_dist = None | ||
closest_c_index = None | ||
for i_c, c in enumerate(codebook): | ||
d = dist.euclid_squared(vec, c) | ||
if min_dist is None or d < min_dist: # found new closest codevector | ||
min_dist = d | ||
closest_c_list[i] = c | ||
closest_c_index = i_c | ||
vecs_near_c[closest_c_index].append(vec) | ||
vec_idxs_near_c[closest_c_index].append(i) | ||
|
||
# update codebook | ||
for i_c in range(len_codebook): | ||
vecs = vecs_near_c.get(i_c) or [] | ||
num_vecs_near_c = len(vecs) | ||
if num_vecs_near_c > 0: | ||
new_c = avg_vec_of_vecs(vecs, _dim) | ||
codebook[i_c] = new_c | ||
for i in vec_idxs_near_c[i_c]: | ||
closest_c_list[i] = new_c | ||
abs_weights[i_c] = num_vecs_near_c | ||
rel_weights[i_c] = num_vecs_near_c / _size_data | ||
|
||
# recalculate average distortion value | ||
prev_avg_dist = avg_dist if avg_dist > 0 else initial_avg_dist | ||
avg_dist = avg_distortion_c_list(closest_c_list, data) | ||
err = (prev_avg_dist - avg_dist) / prev_avg_dist | ||
# print(closest_c_list) | ||
# print('> iteration', num_iter, 'avg_dist', avg_dist, 'prev_avg_dist', prev_avg_dist, 'err', err) | ||
|
||
num_iter += 1 | ||
|
||
return codebook, abs_weights, rel_weights | ||
|
||
|
||
def avg_vec_of_vecs(vecs, dim=None, size=None): | ||
size = size or len(vecs) | ||
dim = dim or len(vecs[0]) | ||
avg_vec = [0.0] * dim | ||
for vec in vecs: | ||
for i, x in enumerate(vec): | ||
avg_vec[i] += x / size | ||
|
||
return avg_vec | ||
|
||
|
||
def new_codevector(c, e): | ||
return [x * (1.0 + e) for x in c] | ||
|
||
|
||
def avg_distortion_c0(c0, data, size=None): | ||
size = size or _size_data | ||
return reduce(lambda s, d: s + d / size, | ||
(dist.euclid_squared(c0, vec) | ||
for vec in data), | ||
0.0) | ||
|
||
|
||
def avg_distortion_c_list(c_list, data, size=None): | ||
size = size or _size_data | ||
return reduce(lambda s, d: s + d / size, | ||
(dist.euclid_squared(c_i, data[i]) | ||
for i, c_i in enumerate(c_list)), | ||
0.0) |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,105 @@ | ||
{ | ||
"cells": [ | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 2, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"name": "stdout", | ||
"output_type": "stream", | ||
"text": [ | ||
"generating codebook for size 1\noutput:\n> [0.375, -0.375, 0.6624999999999999], abs_weight=8, rel_weight=1.000000\ngenerating codebook for size 2\noutput:\n> [0.5, 1.625, 3.4499999999999997], abs_weight=4, rel_weight=0.500000\n> [0.25, -2.375, -2.125], abs_weight=4, rel_weight=0.500000\ngenerating codebook for size 4\noutput:\n> [-0.25, 2.0, 5.3], abs_weight=2, rel_weight=0.250000\n> [1.25, 1.25, 1.6], abs_weight=2, rel_weight=0.250000\n> [1.0, -2.5, -2.833333333333333], abs_weight=3, rel_weight=0.375000\n> [-2.0, -2.0, 0.0], abs_weight=1, rel_weight=0.125000\ngenerating codebook for size 8\noutput:\n> [1.0, 2.0, 5.6], abs_weight=1, rel_weight=0.125000\n> [-1.5, 2.0, 5.0], abs_weight=1, rel_weight=0.125000\n> [1.0, 1.0, 2.0], abs_weight=1, rel_weight=0.125000\n> [1.5, 1.5, 1.2], abs_weight=1, rel_weight=0.125000\n> [1.0, -2.5, -4.5], abs_weight=1, rel_weight=0.125000\n> [1.0, -2.5, -2.0], abs_weight=2, rel_weight=0.250000\n> [-2.00002, -2.00002, 0.0], abs_weight=0, rel_weight=0.000000\n> [-2.0, -2.0, 0.0], abs_weight=1, rel_weight=0.125000\n" | ||
] | ||
} | ||
], | ||
"source": [ | ||
"import lbg\n", | ||
"\n", | ||
"testdata = [(-1.5, 2.0, 5.0),\n", | ||
" (-2.0, -2.0, 0.0),\n", | ||
" (1.0, 1.0, 2.0),\n", | ||
" (1.5, 1.5, 1.2),\n", | ||
" (1.0, 2.0, 5.6),\n", | ||
" (1.0, -2.0, -2.0),\n", | ||
" (1.0, -3.0, -2.0),\n", | ||
" (1.0, -2.5, -4.5)]\n", | ||
"\n", | ||
"for cb_size in (1, 2, 4, 8):\n", | ||
" print('generating codebook for size', cb_size)\n", | ||
" cb, cb_abs_w, cb_rel_w = lbg.generate_codebook(testdata, cb_size)\n", | ||
" print('output:')\n", | ||
" for i, c in enumerate(cb):\n", | ||
" print('> %s, abs_weight=%d, rel_weight=%f' % (c, cb_abs_w[i], cb_rel_w[i]))" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 32, | ||
"metadata": {}, | ||
"outputs": [ | ||
{ | ||
"data": { | ||
"text/plain": [ | ||
"<matplotlib.collections.PathCollection at 0x109484748>" | ||
] | ||
}, | ||
"execution_count": 32, | ||
"output_type": "execute_result", | ||
"metadata": {} | ||
}, | ||
{ | ||
"data": { | ||
"image/png": "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\nTkSuQmCC\n" | ||
}, | ||
"output_type": "display_data", | ||
"text": [ | ||
"<matplotlib.figure.Figure at 0x109447710>" | ||
], | ||
"metadata": {} | ||
} | ||
], | ||
"source": [ | ||
"import random\n", | ||
"import matplotlib.pyplot as plt\n", | ||
"\n", | ||
"import lbg\n", | ||
"\n", | ||
"%matplotlib inline\n", | ||
"\n", | ||
"N = 16\n", | ||
"SIZE_CODEBOOK = 8\n", | ||
"\n", | ||
"random.seed(0)\n", | ||
"population = [(random.gauss(0, 1), random.gauss(0, 1))\n", | ||
" for _ in range(N)]\n", | ||
"\n", | ||
"plt.scatter([p[0] for p in population], [p[1] for p in population], marker='x', color='blue')\n", | ||
"\n", | ||
"cb, cb_abs_w, cb_rel_w = lbg.generate_codebook(population, SIZE_CODEBOOK)\n", | ||
"plt.scatter([p[0] for p in cb], [p[1] for p in cb], s=[((w+1) ** 5) * 40 for w in cb_rel_w], marker='o', color='red')\n" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": 8, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"" | ||
] | ||
}, | ||
{ | ||
"cell_type": "code", | ||
"execution_count": null, | ||
"metadata": {}, | ||
"outputs": [], | ||
"source": [ | ||
"" | ||
] | ||
} | ||
], | ||
"metadata": {}, | ||
"nbformat": 4, | ||
"nbformat_minor": 0 | ||
} |