Skip to content
GitLab
Projects
Groups
Snippets
Help
Loading...
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
Open sidebar
Carlos Mejia
2S-SOM_versionCM
Commits
34f4d31e
Commit
34f4d31e
authored
Dec 07, 2018
by
Carlos Mejia
Browse files
Fonction principale modifiee et renommee: learn_2s_som.m
parent
010a99af
Changes
3
Hide whitespace changes
Inline
Side-by-side
Showing
3 changed files
with
355 additions
and
284 deletions
+355
-284
Code-2S-SOM/learn_2s_som.m
Code-2S-SOM/learn_2s_som.m
+341
-0
Code-2S-SOM/learn_som_carlos.m
Code-2S-SOM/learn_som_carlos.m
+0
-247
git_cmd_summary.txt
git_cmd_summary.txt
+14
-37
No files found.
Code-2S-SOM/learn_2s_som.m
0 → 100644
View file @
34f4d31e
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
Code-2S-SOM/learn_som_carlos.m
deleted
100644 → 0
View file @
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
% 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
git_cmd_summary.txt
View file @
34f4d31e
...
...
@@ -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: