[Insight-users] Fwd: KMeans type mismatch
Luis Ibanez
luis.ibanez at kitware.com
Tue Jul 28 08:06:09 EDT 2009
Hi David,
The Parameters Array expected by the Estimator
is a linear array of doubles.
Therefore, instead of the code:
unsigned int NumClasses = 3;
EstimatorType::ParametersType initialMeans(NumClasses);
initialMeans[0] = InitialMean0;
initialMeans[1] = InitialMean1;
initialMeans[2] = InitialMean2;
estimator->SetParameters( initialMeans );
You should do:
const unsigned int NumClasses = 3;
const unsigned int VectorLength = 3;
EstimatorType::ParametersType initialMeans(NumClasses *
VectorLength);
initialMeans[0] = InitialMean0[0];
initialMeans[1] = InitialMean0[1];
initialMeans[2] = InitialMean0[2];
initialMeans[3] = InitialMean1[0];
initialMeans[4] = InitialMean1[1];
initialMeans[5] = InitialMean1[2];
initialMeans[6] = InitialMean2[0];
initialMeans[7] = InitialMean2[1];
initialMeans[8] = InitialMean2[2];
estimator->SetParameters( initialMeans );
Regards,
Luis
---------------------------------------------
On Tue, Jul 28, 2009 at 7:52 AM, David Doria
<daviddoria+itk at gmail.com<daviddoria%2Bitk at gmail.com>
> wrote:
> ---------- 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
>
> _____________________________________
> 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 ITK FAQ at:
> http://www.itk.org/Wiki/ITK_FAQ
>
> Follow this link to subscribe/unsubscribe:
> http://www.itk.org/mailman/listinfo/insight-users
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.itk.org/pipermail/insight-users/attachments/20090728/b3a3c1c9/attachment.htm>
More information about the Insight-users
mailing list