Skip to content

Commit

Permalink
first version
Browse files Browse the repository at this point in the history
  • Loading branch information
internaut committed Jan 10, 2016
1 parent 29120fb commit d67307f
Show file tree
Hide file tree
Showing 4 changed files with 244 additions and 0 deletions.
2 changes: 2 additions & 0 deletions .gitignore
Original file line number Diff line number Diff line change
@@ -1 +1,3 @@
.idea
__pycache__/
*.pyc
9 changes: 9 additions & 0 deletions dist.py
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))
128 changes: 128 additions & 0 deletions lbg.py
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)
105 changes: 105 additions & 0 deletions lbg_test.ipynb
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": "iVBORw0KGgoAAAANSUhEUgAAAXwAAAEACAYAAACwB81wAAAABHNCSVQICAgIfAhkiAAAAAlwSFlz\nAAALEgAACxIB0t1+/AAAGidJREFUeJzt3XuQXGWd//H3Zyb3ZIncNrCQkCworKwQLpuNQjaNCiQs\nEhyJSmlxFVhZcPfnpYQFi9Ha/f2AUhFxt1AKorKy7CZEEAQqsKRlwiKmgHBNIAoDA4GAKxFDQpzM\nfH9/nE4ySbpnutNn+nY+r6ou+pzz9DnfJqlPP3nOc85RRGBmZq2vrd4FmJlZbTjwzcwywoFvZpYR\nDnwzs4xw4JuZZYQD38wsI6oOfEn7S3pA0jOSnpL0hRLtvitptaQVkqZXe1wzM6vMiBT2sRn4YkSs\nkDQBeFTSkohYtaWBpLnAgRHxXkl/DVwPzEzh2GZmVqaqe/gR8XpErCi8Xw+sBPbbodk84MeFNo8A\nEyVNqvbYZmZWvlTH8CVNBaYDj+ywaT+gZ8Dyq+z8o2BmZsMotcAvDOcsAv6h0NM3M7MGksYYPpJG\nkIT9zRFxR5EmrwKTByzvX1hXbF++uY+ZWYUiQkO1SauHfxPwbERcW2L7z4AzACTNBNZFxNpSO4uI\nlnxdccUVda/B38/fz9+v9V7lqrqHL+kY4DPAU5IeBwL4J+CAJLvjBxFxt6STJP0aeAc4u9rjmplZ\nZaoO/Ih4CGgvo91F1R7LzMx2na+0raFcLlfvEoaVv19z8/drfapk/KcWJEWj1WRm1sgkETU8aWtm\nZg3OgW9mlhEOfDOzjHDgm5llhAPfzCwjHPhmZhnhwDczywgHvplZRjjwreX09EBX17blrq5knVnW\nOfCtufX2Jq8BuruhowPy+eTV0ZGsM8s6B741p9tvhyOOgDFjktfhh8PixQDMmgULF8JxxyWvhQuT\ndWZZ58C35vONb8BnPgMrVkB/f/J68kk44wy4/PJ6V2fWsHzzNGsuzz4LRx8NGzcW3z5uHI/+68PM\n+cphLFyYrJo/P+n8u5dvrarcm6el8ohDs5q57rqdxuy3s2kTB997LYsX37g14BcvhqlTa1KdWUNL\nZUhH0o2S1kp6ssT22ZLWSXqs8PK/u23XrFgBmzeX3t7Xx4RfP7Fdb37WLJg8ufRHzLIirTH8BcCJ\nQ7R5MCKOLLz+OaXjWgsrNr1y49jdh/7ge94zfEWZNbFUAj8ilgFvDdFsyPEls4GKTa988bhzYcKE\n0h+aMAHOO69GFZo1l9RO2ko6ALgzIg4rsm02cBvwCvAq8JWIeLbEfnzS1rbK55OplQBLl0LumF6Y\nPh1Wr955LH/kSJg2DZ56CkaNqnmtZvXSaCdtHwWmRMQGSXOB24H3lWrc2dm59X0ul/OzKG2bkSPh\nwQfhE5+ARx4BDfg7fvTRcNttDntrefl8nnw+X/HnatLDL9L2ReCoiPhdkW3u4RuQjNl3dFB6euWq\nVUm3HyCXg7/4i3qUaVZ39ejhixLj9JImRcTawvsZJD80O4W92UBTp24f8DtNrzzkkORlZmVJpYcv\n6RYgB+wJrAWuAEYBERE/kPT3wOeBXmAj8H8i4pES+3IP38ysAuX28H2lrZlZkys38H0vHTOzjHDg\nm5llhAPfzCwjHPhmZhnhwDczywgHvplZRjjwzcwywoFvZpYRDnwzs4xw4JuZZYQD38wsIxz4ZmYZ\n4cA3M8sIB76ZWUY48M3MMsKBb2aWEakEvqQbJa2V9OQgbb4rabWkFZKmp3FcMzMrX1o9/AXAiaU2\nSpoLHBgR7wUuAK5P6bhmZlamVAI/IpYBbw3SZB7w40LbR4CJkialcWwzMytPrcbw9wN6Biy/Wlhn\nZmY1MqLeBRTT2dm59X0ulyOXy9WtFjOzRpPP58nn8xV/ThGRSgGSDgDujIjDimy7HlgaEf9ZWF4F\nzI6ItUXaRlo1mZllgSQiQkO1S3NIR4VXMT8DzigUNhNYVyzszcxs+KQypCPpFiAH7CnpZeAKYBQQ\nEfGDiLhb0kmSfg28A5ydxnHNzKx8qQ3ppMVDOmZmlanHkI6ZmTUwB76ZWUY48M3MMsKBb2aWEQ58\nM7OMcOCbmWWEA9/MLCMc+GZmGeHANzPLCAe+mVlGOPDNzDLCgW9mlhEOfDOzjHDgW6K7G/7xH2H6\ndJg9G265BXp7612VmaXIt0c2+MUv6J/7t9D7R9o2JyHfN2Y8vR84gjFd98Po0XUu0MwG49sjW3l6\ne6Gjg7aN72wNe4D2d99h5JOPwrXX1rE4M0tTKoEvaY6kVZKel/TVIttnS1on6bHC6/I0jmspWLKk\n5NBN+6aNcN11NS7IzIZL1Y84lNQGfA/4CLAGWC7pjohYtUPTByPilGqPZylbswb6+kpv/+1va1eL\nmQ2rNHr4M4DVEfFSRPQCtwLzirQbcnzJ6uCQQ6BtkL8G06bVrhYzG1ZpBP5+QM+A5VcK63b0QUkr\nJP1c0vtTOK6l4dhjYdIkQjv/HvePHQ+XXlqHosxsOFQ9pFOmR4EpEbFB0lzgduB9pRp3dnZufZ/L\n5cjlcsNdX3ZJcO+9aNYsWL8+ebW3w6hRtJ19Jnz2s/Wu0Mx2kM/nyefzFX+u6mmZkmYCnRExp7B8\nCRARcdUgn3kROCoifldkm6dl1sOmTbBoETz4IOy+exL0f/mX9a7KzMpQ7rTMNAK/HXiO5KTta8Cv\ngNMjYuWANpMiYm3h/QzgvyJiaon9OfDNzCpQs3n4EdEHXAQsAZ4Bbo2IlZIukHR+odlpkp6W9Djw\nHeBT1R7XWktPD3R1bVvu6krWmVl6fKWtNYSuLujogIULk+X582HxYpg1q751mTWDmg3ppM2Bn135\nPBx3XPJ+6VLwuXqz8vjWCmZmth0HvjWErq5kGGfp0uQ1f/72Y/pmVj0Hfg2kekKyuxu+8AXYd1/Y\nc084/ni4//40yqyrqVOTMftcLnktXpysM7P0eAy/BlI7IfnQQzBnTjJnfuANz8aNg4svhiuvTK1m\nM2sePmnbYKo+IblpE+yzD6xbV3z7+PFw++3w0Y9WUaWZNSOftG01ixbB5s2lt7/zjnv4ZjYoB34N\npHJC8uGHk/vcDOaxxyrapS92MsuWWt08LdO2nJDcMma/Syckx45NbnQ22HDXyJEV7bK7u/i5hcmT\nK6zNzJqCx/Cbxf/8D5xwQjJ0U8zIkfC5z8G//VtFu/XFTmbNz2P4reaDH4T3vx9GjSq+fdQo+PKX\na1uTmTUVB36zkOCee+Cww5IZOVseWDJhAkycCD//Ofz5n1e0S1/sZJYtHtJpNhHJ8M7ixcnwzoc+\nlCT12LEV76qnJxnH33JuoasrObfgMXyz5uJ5+Nby/INllvAYvrW8LbOM8vnk1dGRrDOz4lLp4Uua\nQ/JgkzbgxmKPN5T0XWAu8A5wVkSsKLEv9/CzqL8f/vu/YdkyePddOOgg+OQnk/MTg/AsI7Pye/hV\nz8OX1AZ8j+QRh2uA5ZLuiIhVA9rMBQ6MiPdK+mvgemBmtce2FnH33XDeefD229suLhs3LrlJ3Lnn\nwjXXVHyNgZntLI0hnRnA6oh4KSJ6gVuBeTu0mQf8GCAiHgEmSpqUwrGt2S1cCKedBmvWbH8l8YYN\nSU9/wQL42Megr2+nj3qWkVll0gj8/YCBF+S/Ulg3WJtXi7SxrFm3Ds48EzZuLN1mw4YkxW+8cadN\nvqWyWWV80tbqZ8GCbdcTDGbDBrj66p1uKzF58va3mJ41yzN0zAaTxr10XgWmDFjev7BuxzaTh2iz\nVWdn59b3uVyOnM/ENaSqp0X+8IdJmJfjtdfghRfgwAMrL9SsxeTzefL5fMWfq3qWjqR24DmSk7av\nAb8CTo+IlQPanAT8fUT8raSZwHciouhJW8/SaR5VP9hl6lR46aXy2u62GzzwABx11K6UatbSajZL\nJyL6JF0ELGHbtMyVki5INscPIuJuSSdJ+jXJtMyzqz2u1d+sWUnYD5wWWdFTvHbfvfzA7+2FPfao\nuEYz2yaV2yNHxL3AwTus+/4OyxelcSxrIeeeC5dcUvoOoANNmQLTpg1/TWYtzCdtbZdVPS3yjDPK\nazd+fPLDYGZV8b10bJelci+bu+5KrqgtNTVz3LjkOQC33QZt7p+YFeObp1nzeOCB5ErbtWuTh7X3\n9ydBHwEXXQT/8i/Q3l7vKs0algPfmktE8tzeZcvgj39Mxus//vEk+M1sUA58M7OM8O2RzcxsOw58\nM7OMcOCbmWWEA9/MLCMc+GZmGeHANzPLCAe+mVlGOPDNzDLCgW9mlhEOfDOzjHDgm5llRFUPQJG0\nO/CfwAFAN/DJiPh9kXbdwO+BfqA3ImZUc1wzM6tctT38S4D7I+Jg4AHg0hLt+oFcRBzhsDczq49q\nA38e8KPC+x8Bp5ZopxSOZRnV07P9k7S6upJ1ZlaZakP4TyNiLUBEvA78aYl2Adwnabmk86o8pmVM\ndzd0dEA+n7w6OpJ1ZlaZIcfwJd0HTBq4iiTALy/SvNSN7I+JiNck7U0S/CsjYlnF1VomzZoFCxfC\ncccly0uXbnusopmVb8jAj4jjS22TtFbSpIhYK2kf4I0S+3it8N83Jf0UmAGUDPzOzs6t73O5HLlc\nbqgyzcwyI5/Pk8/nK/5cVU+8knQV8LuIuErSV4HdI+KSHdqMA9oiYr2k8cAS4OsRsaTEPv3EK9tO\nV1cyjLNwYbI8fz4sXuxevtkWNXnEoaQ9gP8CJgMvkUzLXCdpX+CGiDhZ0jTgpyTDPSOAn0TElYPs\n04Fv2+npScbstwR8VxdMnQqTJ9ezKrPG4WfampllhJ9pa2aD8nTX7HHgm2WUp7tmj4d0zJpBdzc8\n/zxMnAh/9VfQlk5fLZ/ffrqrJ8Q1p3KHdKq6l46ZDbPf/AbOPBMefRRGj4b+fhg3Dr75TfjsZ+td\nnTUZB75Zo+rpgRkzYN26JOjffTdZ/4c/wAUXwIYNcP75u7z7rq5kiuvSpcmyp7u2Pg/pmDWqc86B\nm2+GzZuLb58wAd58E8aM2aXde7pr6/C0TLNm1t8P48dv69UX8yd/AgsWwCc+Ubu6rCF5WqZZM9uw\noXTPfovNm+H112tTj7UEB75ZIxo/PjlJO5gRI2DKlNrUYy3BgW+WgtQvYpKSMfyRI0u3aW+HOXOq\nOIhljQPfLAXDchHT174Ge++d9OR3NHYs3HDD4D8IZjvwSVuzlAzLRUyvvw4XXwx33pkM8fT2wrRp\ncM01cMIJKRzAWoEvvDJrBfvsk9wX+q234OWXkyttp06tWzmeytncHPhmKRj2i5h23z151dmWoasd\nn03gwG8OHtIxS0GWer6+/07j8ZCOWQ1Nnrx9uPv2BNaIqpqlI+k0SU9L6pN05CDt5khaJen5wqMQ\nzawJDRy6Wro0eT9wOqo1tmofcXgw0A98H/hyRDxWpE0b8DzwEWANsBz4dESsKrFPD+mYNagsDV01\nk5oM6UTEc4WDDXagGcDqiHip0PZWYB5QNPDNrHF56Kq51eLCq/2AgdccvlJYZ2ZmNTRkD1/SfcCk\ngauAAC6LiDuHo6jOzs6t73O5HDlPAzAz2yqfz5PP5yv+XCrTMiUtBb5UYgx/JtAZEXMKy5cAERFX\nldiXx/DNzCpQj9sjlzrYcuAgSQdIGgV8GvhZisc1M7MyVDst81RJPcBM4C5J9xTW7yvpLoCI6AMu\nApYAzwC3RsTK6so2M7NK+UpbM7Mm5ydemZnZdhz4ZmYZ4cA3M8sIB76ZWUY48M3MMsKBb2aWEQ58\nM7OMcOCbmWWEA9/MbEdvvAGrV8OmTfWuJFUOfDOzLZ59Fo45BqZMgSOPhL32gssug76+eleWCt9a\nwcwMoLub/sOmo/VvowEZ1D92HG2fnA8//GH9ahtCubdWcOCbZdmKFfDwwxABM2bA0UfXu6L6Of98\n+m9aQFvf5p23jRmT9P6nTat9XWWoySMOzaz59PTAGw88zVHfPB1eeIG+vkAK2trakqGMf/93OOqo\nepdZe7ffXjzsASS45x648MLa1pQyB75ZxqzNr+Tgsz5EaD2KoH3gxlWrYPbs5OnkRxxRrxLrY7CR\nhYjBtzcJn7Q1y5ijb7iACYWwL+qdd+Ccc2pbVCM4+WSirb309hNPrF0tw8SBb5YlL74Iy5eXDvst\nnnsOnnmmNjU1issvJ8aOY8f/M/1jxsIpp8BBB9WlrDRV+8Sr0yQ9LalP0pGDtOuW9ISkxyX9qppj\nmlkVnniCze2jhm7X3p6c0M2SAw+kbdmD6PDDk5O0u+0G48bR9ncXJOc1WkC1Y/hPAR8Hvj9Eu34g\nFxFvVXk8M6tGeztt5XTzJMpr2GKmT09+6F5+GdatgwMPhPHji7dduxbuuiu5OGv2bDj00NrWuguq\nCvyIeA5A0lDTgYSHj8zqb+ZM2nr/OHS73t7kAqSsmjIleRUTAV/7GnzrW8m/hPr7k/WzZsHixaV/\nIBpArUI4gPskLZd0Xo2OaWY72ntvmDsXRo4s3aa9HY49tnTgZd1NN9H/7Wvg3XeTE9wbN8LGjfT/\n4kE466x6VzeoIXv4ku4DJg1cRRLgl0XEnWUe55iIeE3S3iTBvzIilpVq3NnZufV9Lpcjl8uVeRgz\nG9L11ye3DXjjjaQnP9CIEbDHHg19VWldRcDXv07bxg07bWrb9G4yxLNmDfzZnw1rGfl8nnw+X/Hn\nUrnSVtJS4EsR8VgZba8A/hAR3y6x3Vfamg23N9+EL34RFi2C0aOTdZs2JbNRrrlm2AOraW3YkJzM\nLXVvnYkT4T/+I/lXVA3V40rbogeTNA5oi4j1ksYDJwBfT/G4ZlapvfeGm2+G666DJ59Meq4f+EDS\nu7fSRo9OTmaXCvz+fnjPe2pbUwWq6uFLOhW4DtgLWAesiIi5kvYFboiIkyVNA35KMgw0AvhJRFw5\nyD7dwzezxvWpTxGLbkP9RUJ/0qRkSKfGM5x88zQzs+Hwyiv0TT8S/X4dbZuTcyAhEWPG0nbH7XD8\n8TUvqdzA91RJM7NK7L8/7U8/SduFn0+GxiZORKecQttDy+oS9pVwD9/MrMm5h29mZttx4JuZZYQD\n38wsIxz4ZmYZ4cA3M8sIB76ZWUY48M3MMsKBb2aWEQ58M7OMcOCbmWWEA9/MLCMc+GZmGeHANzPL\nCAe+mVlGVBX4kq6WtFLSCkm3SdqtRLs5klZJel7SV6s5ppmZ7Zpqe/hLgEMjYjqwGrh0xwaS2oDv\nAScChwKnSzqkyuOaWRE9PdDVtW25qytZZwZVBn5E3B8R/YXFXwL7F2k2A1gdES9FRC9wKzCvmuOa\nWXHd3dDRAfl88uroSNaZQfJQ8bScQxLmO9oPGNjHeIXkR8DMUjZrFixcCMcdlywvXZqsM4MyAl/S\nfcCkgauAAC6LiDsLbS4DeiPiljSK6uzs3Po+l8uRy+XS2K2ZWUvI5/Pk8/mKP1f1M20lnQWcB3w4\nIjYV2T4T6IyIOYXlS4CIiKtK7M/PtDXbRV1dyTDOwoXJ8vz5sHixe/mtrtxn2lYV+JLmAN8C/iYi\n/rdEm3bgOeAjwGvAr4DTI2JlifYOfLNd1NOTjNlvCfiuLpg6FSZPrmdVNtxqFfirgVHAlrD/ZURc\nKGlf4IaIOLnQbg5wLclJ4hsj4spB9unANzOrQE0Cfzg48M3MKlNu4PtKWzOzjHDgm5llhAPfzCwj\nHPhmZhnhwDczywgHvplZRjjwzcwywoFvZpYRDnwzs4xw4JuZZYQD38wsIxz4ZmYZ4cA3M8sIB76Z\nWUY48M3MMqKqh5hLuhr4GLAJ+A1wdkS8XaRdN/B7oJ/k2bd+iLmZWY1V28NfAhwaEdOB1cClJdr1\nA7mIOCLLYb8rDx1uJv5+zc3fr/VVFfgRcX9E9BcWfwnsX6Kpqj1WK2j1v3D+fs3N36/1pRnC5wD3\nlNgWwH2Slks6L8VjmplZmYYcw5d0HzBp4CqSAL8sIu4stLmMZGz+lhK7OSYiXpO0N0nwr4yIZVXW\nbmZmFaj6IeaSzgLOAz4cEZvKaH8F8IeI+HaJ7X6CuZlZhcp5iHm1s3TmAF8B/qZU2EsaB7RFxHpJ\n44ETgK+X2mc5RZuZWeWq6uFLWg2MAv63sOqXEXGhpH2BGyLiZEnTgJ+SDAONAH4SEVdWWbeZmVWo\n6iEdMzNrDg03VVLSNyQ9IWmFpPsllZrq2ZQkXS1pZeH73SZpt3rXlCZJp0l6WlKfpCPrXU8aJM2R\ntErS85K+Wu960ibpRklrJT1Z71rSJml/SQ9IekbSU5K+UO+a0iRptKRHJD1e+I7/d9D2jdbDlzQh\nItYX3l8MHB4Rn6tzWamR9FHggYjol3QlEBFR6oK1piPpYJIL7b4PfDkiHqtzSVWR1AY8D3wEWAMs\nBz4dEavqWliKJB0LrAd+HBGH1bueNEnaB9gnIlZImgA8CsxrsT+/cRGxQVI78BDwpYh4qFjbhuvh\nbwn7gvHAb+tVy3Co4GK1phQRz0XEapLpu61gBrA6Il6KiF7gVmBenWtKVWGK9Fv1rmM4RMTrEbGi\n8H49sBLYr75VpSsiNhTejibJ9JJ/lg0X+ACS/lnSy8BZwP+rcznDabCL1awx7Af0DFh+hRYLjKyQ\nNBWYDjxS30rSJalN0uPA60A+Ip4t1baqaZm7aqiLuSLicuDywnjpd4Cz61DmLkvpYrWGVc73M2sk\nheGcRcA/7DCK0PQKIwZHFM4HLpE0OyJ+UaxtXQI/Io4vs+ktwN3DWctwGOr7FS5WOwn4cE0KSlkF\nf36t4FVgyoDl/QvrrElIGkES9jdHxB31rme4RMTbkn4OHA0UDfyGG9KRdNCAxVOBFfWqZTgMuFjt\nlHKuTG5yrTCOvxw4SNIBkkYBnwZ+VueahoNojT+vYm4Cno2Ia+tdSNok7SVpYuH9WOB4BsnMRpyl\nswh4H9AHvAB8PiLeqG9V6Sl1sVodS0qVpFOB64C9gHXAioiYW9+qqlP4kb6WpIN0Y6tdOCjpFiAH\n7AmsBa6IiAV1LSolko4BHgSeIhl2DOCfIuLeuhaWEkkfAH7EtjsS3xwR3yzZvtEC38zMhkfDDemY\nmdnwcOCbmWWEA9/MLCMc+GZmGeHANzPLCAe+mVlGOPDNzDLCgW9mlhH/H9KeuNfIQ5x2AAAAAElF\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
}

0 comments on commit d67307f

Please sign in to comment.