From 1097541b93c1ac7272973b1abf55dde0a7f3f7c1 Mon Sep 17 00:00:00 2001 From: Pierre-antoine Comby Date: Thu, 4 Apr 2019 10:08:23 +0200 Subject: [PATCH] devoirs de 455 --- 455-Codage_Sources/Cours/chapA.tex | 5 +- .../algo_code/code_arithmetique.py | 1 - 455-Codage_Sources/algo_code/llyod_max.py | 58 +++++++++++++++++++ 455-Codage_Sources/algo_code/quantif.py | 46 +++++++++++++++ 4 files changed, 108 insertions(+), 2 deletions(-) create mode 100755 455-Codage_Sources/algo_code/llyod_max.py create mode 100755 455-Codage_Sources/algo_code/quantif.py diff --git a/455-Codage_Sources/Cours/chapA.tex b/455-Codage_Sources/Cours/chapA.tex index cc07ac4..46f75f5 100644 --- a/455-Codage_Sources/Cours/chapA.tex +++ b/455-Codage_Sources/Cours/chapA.tex @@ -7,12 +7,15 @@ \subsection{version objet} \inputminted{python}{../algo_code/huffman2.py} -\section{Codage arithétique} +\section{Codage arithmétique} +\inputminted{python}{../algio_code/code_arithmetique.py} \section{Codage LZW} \inputminted{python}{../algo_code/LZW.py} \section{Quantification} \subsection{Quantification uniforme} +\inputminted{python}{../algo_code/quantif.py} \subsection{Algorithme de Llyod-max} +\inputminted{python}{../algo_code/llyod_max.py} \subsection{Algorithme LBG} en 2D , ne pas essayer de tracer les cellule de voronoi \section{Codeur prédictif} diff --git a/455-Codage_Sources/algo_code/code_arithmetique.py b/455-Codage_Sources/algo_code/code_arithmetique.py index f05f0f8..90f325c 100755 --- a/455-Codage_Sources/algo_code/code_arithmetique.py +++ b/455-Codage_Sources/algo_code/code_arithmetique.py @@ -74,6 +74,5 @@ def arithm_pratique(X,p): l[-1] = 2*l[-1]-0.5 h[-1] = 2*h[-1]-0.5 return c - #print(arithm(X,p)) print(arithm_pratique(X,p)) diff --git a/455-Codage_Sources/algo_code/llyod_max.py b/455-Codage_Sources/algo_code/llyod_max.py new file mode 100755 index 0000000..f34eb3d --- /dev/null +++ b/455-Codage_Sources/algo_code/llyod_max.py @@ -0,0 +1,58 @@ +#!/usr/bin/env python3 +import numpy as np +from sipy import integrate +from scipy import norm + +M = 8 +X = np.random.normal(0,1,1000) + +def ddp(x): + mean = 0, + sigma = 1 + return norm.pdf(x,mean,sigma) + +def init_thres_vec(M,X): + step = (np.max(X)-np.min(X))/M + thres_intervals = np.array([]) + mid = np.mean(X) + for i in range(int(M/2)): + thres_intervals = np.append(thres_vec,mid+(i+1)*step) + thres_intervals = np.insert(thtres_vec,0,mid-(1+1)*step) + return thres_intervals + +def quant(x,thres,intervals): + thres= np.append(thres, np.inf) + thres= np.insert(thres, 0, -np.inf) + x_hat_q = np.zeros(np.shape(x)) + for i in range(len(thres)-1): + if i == 0: + x_hat_q = np.where(np.logical_and(x > thres[i], x <= thres[i+1]), + np.full(np.size(x_hat_q), intervals[i]), x_hat_q) + elif i == range(len(thres))[-1]-1: + x_hat_q = np.where(np.logical_and(x > thres[i], x <= thres[i+1]), + np.full(np.size(x_hat_q), intervals[i]), x_hat_q) + else: + x_hat_q = np.where(np.logical_and(x > thres[i], x < thres[i+1]), + np.full(np.size(x_hat_q), intervals[i]), x_hat_q) + return x_hat_q + + +def LlyodMax(X,intervals, max_iter=1000,eps=1e-5): + err_min = np.inf + for i in range(max_iter): + for j in range(len(x_hat_q)): + centroids[i] = integrate.quad(lambda x : x*ddp(x), + intervals[j],intervals[j+1])[0]/ + integrate.quad(lambda x : ddp(x), + intervals[j],intervals[j+1])[0] + intervals = 0.5*(centroids[1:]+centroids[:-1]) + x_hat = quant(X,centroids,intervals) + err = np.linalg.norm(X-x_hat) + if err < err_min: + err_min =err + intervals_min = intervals + centroids_min = centroids + if err_min< 1e-5: + break + best_x_hat = quant(X,centroids_min,intervals_min) + return best_x_hat diff --git a/455-Codage_Sources/algo_code/quantif.py b/455-Codage_Sources/algo_code/quantif.py new file mode 100755 index 0000000..ce8ae35 --- /dev/null +++ b/455-Codage_Sources/algo_code/quantif.py @@ -0,0 +1,46 @@ +#!/usr/bin/env python3 + +import numpy as np +import matplotlib.pyplot as plt + +N = 1000 +X = np.random.rand(N) +X_c = (X - 0.5)*10 + +def quantif_uniforme(M,X,xmin=-1,xmax=1,d=0): + """ + réalise la quantification uniforme d'un vecteur sur M niveau + """ + delta = 2 * xmax/M # pas de quantification + Q = np.zeros(len(X)) + for k in range(len(X)): + q = (X[k]/ delta) + if abs(q)