!************************************************** program f90_KMEANPP !************************************************** implicit none character::strcom*100 !Comment integer::mcol !Number of variables integer::ndata !Number of data sets integer::kk !Number of cluster integer::mds !minimum data size of each cluster real(8),allocatable::xd(:,:) !Array for input data integer,allocatable::cl(:) !Index of cluster real(8),allocatable::dis(:,:) !Distance from the center of a group real(8),allocatable::w1(:) real(8),allocatable::wxd(:,:,:) real(8),allocatable::wxm(:,:) real(8),allocatable::wva(:,:) real(8),allocatable::wvo(:,:) real(8),allocatable::wwvo(:,:,:) integer,allocatable::num(:) real(8),allocatable::wx(:) real(8),allocatable::wm(:) integer,parameter::itmax=100 real(8),parameter::eps=1D-10 real(8)::dismin real(8),allocatable::dist(:) ! Sum of distance of each group real(8)::dists0,dists1 ! Total sum of distance integer::nzero ! Index of no element integer::ranseedflag=0 integer::iii,i,j,k,j1,j2,kw integer::imethod character::fnameR*50,fnameW*50 character::dummy*100,linebuf*1000 !------------------------------------------- ! Input of cammand line arguments !------------------------------------------- call getarg(1,dummy);read(dummy,*) imethod call getarg(2,dummy);read(dummy,*) kk call getarg(3,dummy);read(dummy,*) mds call getarg(4,fnameR) call getarg(5,fnameW) !------------------------------------------- ! Data input !------------------------------------------- open(11,file=fnameR,status='old') read(11,'(a)') strcom read(11,*) mcol,ndata if(mds<=mcol)mds=mcol+1 allocate(xd(1:ndata,1:mcol)) allocate(cl(1:ndata)) allocate(dis(1:ndata,1:kk)) allocate(w1(1:ndata)) allocate(wxd(1:kk,1:ndata,1:mcol)) allocate(wxm(1:kk,1:mcol)) allocate(wvo(1:mcol,1:mcol)) allocate(wwvo(1:kk,1:mcol,1:mcol)) allocate(num(1:kk)) allocate(wx(1:mcol)) allocate(wm(1:mcol)) allocate(dist(1:kk)) do k=1,ndata read(11,*) (xd(k,j),j=1,mcol) end do close(11) !------------------------------------------- ! Normalization !------------------------------------------- ! call STAND(ndata,mcol,xd) !------------------------------------------- ! Initial value of cluster (k-means++) !------------------------------------------- call CLINI(ndata,mcol,kk,imethod,xd,cl,ranseedflag) !------------------------------------------- ! Start of Iteration work !------------------------------------------- dists0=1.0D30 iii=0 do while(iii<=itmax*10) iii=iii+1 call SELLDAT(ndata,mcol,kk,xd,cl,wxd,num) do k=1,kk do j=1,mcol wxm(k,j)=0.0D0 do i=1,num(k) wxm(k,j)=wxm(k,j)+wxd(k,i,j) end do wxm(k,j)=wxm(k,j)/dble(num(k)) end do end do ! Preparation for calculation of mahalabinos distance if(imethod==0)then do k=1,kk allocate(wva(1:num(k),1:mcol)) do j1=1,num(k) do j2=1,mcol wva(j1,j2)=wxd(k,j1,j2) end do end do call VAR(num(k),mcol,wva,wvo) deallocate(wva) ! ---------------------------------------------------- ! It is not certain ! whether all the time inverse matrix is obtained. ! ---------------------------------------------------- call MATINV(mcol,wvo,mcol) do i=1,mcol do j=1,mcol wwvo(k,i,j)=wvo(i,j) end do end do end do end if ! Calculation of distance do i=1,ndata do j=1,mcol wx(j)=xd(i,j) end do do k=1,kk do j=1,mcol wm(j)=wxm(k,j) end do !------------------------------------ ! imethod=0: Mahalanobis distance ! imethod=1: Cutyblock distance ! imethod=2: Euclidean distance !------------------------------------ if(imethod==0)then do j1=1,mcol do j2=1,mcol ! Inverse matrix of V-CV matrix wvo(j1,j2)=wwvo(k,j1,j2) end do end do dis(i,k)=MAHALANOBIS(mcol,wx,wm,wvo) else dis(i,k)=MINKOWSKI(mcol,wx,wm,imethod) end if end do ! Classification dismin=dis(i,1) do k=2,kk if(dis(i,k)