[Insight-users] Fwd: KMeans type mismatch

David Doria daviddoria+itk at gmail.com
Tue Jul 28 07:52:27 EDT 2009


---------- Forwarded message ----------
From: David Doria <daviddoria+itk at gmail.com <daviddoria%2Bitk at gmail.com>>
Date: Thu, Jul 23, 2009 at 9:18 AM
Subject: KMeans type mismatch
To: ITK <insight-users at itk.org>


I want to do a KMeans clustering of 3d points. So I setup a 3-vector like
this:

       typedef itk::Vector< double, 3 > MeasurementVectorType;

and fill it with some points that are clearly in 3 clusters:

       MeasurementVectorType p0, p1, p2, p3, p4, p5, p6, p7, p8;

       //cluster 1
       p0[0]=  0.0; p0[1]= 0.0; p0[2]= 0.0;
       p1[0]=  0.1; p1[1]= 0.0; p1[2]= 0.0;
       p2[0]=  0.0; p2[1]= 0.1; p2[2]= 0.0;

       //cluster 2
       p3[0]=  5.0; p3[1]=  5.0; p3[2]= 5.0;
       p4[0]=  5.1; p4[1]=  5.0; p4[2]= 5.0;
       p5[0]=  5.0; p5[1]=  5.1; p5[2]= 5.0;

       //cluster 3
       p6[0]=  -5.0; p6[1]=  -5.0; p6[2]= -5.0;
       p7[0]=  -5.1; p7[1]=  -5.0; p7[2]= -5.0;
       p8[0]=  -5.0; p8[1]=  -5.1; p8[2]= -5.0;

Then I setup the ListSample for the KdTree:

       typedef itk::Statistics::ListSample< MeasurementVectorType >
SampleType;
       SampleType::Pointer sample = SampleType::New();
       sample->PushBack(p0);
       sample->PushBack(p1);
       sample->PushBack(p2);
       sample->PushBack(p3);
       sample->PushBack(p4);
       sample->PushBack(p5);
       sample->PushBack(p6);
       sample->PushBack(p7);
       sample->PushBack(p8);

       typedef itk::Statistics::WeightedCentroidKdTreeGenerator< SampleType
> TreeGeneratorType;
       //typedef itk::Statistics::KdTreeGenerator< SampleType >
TreeGeneratorType;
       TreeGeneratorType::Pointer treeGenerator = TreeGeneratorType::New();
       treeGenerator->SetSample( sample );
       treeGenerator->SetBucketSize( 3 ); //number of measurement vectors in
a terminal node
       treeGenerator->Update();

Now I want to seed the KMeans algorithm with 3 points in the 3d space:
       // Once we have the k-d tree, it is a simple procedure to produce k
mean estimates

       typedef TreeGeneratorType::KdTreeType TreeType;
       typedef itk::Statistics::KdTreeBasedKmeansEstimator<TreeType>
EstimatorType;
       EstimatorType::Pointer estimator = EstimatorType::New();

       MeasurementVectorType InitialMean0, InitialMean1, InitialMean2;
       InitialMean0[0] = 1.0;
       InitialMean0[1] = 1.0;
       InitialMean0[2] = 1.0;

       InitialMean1[0] = -1.0;
       InitialMean1[1] = -1.0;
       InitialMean1[2] = -1.0;

       InitialMean2[0] = 0.0;
       InitialMean2[1] = 0.0;
       InitialMean2[2] = 0.0;

I create a vector of 3d vectors:
       unsigned int NumClasses = 3;
       EstimatorType::ParametersType initialMeans(NumClasses);
       initialMeans[0] = InitialMean0;
       initialMeans[1] = InitialMean1;
       initialMeans[2] = InitialMean2;

In hopes to do something like this:

       estimator->SetParameters( initialMeans );
       estimator->SetKdTree( treeGenerator->GetOutput() );
       estimator->SetMaximumIteration( 200 );
       estimator->SetCentroidPositionChangesThreshold(0.0);
       estimator->StartOptimization();

But it complains on these lines:
       initialMeans[0] = InitialMean0;

error: cannot convert 'main()::MeasurementVectorType' to 'double' in
assignment

How would I setup these initial means?

On a separate note: is there an agglomerative clustering algorithm in
ITK? That is, have it start with the 9 points in a single cluster and
then split the clusters until some "continue splitting" tolerance is
met?

Thanks,

David

----------------
Anyone know how to fix this type issue?

Thanks,

David
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20090728/9187172a/attachment.htm>


More information about the Insight-users mailing list