Commit 34f4d31e authored by Carlos Mejia's avatar Carlos Mejia
Browse files

Fonction principale modifiee et renommee: learn_2s_som.m

parent 010a99af
function [sMap sMap_denorm Result] = learn_som_carlos(A,nb_neurone,varargin)
% Cree la carte SOM ou S2-SOM Pour donnees cachees
%
% En entree obligatoire
%
% A: les donnees cachees
% nb_neurone: Nombre de neurones
%
% En option
%
% radius: en forme de vecteur, chaque deux elements qui ce suivent constitue
% une temperature [i..i+1],[i+1..i+2],....
% trainlen: en forme de vecteur: chaque element constitue une itération de
% l'entraienement. NB:vecteur radius doit avoir un element en plus
% que le vecteur trainlen.
% tracking: pour visualiser l'apprentissage.
%
% 'S2-SOM': pour faire l'apprentissage avec S2-SOM. Si 'S2-SOM' est
% specifie alors il faut d'autres parametres:
%
% DimData: vecteur contenant la dimention de chaque bloc.
% lambda: vecteur, c'est un hyperparametre pour calculer le poids sur les
% blocs.
% eta: vecteur, c'est un hyperparametre pour calculer le poids sur les
% variables.
%
% En sortie
%
% sMap: La carte SOM ou S2-SOM.
%
% sMap_denorm: La carte SOM ou S2-SOM, denormalisee.
%
% Result: structure (vecteur) avec les sorties ou resultats de chaque cas
% entraine (avec une paire distincte de la combinaison entre lambda
% et eta): sMap, bmus, Alpha, Beta, Perf.
%
% Champs de Result:
% sMap: La carte SOM ou S2-SOM du cas.
% bmus: Bmus (best matching units) sur toute la zone.
% Alpha: Coefficients Alpha multipliant les groupes.
% Beta: Coefficients Alpha multipliant les variables au sans de la
% Carte Topologique.
% Perf: parametre "distortion measure for the map", calcule par
% la fonction som_distortion.
%
% (bmus_pixel:(best matching units) par pixel.)
% Detailed explanation goes here
% Valeurts par defaut
tracking = 0;
init = 'lininit';
lattice = 'rect';
bool_norm = 0;
Result = [];
init_with_make = 1;
pre_train = 1;
%recuperer les donnees
data.data=A;
label=[1:size(data.data,2)];
%Labelise les donnees
ListVar={};
for l=1:length(label)
ListVar{l}=char(strcat('v ',int2str(label(l))));
end
data.colheaders=ListVar;
data_casename='simulation';
sD = som_data_struct(data.data,'name', data_casename,'comp_names', upper(ListVar));
i=1;
while (i<=length(varargin) && bool_norm==0)
if strcmp(varargin{i},'norm')
bool_norm=1;
type_norm=varargin{i+1};
end
i=i+1;
end
%normalisation des donnees
if bool_norm
fprintf(1,'\n-- Normalisation des donnees selon ''%s'' ...\n', type_norm);
if strcmp(type_norm,'simple')
sD_norm=som_normalize(sD);
else
sD_norm=som_normalize(sD,type_norm);
end
else
fprintf(1,'\n-- Pas de normalisation des donnees ...\n');
sD_norm = sD;
end
if ~isempty(varargin)
i=1;
while i<=length(varargin)
if strcmp(varargin{i},'init')
init=varargin{i+1};
end
if strcmp(varargin{i},'tracking')
tracking=varargin{i+1};
end
if strcmp(varargin{i},'lattice')
lattice=varargin{i+1};
end
i=i+1;
end
end
%SOM initialisation
if init_with_make
fprintf(1,'\n-- Initialisation avec SOM_MAKE ... ')
sMap=som_make(sD_norm.data, ...
'munits', nb_neurone, ...
'lattice', lattice, ...
'init', init, ...
'tracking', tracking); % creer la carte initiale avec et effectuer un entrainenemt
else
if strcmp(init,'randinit')
fprintf(1,'\n-- Initialisation avec SOM_RANDINIT ... ')
sMap=som_randinit(sD_norm.data, ...
'munits', nb_neurone, ...
'lattice', lattice, ...
'tracking', tracking); % creer la carte initiale
elseif strcmp(init,'lininit')
fprintf(1,'\n-- Initialisation avec SOM_LININIT ... ')
sMap=som_lininit(sD_norm.data, ...
'munits', nb_neurone, ...
'lattice', lattice, ...
'tracking', tracking); % creer la carte initiale
else
error(sprintf(['\n *** %s error: invalid ''init'' option ''%s'' ***\n', ...
' Shoud be one between { ''lininit'', ''randinit'' } ***\n' ], ...
mfilename, init));
end
fprintf(1,' <som init END>.\n')
end
bool_rad=0;
bool_trainlen=0;
if ~isempty(varargin)
i=1;
while i<=length(varargin)
if ischar(varargin{i})
switch varargin{i}
case 'radius'
bool_rad=1;
loc_rad=i;
rad=varargin{loc_rad+1};
i=i+1;
case 'trainlen'
bool_trainlen=1;
loc_trainlen=i;
trlen=varargin{loc_trainlen+1};
i=i+1;
otherwise
i=i+1;
end
else
i=i+1;
end
end
if pre_train
tracking_ini = tracking;
%tracking_ini = 1;
% batchtrain avec radius ...
if (bool_rad && ~bool_trainlen)
fprintf(1,'\n-- BATCHTRAIN initial avec radius ... ')
if tracking_ini, fprintf(1,'\n'); end
%rad=varargin{loc_rad+1};
j=1;
while j<length(rad)
sMap=som_batchtrain(sMap,sD_norm.data,'radius',[rad(j) rad(j+1)],'tracking',tracking_ini);
j=j+1;
end
end
% batchtrain avec trainlen ...
if (~bool_rad && bool_trainlen)
fprintf(1,'\n-- BATCHTRAIN initial avec trainlen ... ')
if tracking_ini, fprintf(1,'\n'); end
%trlen=varargin{loc_trainlen+1};
j=1;
while j<=length(trlen)
sMap=som_batchtrain(sMap,sD_norm.data,'trainlen',trlen(j),'tracking',tracking_ini);
j=j+1;
end
end
% batchtrain avec radius et trainlen
if (bool_rad && bool_trainlen)
fprintf(1,'\n-- BATCHTRAIN initial avec radius et trainlen ... \n')
if tracking_ini, fprintf(1,'\n'); end
%rad=varargin{loc_rad+1};
%trlen=varargin{loc_trainlen+1};
if length(rad)==length(trlen)+1
j=1;
while j<length(rad)
sMap=som_batchtrain(sMap,sD_norm.data,'radius',[rad(j) rad(j+1)],'trainlen',trlen(j),'tracking',tracking_ini);
j=j+1;
end
else
error('vecteur radius doit avoir un element en plus que le vecteur trainlen ')
end
end
current_perf = som_distortion(sMap,sD_norm);
fprintf(1,'--> som_distortion apres entrainement initiale = %s\n', num2str(current_perf));
else
fprintf(1,'** batchtrain initial non active **\n')
end
end
%S2-SOM
bool_2ssom=0;
bool_DimData=0;
bool_lambda=0;
bool_eta=0;
if ~isempty(varargin)
i=1;
while i<=length(varargin)
if ischar(varargin{i})
switch varargin{i}
case 'S2-SOM'
disp('** S2-SOM Active **');
bool_2ssom=1;
i=i+1;
%mettre en bloc
case 'DimData'
i=i+1;
DimData=varargin{i};
for di=1:length(DimData)
DimBloc(di).Dim=DimData(di);
end
bool_DimData=1;
case 'lambda'
i=i+1;
lambda=varargin{i};
if length(lambda) < 1
error('lambda est de longueur nulle ! Il doit y avoir au moins une valeur')
end
bool_lambda=1;
case 'eta'
i=i+1; eta=varargin{i};
if length(eta) < 1
error('eta est de longueur nulle ! Il doit y avoir au moins une valeur')
end
bool_eta=1;
otherwise
i=i+1;
end
else
i=i+1;
end
end
if (bool_2ssom)
if(bool_lambda && bool_eta && bool_DimData)
best_i = 0;
best_j = 0;
bestperf = inf;
i_train = 1;
n_train = length(lambda)*length(eta);
for i=1:length(lambda)
for j=1:length(eta)
fprintf(1,'\n-- batchtrainRTOM (%d/%d) with lambda=%s and eta=%s ... ',i_train, ...
n_train, num2str(lambda(i)),num2str(eta(j)));
if tracking, fprintf(1,'\n'); end
[Result(i,j).sMap Result(i,j).bmus Result(i,j).Alpha Result(i,j).Beta] = som_batchtrainRTOM( ...
sMap, sD_norm, ...
'TypeAlgo','2SSOM', ...
'DimData',DimData, ...
'DimBloc',DimBloc, ...
'lambda', lambda(i), ...
'eta',eta(j), ...
'radius',[rad(round(length(rad)/2)) ...
rad((round(length(rad)/2))+1)], ...
'trainlen',trlen(round(length(trlen)/2)), ...
'tracking',tracking);
current_perf = som_distortion(Result(i,j).sMap,sD_norm);
fprintf(1,' --> som_distortion=%s\n', num2str(current_perf));
% end
%end
% best_i=0;
% best_j=0;
% bestperf=inf;
% for i=1:length(lambda)
% for j=1:length(eta)
%
Result(i,j).Perf = current_perf;
if Result(i,j).Perf < bestperf
best_i = i;
best_j = j;
end
i_train = i_train + 1;
end
end
sMap = Result(best_i,best_j).sMap;
else
error('manque de parametre')
end
elseif (bool_lambda || bool_eta || bool_DimData)
error('mentionnez si vous voulez S2-SOM')
end
end
% denormalisation de la Map
if bool_norm
sMap_denorm=som_denormalize(sMap,sD_norm.comp_norm);
else
sMap_denorm=sMap;
end
return
function [sMap sMap_denorm Result] = learn_som_carlos(A,nb_neurone,varargin)
% Cree la carte SOM ou S2-SOM Pour donnees cachees
% En entree obligatoire
% A: les donnees cachees
% grille: les Coordonnes geographiques
% nb_neurone: Nombre de neurones
% En option
% radius: en forme de vecteur, chaque deux elements qui ce suivent
% constitue une temperature [i..i+1],[i+1..i+2],....
% trainlen: en forme de vecteur: chaque element constitue une
% itération de l'entraienement. NB:vecteur radius doit
% avoir un element en plus que le vecteur trainlen
% tracking: pour visualiser l'apprentissage
% S2-SOM: pour faire l'apprentissage avec S2-SOM il faut d'autre
% parametre
% DimData: vecteur contenant la dimention de chaque bloc
% lambda: vecteur, c'est un hyperparametre pour calculer
% le poids sur les blocs
% eta: vecteur, c'est un hyperparametre pour calculer
% le poids sur les variables
% En sortie
% sMap: La carte OM ou S2-SOM
% bmus: Bmus (best matching units) sur toute la zone
% bmus_pixel:(best matching units) par pixel
% Detailed explanation goes here
tracking=0;
init='lininit';
lattice='rect'
bool_norm=0;
Result=[];
%recuperer les donnees
data.data=A;
label=[1:size(data.data,2)];
%Labelise les donnees
ListVar={};
for l=1:length(label)
ListVar{l}=char(strcat('v ',int2str(label(l))));
end
data.colheaders=ListVar;
data_casename='simulation';
sD = som_data_struct(data.data,'name', data_casename,'comp_names', upper(ListVar));
i=1;
while (i<=length(varargin) && bool_norm==0)
if strcmp(varargin{i},'norm')
bool_norm=1;
type_norm=varargin{i+1};
end
i=i+1;
end
%normalisation
if bool_norm
if strcmp(type_norm,'simple')
sD_norm=som_normalize(sD);
else
sD_norm=som_normalize(sD,type_norm);
end
else
sD_norm =sD;
end
if ~isempty(varargin)
i=1;
while i<=length(varargin)
if strcmp(varargin{i},'init')
init=varargin{i+1};
end
if strcmp(varargin{i},'tracking')
tracking=varargin{i+1};
end
if strcmp(varargin{i},'lattice')
lattice=varargin{i+1};
end
i=i+1;
end
end
%SOM initialisation
sMap=som_make(sD_norm.data,'munits',nb_neurone, 'lattice', lattice,'init',init,'tracking',tracking);%creer la carte initiale
bool_rad=0;
bool_trainlen=0;
if ~isempty(varargin)
i=1;
while i<=length(varargin)
if ischar(varargin{i})
switch varargin{i}
case 'radius'
bool_rad=1;
loc_rad=i;
i=i+1;
case 'trainlen'
bool_trainlen=1;
loc_trainlen=i;
i=i+1;
otherwise
i=i+1;
end
else
i=i+1;
end
end
% batchtrain avec radius et trainlen
if (bool_rad && ~bool_trainlen)
rad=varargin{loc_rad+1};
j=1;
while j<length(rad)
sMap=som_batchtrain(sMap,sD_norm.data,'radius',[rad(j) rad(j+1)]);
j=j+1;
end
end
if (~bool_rad && bool_trainlen)
trlen=varargin{loc_trainlen+1};
j=1;
while j<=length(trlen)
sMap=som_batchtrain(sMap,sD_norm.data,'trainlen',trlen(j));
end
end
if (bool_rad && bool_trainlen)
rad=varargin{loc_rad+1};
trlen=varargin{loc_trainlen+1};
if length(rad)==length(trlen)+1
j=1;
while j<length(rad)
sMap=som_batchtrain(sMap,sD_norm.data,'radius',[rad(j) rad(j+1)],'trainlen',trlen(j));
j=j+1;
end
else
error('vecteur radius doit avoir un element en plus que le vecteur trainlen ')
end
end
end
%S2-SOM
bool_2ssom=0;
bool_DimData=0;
bool_lambda=0;
bool_eta=0;
if ~isempty(varargin)
i=1;
while i<=length(varargin)
if ischar(varargin{i})
switch varargin{i}
case 'S2-SOM'
fprintf('Lancement S2-SOM');
bool_2ssom=1;
i=i+1;
%mettre en bloc
case 'DimData'
i=i+1;
DimData=varargin{i};
for di=1:length(DimData)
DimBloc(di).Dim=DimData(di)
end
bool_DimData=1;
case 'lambda'
i=i+1;
lambda=varargin{i};
bool_lambda=1;
case 'eta'
i=i+1; eta=varargin{i};
bool_eta=1;
otherwise
i=i+1;
end
else
i=i+1;
end
end
if (bool_2ssom)
if(bool_lambda && bool_eta && bool_DimData)
for i=1:length(lambda)
for j=1:length(eta)
[Result(i,j).sMap Result(i,j).bmus Result(i,j).Alpha Result(i,j).Beta]=som_batchtrainRTOM(sMap, sD_norm,'TypeAlgo','2SSOM','DimData',DimData,'DimBloc',DimBloc,'lambda', lambda(i),'eta',eta(j),'radius',[rad(round(length(rad)/2)) rad((round(length(rad)/2))+1)],'trainlen',trlen(round(length(trlen)/2)));
end
end
best_i=0;
best_j=0;
bestperf=inf;
for i=1:length(lambda)
for j=1:length(eta)
%
Result(i,j).Perf=som_distortion(Result(i,j).sMap,sD_norm);
if Result(i,j).Perf<bestperf
best_i=i;
best_j=j;
end
%
end
end
sMap=Result(best_i,best_j).sMap;
else
error('manque de parametre')
end
else if (bool_lambda || bool_eta || bool_DimData)
error('mentionnez si vous voulez S2-SOM')
end
end
end
%denormalisation
if bool_norm
sMap_denorm=som_denormalize(sMap,sD_norm.comp_norm);
else
sMap_denorm=sMap;
end
end
......@@ -114,12 +114,15 @@ git commit -m "Code de Khalil Yala de base pour 2S-SOM du 12/04/2018"
# fichiers texte au monde unix ...
# (utiliser dos2unix sur une station linux.)
# Sur Icare:
cd Code-2S-SOM/2s_som
~/bin/convtext -unix *.m
cd Code-2S-SOM/2s_som/
~/bin/convtext -unix *.m
# DEUXIEME COMMIT (fichiers texte convertis a unix ...)
git commit -am "Conversion dos2unix de tout *.m"
# ----------------------------------------------------------------------------
# Eventuelement ...
# ----------------------------------------------------------------------------
# Pour se positionner dans une branche, c-a-d: revenir sur une version
# alternative ou precedente du code.
......@@ -130,46 +133,20 @@ git commit -am "Conversion dos2unix de tout *.m"
# Puis, ici, si l'on veut revenir par exemple a l'etat initial, apres
# l'adaptation de la version de Charles aux chemins de données locaux
# faire :
#
git checkout 54ac88636a6647f1618f0e697bf877fa71c2db92
#
# Revenir au dernier commit de la branche principale: