[vtkusers] vtkPCAStatistics for vectors

Wes Turner wes.turner at kitware.com
Thu Jul 16 11:44:01 EDT 2009


On Thu, Jul 16, 2009 at 5:22 AM, gregthom <gregthom99 at yahoo.com> wrote:

>
> Hi Wes, thanks for pointing out the vtkPCAAnalysis filter. It looks indeed
> more like what I want to achieve however I have two question.
> !) How exactly do I use GetParameterisedShape method for my case ? say I
> want to generate 100 new shapes. What b should I use ?


There may be multiple ways, but a simple way would be:

vtkPolyData *temp
while (need more examples)
{
  temp = vtkPolyData::New();
  temp ->DeepCopy( firstInputPolydataJusttoGetSize );
  PCA->GetParametrisedShape(shapevector, temp);
  // Add temp to the list of things you are maintaining .....
}

You will need to appropriately manage releasing the memory for temp.


> 2) concerning my last post, does doing PCA on the n polydatas themselfs
> differ from doing PCA on the differences (vectors) of all n-1 polydatas
> with
> respect to one reference polydata ?
>

Moderately.  The PCA on the n polydatas will give you the mean polydata and
a set of eignvectors describing the modes of variation from the mean shape.
 PCA on the difference vectors will give you the mean variation from the
chosen exemplar and a set of eigenvectors describing the variation of the
difference vector.  Both can be used to generate additional members of the
set, but my suspicion is that the first is more stable unless you have a
specific reason for preferring one of the polydatas (such as it is the
"correct" answer and it is the deviations from it that are important rather
than an analysis of the population as a whole.)

>
> Thank you
>
> G
>
>
> Wes Turner wrote:
> >
> > Greg,
> > It looks like you are trying to calculate positional variation from a set
> > of
> > polydatas and synthesize other members of the family.  Look at
> > vtkPCAAnalysis filter.
> >
> > - Wes
> >
> > On Tue, Jul 14, 2009 at 10:26 AM, gregthom <gregthom99 at yahoo.com> wrote:
> >
> >>
> >> Hello VTK users
> >>
> >> I was wondering if vtkPCAStatistics can be used for vectors instead of
> >> scalars as in the example at:
> >>
> >> TestPCAStatistics.cxx.
> >>
> >> When looking at this example I see that scalar datas are added to a
> table
> >> before adding to the pca filter, ie
> >>
> >> const char m0Name[] = "M0";
> >>  vtkDoubleArray* dataset1Arr = vtkDoubleArray::New();
> >>  dataset1Arr->SetNumberOfComponents( 1 );
> >>  dataset1Arr->SetName( m0Name );
> >>
> >>  const char m1Name[] = "M1";
> >>  vtkDoubleArray* dataset2Arr = vtkDoubleArray::New();
> >>  dataset2Arr->SetNumberOfComponents( 1 );
> >>  dataset2Arr->SetName( m1Name );
> >>
> >>  const char m2Name[] = "M2";
> >>  vtkDoubleArray* dataset3Arr = vtkDoubleArray::New();
> >>  dataset3Arr->SetNumberOfComponents( 1 );
> >>  dataset3Arr->SetName( m2Name );
> >>
> >>  for ( int i = 0; i < nVals; ++ i )
> >>    {
> >>    int ti = i << 1;
> >>    dataset1Arr->InsertNextValue( mingledData[ti] );
> >>    dataset2Arr->InsertNextValue( mingledData[ti + 1] );
> >>    dataset3Arr->InsertNextValue( i != 12 ? -1. : -1.001 );
> >>    }
> >>
> >>  vtkTable* datasetTable = vtkTable::New();
> >>  datasetTable->AddColumn( dataset1Arr );
> >>  dataset1Arr->Delete();
> >>  datasetTable->AddColumn( dataset2Arr );
> >>  dataset2Arr->Delete();
> >>  datasetTable->AddColumn( dataset3Arr );
> >>  dataset3Arr->Delete();
> >>
> >>  vtkPCAStatistics* pcas = vtkPCAStatistics::New();
> >>  pcas->SetInput( vtkStatisticsAlgorithm::INPUT_DATA, datasetTable );
> >>  pcas->SetNormalizationSchemeByName( normScheme );
> >>  pcas->SetBasisSchemeByName( "FixedBasisEnergy" );
> >>  pcas->SetFixedBasisEnergy( 1. - 1e-8 );
> >>
> >>
> >> In my case, I have 10 polydata sets and I want to do PCA on these
> >> polydata
> >> with the end result of producing other polydatas by taking linea
> >> combinations of the eigen vectors from PCA analysis.
> >>
> >> Here is my approach,
> >>
> >>
> >> 1) use one polydata as reference (P0)
> >> 2) get differences between the points of P0 and each of the other 9
> >> polydatas
> >>    these vectors are stored as
> >>    vtkDoubleArray* vectorsP0toP1array = vtkDoubleArray::New();
> >>    vectorsP0toP1array->SetNumberOfComponents( 3 );
> >>    vectorsP0toP1array->SetName( "vectorsP0toP1" );
> >>
> >>    (...)
> >>
> >>   vtkDoubleArray* vectorsP0toP9array = vtkDoubleArray::New();
> >>    vectorsP0toP9array->SetNumberOfComponents( 3 );
> >>    vectorsP0toP9array->SetName( "vectorsP0toP9" );
> >>
> >> 3) run PCA on the vectors
> >>
> >> 4) obtain a new vector by taking combinations of the PCA eigen vectors
> >>    Add new vector to P0 polydata points to obtain a new polydata model
> >>
> >> Does anyone with experience think this will work ? Could you also please
> >> help with pseudocode for 3) and 4) ? That is where I am stuck right now.
> >> Will adding the vectors columns in a table as in the example work ?
> >>
> >> ie
> >>  vtkTable* datasetTable = vtkTable::New();
> >>  datasetTable->AddColumn( vectorsP0toP1array );
> >>  ...
> >>  datasetTable->AddColumn( vectorsP0toP9array );
> >>
> >> then
> >>  vtkPCAStatistics* pcas = vtkPCAStatistics::New();
> >>  pcas->SetInput( vtkStatisticsAlgorithm::INPUT_DATA, datasetTable );
> >> ????
> >>
> >>
> >>
> >> Thanks for your help in advance
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >>
> >> --
> >> View this message in context:
> >>
> http://www.nabble.com/vtkPCAStatistics-for-vectors-tp24480622p24480622.html
> >> Sent from the VTK - Users mailing list archive at Nabble.com.
> >>
> >> _______________________________________________
> >> Powered by www.kitware.com
> >>
> >> Visit other Kitware open-source projects at
> >> http://www.kitware.com/opensource/opensource.html
> >>
> >> Please keep messages on-topic and check the VTK FAQ at:
> >> http://www.vtk.org/Wiki/VTK_FAQ
> >>
> >> Follow this link to subscribe/unsubscribe:
> >> http://www.vtk.org/mailman/listinfo/vtkusers
> >>
> >
> >
> >
> > --
> > Wesley D. Turner, Ph.D.
> > Kitware, Inc.
> > R&D Engineer
> > 28 Corporate Drive
> > Clifton Park, NY 12065-8662
> > Phone: 518-371-3971 x120
> >
> > _______________________________________________
> > Powered by www.kitware.com
> >
> > Visit other Kitware open-source projects at
> > http://www.kitware.com/opensource/opensource.html
> >
> > Please keep messages on-topic and check the VTK FAQ at:
> > http://www.vtk.org/Wiki/VTK_FAQ
> >
> > Follow this link to subscribe/unsubscribe:
> > http://www.vtk.org/mailman/listinfo/vtkusers
> >
> >
>
> --
> View this message in context:
> http://www.nabble.com/vtkPCAStatistics-for-vectors-tp24480622p24513104.html
> Sent from the VTK - Users mailing list archive at Nabble.com.
>
> _______________________________________________
> Powered by www.kitware.com
>
> Visit other Kitware open-source projects at
> http://www.kitware.com/opensource/opensource.html
>
> Please keep messages on-topic and check the VTK FAQ at:
> http://www.vtk.org/Wiki/VTK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.vtk.org/mailman/listinfo/vtkusers
>



-- 
Wesley D. Turner, Ph.D.
Kitware, Inc.
R&D Engineer
28 Corporate Drive
Clifton Park, NY 12065-8662
Phone: 518-371-3971 x120
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20090716/47463d8c/attachment.htm>


More information about the vtkusers mailing list