# The Lloyd-Max algorithm

Here we do some experiments applying Lloyd-Max algorithm to a large set of data and imposing three levels of quantization. The code is included below. The marked part is modified accordingly in each case. MSE is the abbreviation of Mean Squared Error.

 Although the value 0 has a greater probability, the distance between the high blocks is too large to choose a medium quantization level without increasing the MSE. ```%%%%%%%%%%%%%%%%%%% ``````y(500:500+M-1) = ones(M,1); y(3000:3000+M-1) = 0.6*ones(M,1); y(5000:5000+M-1) = 0.3*ones(M,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%```

 Here the higher blocks are closer and then it is more economical in terms of the MSE to choose a medium quantization level for both at spend the other two with the values 0 and 0.3. ```%%%%%%%%%%%%%%%%%%% ``````y(500:500+M-1) = ones(M,1); y(3000:3000+M-1) = 0.9*ones(M,1); y(5000:5000+M-1) = 0.3*ones(M,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%```

 Strange performance of the algorithm. In this case it takes only 2 levels of quantization leaving one unused. We observe a similar behavior if the second block is below 0.5. ```%%%%%%%%%%%%%%%%%%% ``````y(500:500+M-1) = ones(M,1); y(3000:3000+M-1) = 0.9*ones(M,1); y(5000:5000+4*M-1) = 0.3*ones(4*M,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%```

 Separating the heights of the two first block we recover the expected situation. ```%%%%%%%%%%%%%%%%%%% ``````y(500:500+M-1) = 0.7*ones(M,1); y(3000:3000+M-1) = 0.9*ones(M,1); y(5000:5000+4*M-1) = 0.3*ones(4*M,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%```

 Again a strange behavior. A so thin peak, just 3 values out of 10000, should not contribute significantly to the MSE. ```%%%%%%%%%%%%%%%%%%% ``````y(500:500+M-1) = ones(M,1); y(3000:3000+M-1) = 0.9*ones(M,1); y(5000:5000+M-1) = 0.3*ones(M,1); y(4900:4902) = 1.5; %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%```

### The code

The plots were done with the following Matlab code.

 ```N = 3; % quantization levels fprintf('quant. levels = %d\n',N); Ns = 10000; y = zeros(Ns,1); t = 1:Ns; M = 1000; ``````%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% ``````%% MODIFY THIS PART %%%%%%%%%%%%%%%%%%% ``````y(500:500+M-1) = ones(M,1); y(3000:3000+M-1) = 0.6*ones(M,1); y(5000:5000+M-1) = 0.3*ones(M,1); %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% [partition,codebook] = lloyds(y,N); [indx,quant,distor] = quantiz(y,partition,codebook); figure(1) plot(t,y,t,quant,'--'); maxquant = max(quant); minquant = min(quant); codebook fprintf('max level = %d\n',maxquant); fprintf('min level = %d\n',minquant); ```