Bonjours,
Je suis entrain de développer un programme sous Matlab, de classification de signaux.
Pour cela j'utilise la fonction kmeans de Matlab ou je lui envoie en entrée la matrice D (par exemple: de taille 37*348), les lignes correspondant aux signaux et les colonnes aux échantillons.
Par kmeans cela est interprété comme 37 points se trouvant dans 348 dimensions.
Et aussi en entré le scalaire K qui est le nombre de classes que je veux.
[IDX,~,~,sqEuDist] = kmeans(D,K,'emptyaction','drop','replicate',18);%classification
Et ensuite pour évaluer l'efficacité de la classification réalisé par kmeans j'utilise le Critère d'Information Bayesien:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| R=size(D,1);%nombre de points
M=size(D,2);%dimmension du système
variance=1/(size(D,1)-K)*sum(min(sqEuDist.'));%varraince du modèle identité
ecart_type=sqrt(variance);%ecart-type du modèle identité
k=1:K;
nbPtsParClasse=arrayfun(@(classe) numel(find(IDX==classe)),k);
Rclust=nbPtsParClasse(IDX(1:R));%Rclust(p)= nombres de points dans la classe du point p
Temp1=log(1/(ecart_type^M*sqrt(2*pi)))*ones(1,R);
Temp2=-1/(2*variance)*min(sqEuDist.');
Temp3=log(Rclust/R);
log_vraisemblance=sum(Temp1+Temp2+Temp3);
Pj=K-1+M*K+1;%nombre de paramètres
BIC(K)=log_vraisemblance-Pj/2*log(R);%critère d'information Bayesien |
Mon problème se trouve à la ligne:
Temp1=log(1/(ecart_type^M*sqrt(2*pi)))*ones(1,R);
ou ecart_type est à la puissance M càd 348.
L'ordi ne peux pas quantifier ce résultat et le détermine comme un scalaire de valeur Inf.Et mon plus gros problème est que j'aimerais pouvoir faire marcher mon programme pour des signaux avec une valeur d’échantillon bien plus important
Auriez vous déjà utilisé le BIC dans une application proche de la mienne et comment vous en êtes vous sortie ?
Partager