evaluate_2lsom Subroutine

public subroutine evaluate_2lsom(kohonen_map, input_data, results)

Subroutine to calculate some clustering statistics of a two-level self_organized_map

Type Bound

two_level_self_organizing_map

Arguments

Type IntentOptional Attributes Name
class(two_level_self_organizing_map) :: kohonen_map

A two_level_self_organizing_map object

type(kohonen_pattern), intent(inout), dimension(:) :: input_data

A kohonen_pattern array

real(kind=wp), optional, dimension(:) :: results

A real array


Calls

proc~~evaluate_2lsom~~CallsGraph proc~evaluate_2lsom two_level_self_organizing_map%evaluate_2lsom none~get_prototype kohonen_prototype%get_prototype proc~evaluate_2lsom->none~get_prototype proc~kohonen_pattern_accessor kohonen_pattern%kohonen_pattern_accessor proc~evaluate_2lsom->proc~kohonen_pattern_accessor

Variables

Type Visibility Attributes Name Initial
integer, public :: ipattern1
integer, public :: ipattern2
integer, public :: current_cluster
integer, public :: ic
integer, public :: is
integer, public :: pos
integer, public, dimension(size(input_data)) :: indicator
integer, public, dimension(size(input_data)) :: positions
integer, public, dimension(kohonen_map%number_clusters,size(input_data)) :: sample_positions
integer, public, dimension(kohonen_map%number_clusters) :: number_samples_cluster
type(kohonen_pattern), public :: current_pattern1
type(kohonen_pattern), public :: current_pattern2
type(kohonen_prototype), public :: current_prototype1
type(kohonen_prototype), public :: current_prototype2
real(kind=wp), public, dimension(kohonen_map%number_variables1,kohonen_map%number_variables2) :: current_values1
real(kind=wp), public, dimension(kohonen_map%number_variables1,kohonen_map%number_variables2) :: current_values2
real(kind=wp), public :: current_dissimilarity
real(kind=wp), public, dimension(size(input_data)) :: mean_dissimilarity_a
real(kind=wp), public, dimension(size(input_data)) :: silhouette
real(kind=wp), public, dimension(size(input_data)) :: min_b
real(kind=wp), public, dimension(size(input_data)) :: W
real(kind=wp), public, dimension(size(input_data)) :: B
real(kind=wp), public, dimension(size(input_data),kohonen_map%number_clusters) :: mean_dissimilarity_b

Source Code

   subroutine evaluate_2lsom(kohonen_map,input_data,results)
   !========================================================================================
!!   Subroutine to calculate some clustering statistics of a two-level self_organized_map 
      class(two_level_self_organizing_map) :: kohonen_map
!! A `two_level_self_organizing_map` object
      type(kohonen_pattern),dimension(:),intent(inout) :: input_data
!! A `kohonen_pattern` array
      real(kind=wp),dimension(:),optional :: results
!! A real array
      integer :: ipattern1,ipattern2,current_cluster,ic,is,pos
      integer,dimension(size(input_data)) :: indicator,positions
      integer,dimension(kohonen_map%number_clusters,size(input_data)) :: sample_positions
      integer,dimension(kohonen_map%number_clusters) :: number_samples_cluster
      type(kohonen_pattern) :: current_pattern1,current_pattern2
      type(kohonen_prototype) :: current_prototype1,current_prototype2
      real(kind=wp),dimension(kohonen_map%number_variables1,kohonen_map%number_variables2) :: &
                           current_values1,current_values2
      real(kind=wp) :: current_dissimilarity
      real(kind=wp),dimension(size(input_data)) :: mean_dissimilarity_a,silhouette,min_b,W,B
      real(kind=wp),dimension(size(input_data),kohonen_map%number_clusters) :: mean_dissimilarity_b
   !  Silouette or whatever
   !  find samples in each cluster
      min_b=10.0d8;
      B=0.0_wp;W=0.0_wp;
      do is=1,size(input_data) 
         positions(is)=is;
      enddo
   !   
      do ic=1,kohonen_map%number_clusters
         indicator=0;
         pos=0;
         where(kohonen_map%cluster_samples .eq. ic)
         indicator=1;        
         end where
         number_samples_cluster(ic)=sum(indicator);
         if(number_samples_cluster(ic) .eq. 0) then
         write(6,*) 'WARNING: Empty cluster. No cluster evaluation is done'
         if(present(results)) then
            results=0.0_wp;
         endif
         return
         endif
         do ipattern1=1,size(indicator)
            if(indicator(ipattern1) .eq. 1) then
            pos=pos+1;
            sample_positions(ic,pos)=ipattern1;
            endif
         enddo
      enddo!ic
   !
      do ipattern1=1,size(input_data)
         current_cluster=kohonen_map%cluster_samples(ipattern1);
   ! get current prototype
         current_pattern1=input_data(ipattern1);
         call current_pattern1%get(current_prototype1);
         call current_prototype1%get_prototype(current_values1);
         current_dissimilarity=0.0_wp;
         do ipattern2=1,number_samples_cluster(current_cluster);
            if (sample_positions(current_cluster,ipattern2) .ne. ipattern1) then
               current_pattern2=input_data(ipattern2);
               call current_pattern2%get(current_prototype2);
               call current_prototype2%get_prototype(current_values2);
   !	    if(kohonen_map%number_variables1 .eq. 1 .or. kohonen_map%number_variables2 .eq. 1 ) then
               current_dissimilarity=current_dissimilarity+sum((current_values1-current_values2)**2);
   !            else 
   !              current_dissimilarity=current_dissimilarity+sum(sum((current_values1-current_values2)**2));
   !            endif
            endif
         enddo!ipattern2
         mean_dissimilarity_a(ipattern1)=current_dissimilarity/max(1.0,real(number_samples_cluster(current_cluster)-1));
         W(ipattern1)=current_dissimilarity;
         !
         do ic=1,kohonen_map%number_clusters
            current_dissimilarity=0.0_wp;
            if(ic .ne. current_cluster) then
               do ipattern2=1,number_samples_cluster(ic);
                  current_pattern2=input_data(ipattern2);
                  call current_pattern2%get(current_prototype2);
                  call current_prototype2%get_prototype(current_values2);
   !               if(kohonen_map%number_variables1 .eq. 1 .or. kohonen_map%number_variables2 .eq. 1 ) then
                  current_dissimilarity=current_dissimilarity+sum((current_values1-current_values2)**2);
   !               else
   !                 current_dissimilarity=current_dissimilarity+sum(sum((current_values1-current_values2)**2));
   !               endif
               enddo!ipattern2
            endif
            mean_dissimilarity_b(ipattern1,ic)=current_dissimilarity/max(1.0,real(number_samples_cluster(ic)-1));       
            B(ipattern1)=B(ipattern1)+current_dissimilarity;
         enddo!ic
         
         !
         do ic=1,kohonen_map%number_clusters
            if(ic .ne. current_cluster .and. mean_dissimilarity_b(ipattern1,ic) .lt. min_b(ipattern1) ) then
               min_b(ipattern1)=mean_dissimilarity_b(ipattern1,ic)
            endif
         enddo
         !
         if(mean_dissimilarity_a(ipattern1) .lt. min_b(ipattern1)) then
         silhouette(ipattern1)=1.0_wp-(mean_dissimilarity_a(ipattern1)/min_b(ipattern1));
         else
         silhouette(ipattern1)=(min_b(ipattern1)/mean_dissimilarity_a(ipattern1))-1.0_wp;
         endif
         !write(6,*) ipattern1,mean_dissimilarity_a(ipattern1),min_b(ipattern1),silhouette(ipattern1) !(mean_dissimilarity_b(ipattern1,ic),ic=1,3);
      enddo!ipattern1
      write(6,*) ''
      write(6,*) 'CH= ',(sum(B)/dble(kohonen_map%number_clusters-1))&
                  /(sum(W)/(dble(size(input_data)-kohonen_map%number_clusters))); !,sum(B),sum(W),
      write(6,*) 'Silhouette= ',sum(silhouette)/real(size(silhouette))
      write(6,*) ''
   !
      if(present(results)) then
      results(1)=sum(B);
      results(2)=sum(W);
      results(3)=sum(silhouette)/real(size(silhouette));
      endif
   !
   end subroutine evaluate_2lsom