예제 #1
0
void point_pca_ep(const YA_BaseT &input, const eltype epsilon, 
                  const ya_type2 &dims, EigenOptions &eigopts, YA_RowD &vmean, 
                  YA_RowD &vmin, YA_RowD &vmax, YA_RowD &vstd, 
                  const int verbose) {
  YA_DEBUG_ERROR(epsilon>0,
                 "Epsilon must be greater than 0 for point_pca");

  int me, num_procs;
  ya_mpi_info(me,num_procs);

  YA_ColI counts, starts;
  ya_mpi_counts(input.rows(),num_procs,counts,starts);
  
  eigopts.dim(input.cols());
  
  YA_MatT output;
  _point_pca_ep(input,epsilon,eigopts,output,true,verbose,me,num_procs,
                counts,starts);

  if (input.cols()!=dims.numel() && counts[me]>0)
    output=YA_MatT(output(":",dims-1));    

  #ifdef YA_MPI
  if (num_procs>1)
    mpi_vstat(output,dims.numel(),vmin,vmax,vmean,vstd);
  else
  #endif
    vstat(output,vmin,vmax,vmean,vstd);
}
예제 #2
0
void point_pca_ep(const YA_BaseT &input, const eltype epsilon, 
                  const ya_type2 &dims, EigenOptions &eigopts, 
                  ya_type3 &output, const int verbose_out) {
  YA_DEBUG_ERROR(epsilon>0,
                 "Epsilon must be greater than 0 for point_pca");

  int me, num_procs;
  ya_mpi_info(me,num_procs);

  YA_ColI counts, starts;
  ya_mpi_counts(input.rows(),num_procs,counts,starts);
  
  eigopts.dim(input.cols());
  
  _point_pca_ep(input,epsilon,eigopts,output,true,verbose_out,me,num_procs,
                counts,starts);

  if (num_procs>1) {
    YA_MatRMT piece_t;
    #ifdef YA_MPI
    if (counts[me]>0)
      piece_t=output(":",dims-1);
    ya_mpi_concat_rows(piece_t,output,dims.numel(),me,num_procs,counts,starts);
    #endif
  } else if (input.cols()!=dims.numel())
    output=YA_MatT(output(":",dims-1));       
}
예제 #3
0
int YAPCAReduce<eltype>::find_map(const ya_type1 &input, 
                                  ya_type2 &output, ya_sizet dim, 
                                  EigenOptions &eigopts) {
  // Target dimensionality
  YA_DEBUG_ERROR(dim<=input.cols(),
                 "Not enough dimensions in input matrix");
  eigopts.dim(dim);
  this->_high_dim=input.cols();
  this->_low_dim=dim;

  // Column center the matrix
  column_means=sum(input)/static_cast<eltype>(input.rows());
  YA_MatT input_cen(input.rows(),input.cols());
  ya_sizet iC=input.cols();
  for (ya_sizet i=0; i<iC; i++)
    input_cen(":",i)=input(":",i)-column_means(i);

  // Calculate covarience matrix
  #ifdef YA_PROGMETER
  YA_TimeKeeper tk;
  YA_ProgMeter pm;
  if (this->_verbose) {
    pm.start("Computing Forward and Reverse Maps:", 70, 0, false);
    tk.start();
  }
  #endif
  
  VM_SymMat covmat=input_cen.T()*input_cen;

  eigs(covmat,eigen_vectors,this->eigen_values,eigopts);

  #ifdef YA_PROGMETER
  if (this->_verbose) {
    pm.finish();
    tk.end();
    cerr << "Done. " << tk << ".\n";
  }
  #endif

  // Calculate the reduced output
  output=input_cen*eigen_vectors;
  return 0;
}
예제 #4
0
void point_pca(const YA_BaseT &input, const ya_sizet k, const ya_type2 &dims,
               EigenOptions &eigopts, ya_type3 &output,const int verbose_out) {
  int me, num_procs;
  ya_mpi_info(me,num_procs);
  eigopts.dim(input.cols());

  YA_ColI counts, starts;
  ya_mpi_counts(input.rows(),num_procs,counts,starts);
  
  _point_pca(input,k,eigopts,output,true,verbose_out,me,num_procs,counts,
             starts);
  
  if (num_procs>1) {
    YA_MatRMT piece_t;
    #ifdef YA_MPI
    if (counts[me]>0)
      piece_t=output(":",dims-1);
    ya_mpi_concat_rows(piece_t,output,dims.numel(),me,num_procs,counts,starts);
    #endif
  } else if (input.cols()!=dims.numel())
    output=YA_MatT(output(":",dims-1));    
}
예제 #5
0
void point_pca(const YA_BaseT &input, const ya_sizet k, const ya_type2 &dims,
               EigenOptions &eigopts, YA_RowD &vmean, YA_RowD &vmin,
               YA_RowD &vmax, YA_RowD &vstd, const int verbose) {
  int me, num_procs;
  ya_mpi_info(me,num_procs);
  eigopts.dim(input.cols());

  YA_ColI counts, starts;
  ya_mpi_counts(input.rows(),num_procs,counts,starts);
  
  YA_MatT output;
  _point_pca(input,k,eigopts,output,true,verbose,me,num_procs,counts,starts);
  
  if (input.cols()!=dims.numel() && counts[me]>0)
    output=YA_MatT(output(":",dims-1));    

  #ifdef YA_MPI
  if (num_procs>1)
    mpi_vstat(output,dims.numel(),vmin,vmax,vmean,vstd);
  else
  #endif
    vstat(output,vmin,vmax,vmean,vstd);
}