LBG algo
This commit is contained in:
parent
bc09d95645
commit
9ed86888cf
1 changed files with 61 additions and 0 deletions
61
455-Codage_Sources/algo_code/LBG.py
Normal file
61
455-Codage_Sources/algo_code/LBG.py
Normal file
|
@ -0,0 +1,61 @@
|
|||
#!/usr/bin/env python3
|
||||
# -*- coding: utf-8 -*-
|
||||
"""
|
||||
Created on Sun May 5 13:59:37 2019
|
||||
|
||||
@author: pac
|
||||
Algorithme de Linde-Buzo-Gray, version 2D
|
||||
"""
|
||||
|
||||
import numpy as np
|
||||
import matplotlib.pyplot as plt
|
||||
|
||||
from scipy.spatial import Voronoi, voronoi_plot_2d
|
||||
|
||||
mean= [0,0]
|
||||
cov = [[1,0],[0,1]]
|
||||
M = 20;
|
||||
N =100; #point par cluster
|
||||
K = N*M
|
||||
means = np.random.rand(M,2)*10
|
||||
X = np.zeros((K,2))
|
||||
plt.figure()
|
||||
|
||||
for m in range(M):
|
||||
xi = np.random.multivariate_normal(means[m,:],cov,N)
|
||||
X[m*N:(m+1)*N] = xi
|
||||
plt.plot(xi[:,0],xi[:,1],'+')
|
||||
plt.plot(means[:,0],means[:,1],'ob')
|
||||
plt.show()
|
||||
|
||||
# X = np.random.multivariate_normal(mean,cov,K)
|
||||
Y0 = np.random.multivariate_normal(mean, cov,M)
|
||||
Y0 = means;
|
||||
def LBG(X,Y0,eps=1e-5,maxiter=1000):
|
||||
Y = Y0.copy()
|
||||
old_dist = np.inf
|
||||
cluster_index = np.zeros(K,dtype=int)
|
||||
for l in range(maxiter):
|
||||
dist= 0;
|
||||
for k in range(len(X)):
|
||||
quant_min =np.inf
|
||||
for j in range(len(Y)):
|
||||
if np.linalg.norm(X[k]-Y[j]) <np.linalg.norm(X[k]-quant_min):
|
||||
quant_min = Y[j]
|
||||
cluster_index[k] = j
|
||||
dist += sum((X[k]-quant_min)**2)
|
||||
for j in range(len(Y)):
|
||||
Y[j,:] = np.mean(X[cluster_index==j],axis=0)
|
||||
if dist-old_dist < eps:
|
||||
break
|
||||
else:
|
||||
old_dist = dist
|
||||
return Y
|
||||
Y = LBG(X,Y0)
|
||||
vor = Voronoi(Y)
|
||||
voronoi_plot_2d(vor,show_vertices=False)
|
||||
print(Y)
|
||||
plt.plot(X[:,0],X[:,1],'+')
|
||||
plt.plot(Y[:,0],Y[:,1],'o')
|
||||
#plt.plot(Y0[:,0],Y0[:,1],'ob')
|
||||
plt.show()
|
Loading…
Reference in a new issue