[vtkusers] K-means values
Sara Rolfe
smrolfe at u.washington.edu
Sat Mar 19 13:16:26 EDT 2011
Hi David,
Thanks for your reply. I added the extra column of zeros when I was
trying figure out why the code wasn't working, but I've removed them
now it.
I had also tried GetOutputDataObject( 1 )->GetBlock( 0 ), replacing
the dot with an arrow, but this just resulted in a different error:
error: ‘class vtkDataObject’ has no member named ‘GetBlock’
I'm not sure what could be causing this type of an error when this
works for you. Before I went back and modified my code it appeared to
be working correctly. Please let let me know if you have any thoughts.
Sara
On Mar 18, 2011, at 6:52 PM, David Thompson wrote:
> Hi Sara,
>
>> 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.
>
> Only the first column of a table on the LEARN_PARAMETERS port needs
> to be vtkIdTypeArray. In the code below, the inputData table is
> attached to the INPUT_DATA port, so there's no constraint on the
> column type. I'm not sure I understand exactly what the code is
> supposed to accomplish; the column you create named "KMeans" is
> initially going to be filled with zeros. The other column will be
> named FeatureInArrayName (not "ScalarMagnitude" because your don't
> ever call inputData->AddColumn on floatArray). Since all the values
> in the first column are identical and both Learn and Assess are
> turned on, the filter will
> 1. Perform Learn by randomly choosing "clusterCount" cluster centers
> (since no LEARN_PARAMETERS input was set) and computing a single
> iteration of k-means.
> 2. Perform Assess by adding 2 columns to the input table: one
> vtkDoubleArray containing the squared distance to the nearest
> cluster center, and one vtkIdTypeArray containing the nearest
> cluster center's ID (as reported by the OUTPUT_MODEL output).
> The output model kMeansStatistics->GetOutputDataObject(1)-
> >GetBlock(0) will report all of the cluster centers as lying on the
> line "KMeans"=0.
> Is that what you had in mind?
>
> David
>
>> //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
>>
>
>
>
>
More information about the vtkusers
mailing list