[vtkusers] K-means values
Sara Rolfe
smrolfe at u.washington.edu
Fri Mar 18 20:12:54 EDT 2011
Update: from the vtkKMeansStatistics reference page it sounds like
it's necessary for the first column to be a vtkIdType array in order
for learning to be used and the table available on the output port. I
added this, but it does not solve my problem. However, I may have
done so incorrectly. I am including my code below.
Thanks,
Sara
//get data from the file
vtkXMLPolyDataReader* reader = vtkXMLPolyDataReader::New();
reader->SetFileName( inputFile );
reader->Update();
vtkPolyData* polydata = reader->GetOutput();
cout << "Reading data" << endl;
vtkSmartPointer<vtkFloatArray> magnitudeArray =
vtkFloatArray::SafeDownCast(polydata->GetPointData()-
>GetArray(FeatureInArrayName));
// set up table for KMeans
vtkSmartPointer<vtkTable> inputData = vtkSmartPointer<vtkTable>::New();
// first column for kmeans clusters, vtkIdType
vtkSmartPointer<vtkIdTypeArray> idArray =
vtkSmartPointer<vtkIdTypeArray>::New();
idArray->SetNumberOfComponents(1);
idArray->SetName( "KMeans" );
idArray->SetNumberOfTuples(polydata->GetNumberOfPoints());
inputData->AddColumn( idArray );
// second column for data values
vtkSmartPointer<vtkFloatArray> floatArray =
vtkSmartPointer<vtkFloatArray>::New();
floatArray->SetNumberOfComponents(1);
floatArray->SetName( "ScalerMagnitude" );
floatArray->SetNumberOfTuples(polydata->GetNumberOfPoints());
inputData->AddColumn( magnitudeArray );
// KMeans Set up
vtkSmartPointer<vtkKMeansStatistics> kMeansStatistics =
vtkSmartPointer<vtkKMeansStatistics>::New();
kMeansStatistics->SetInput( vtkStatisticsAlgorithm::INPUT_DATA,
inputData );
kMeansStatistics->SetColumnStatus( inputData->GetColumnName( 0 ) , 1 );
kMeansStatistics->SetColumnStatus( inputData->GetColumnName( 1 ) , 1 );
kMeansStatistics->RequestSelectedColumns();
kMeansStatistics->SetDefaultNumberOfClusters( clusterCount );
kMeansStatistics->SetAssessOption( 1 );
kMeansStatistics->SetLearnOption( 1 );
kMeansStatistics->SetMaxNumIterations( 1 );
kMeansStatistics->Update() ;
//vtkTable* tab = vtkTable::SafeDownCast( kMeansStatistics-
>GetOutputDataObject( 1 ).GetBlock( 0 ) );
//double xc = tab->GetValueByName( label, "x" ).ToDouble();
kMeansStatistics->GetOutputDataObject(1).GetBlock( 0 );
On Mar 18, 2011, at 4:30 PM, Sara Rolfe wrote:
> I agree. I also think that the example on the wiki might be more
> helpful if it showed this method of accessing the means.
>
> However, I'm still having some trouble accessing the first block of
> the k-means output, when I use:
>
> vtkTable* tab = vtkTable::SafeDownCast( kMeansStatistics-
> >GetOutputDataObject( 1 ).GetBlock( 0 ) );
>
> or just
> kMeansStatistics->GetOutputDataObject( 1 ).GetBlock( 0 )
>
> I'm getting the following error:
>
> error: request for member ‘GetBlock’ in ‘kMeansStatistics.
> vtkSmartPointer<T>::operator-> [with T = vtkKMeansStatistics]()-
> >
> vtkKMeansStatistics
> ::<
> anonymous
> >
> .vtkStatisticsAlgorithm
> ::<
> anonymous
> >
> .vtkTableAlgorithm
> ::<anonymous>.vtkAlgorithm::GetOutputDataObject(1)’, which is of non-
> class type ‘vtkDataObject*’
>
> Does anyone know what might cause this?
>
> Thanks,
> Sara
>
> On Mar 16, 2011, at 5:32 PM, David Doria wrote:
>
>> On Wed, Mar 16, 2011 at 4:07 PM, Sara Rolfe
>> <smrolfe at u.washington.edu> wrote:
>>>
>>> Hi David,
>>>
>>> It's not a difficult fix, I mainly found it awkward since I
>>> thought I was missing something simple. I understand how it works
>>> better now and can certainly implement it this way. I appreciate
>>> your clarification.
>>>
>>> Sara
>>
>> If you recall, I had the same sort of "it feels awkward" issues a
>> while back. I think the problem is that the suite is very very
>> capable
>> and able to hand very large and serious problems, but many users just
>> want the "very basic" functionality ("which points belong to which
>> cluster?", and "what are the cluster means?"), which is hard to get
>> at. There are many layers of complexity above that that a user must
>> understand (i.e. this "Learn" and "Derive" that you mentioned) that
>> are not concepts in a standard textbook explanation of kmeans
>> clustering. Providing a "simple" interface to do this "one pass" type
>> of thing would definitely be a nice addition.
>>
>> That is, replace:
>>
>> kMeansStatistics->SetLearnOption( 1 ); // This is on by default.
>> kMeansStatistics->SetMaxNumIterations( 1 );
>> vtkTable* tab = vtkTable::SafeDownCast(
>> kMeansStatistics->GetOutputDataObject( 1 ).GetBlock( 0 ) );
>> double xc = tab->GetValueByName( label, "x" ).ToDouble();
>>
>> with
>>
>> double mean0[3];
>> kMeans->GetMean(0,mean0);
>>
>> See the difference :) ?
>>
>> David D.
>
> _______________________________________________
> 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20110318/eea72e9e/attachment.htm>
More information about the vtkusers
mailing list