ITK  5.3.0
Insight Toolkit
itkKdTreeBasedKmeansEstimator.h
Go to the documentation of this file.
1 /*=========================================================================
2  *
3  * Copyright NumFOCUS
4  *
5  * Licensed under the Apache License, Version 2.0 (the "License");
6  * you may not use this file except in compliance with the License.
7  * You may obtain a copy of the License at
8  *
9  * https://www.apache.org/licenses/LICENSE-2.0.txt
10  *
11  * Unless required by applicable law or agreed to in writing, software
12  * distributed under the License is distributed on an "AS IS" BASIS,
13  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
14  * See the License for the specific language governing permissions and
15  * limitations under the License.
16  *
17  *=========================================================================*/
18 #ifndef itkKdTreeBasedKmeansEstimator_h
19 #define itkKdTreeBasedKmeansEstimator_h
20 
21 #include <vector>
22 #include <unordered_map>
23 
24 #include "itkObject.h"
29 
30 namespace itk
31 {
32 namespace Statistics
33 {
73 template <typename TKdTree>
74 class ITK_TEMPLATE_EXPORT KdTreeBasedKmeansEstimator : public Object
75 {
76 public:
79  using Superclass = Object;
82 
84  itkNewMacro(Self);
85 
87  itkTypeMacro(KdTreeBasedKmeansEstimator, Object);
88 
90  using KdTreeNodeType = typename TKdTree::KdTreeNodeType;
91  using MeasurementType = typename TKdTree::MeasurementType;
92  using MeasurementVectorType = typename TKdTree::MeasurementVectorType;
93  using InstanceIdentifier = typename TKdTree::InstanceIdentifier;
94  using SampleType = typename TKdTree::SampleType;
95  using CentroidType = typename KdTreeNodeType::CentroidType;
96 
98  using MeasurementVectorSizeType = unsigned int;
99 
103  using InternalParametersType = std::vector<ParameterType>;
105 
109 
111 
114  using MembershipFunctionVectorType = std::vector<MembershipFunctionPointer>;
117 
121  GetOutput() const;
122 
124  itkSetMacro(Parameters, ParametersType);
125  itkGetConstMacro(Parameters, ParametersType);
129  itkSetMacro(MaximumIteration, int);
130  itkGetConstMacro(MaximumIteration, int);
135  itkSetMacro(CentroidPositionChangesThreshold, double);
136  itkGetConstMacro(CentroidPositionChangesThreshold, double);
137 
139  void
140  SetKdTree(TKdTree * tree);
141 
142  const TKdTree *
143  GetKdTree() const;
144 
146  itkGetConstMacro(MeasurementVectorSize, MeasurementVectorSizeType);
147 
148  itkGetConstMacro(CurrentIteration, int);
149  itkGetConstMacro(CentroidPositionChanges, double);
150 
155  void
156  StartOptimization();
157 
158  using ClusterLabelsType = std::unordered_map<InstanceIdentifier, unsigned int>;
159 
160  itkSetMacro(UseClusterLabels, bool);
161  itkGetConstMacro(UseClusterLabels, bool);
162 
163 protected:
165  ~KdTreeBasedKmeansEstimator() override = default;
166 
167  void
168  PrintSelf(std::ostream & os, Indent indent) const override;
169 
170  void
171  FillClusterLabels(KdTreeNodeType * node, int closestIndex);
172 
179  {
180  public:
181  CandidateVector() = default;
182 
183  struct Candidate
184  {
187  int Size;
188  }; // end of struct
189 
190  virtual ~CandidateVector() = default;
191 
193  int
194  Size() const
195  {
196  return static_cast<int>(m_Candidates.size());
197  }
198 
201  void
203  {
204  this->m_MeasurementVectorSize = NumericTraits<ParameterType>::GetLength(centroids[0]);
205  m_Candidates.resize(centroids.size());
206  for (unsigned int i = 0; i < centroids.size(); ++i)
207  {
208  Candidate candidate;
209  candidate.Centroid = centroids[i];
210  NumericTraits<CentroidType>::SetLength(candidate.WeightedCentroid, m_MeasurementVectorSize);
211  candidate.WeightedCentroid.Fill(0.0);
212  candidate.Size = 0;
213  m_Candidates[i] = candidate;
214  }
215  }
219  void
221  {
222  unsigned int i;
223 
224  centroids.resize(this->Size());
225  for (i = 0; i < static_cast<unsigned int>(this->Size()); ++i)
226  {
227  centroids[i] = m_Candidates[i].Centroid;
228  }
229  }
230 
233  void
235  {
236  unsigned int i, j;
237 
238  for (i = 0; i < static_cast<unsigned int>(this->Size()); ++i)
239  {
240  if (m_Candidates[i].Size > 0)
241  {
242  for (j = 0; j < m_MeasurementVectorSize; ++j)
243  {
244  m_Candidates[i].Centroid[j] =
245  m_Candidates[i].WeightedCentroid[j] / static_cast<double>(m_Candidates[i].Size);
246  }
247  }
248  }
249  }
250 
252  Candidate & operator[](int index) { return m_Candidates[index]; }
253 
254  private:
256  std::vector<Candidate> m_Candidates;
257 
259  MeasurementVectorSizeType m_MeasurementVectorSize{ 0 };
260  }; // end of class
261 
267  double
268  GetSumOfSquaredPositionChanges(InternalParametersType & previous, InternalParametersType & current);
269 
272  int
273  GetClosestCandidate(ParameterType & measurements, std::vector<int> & validIndexes);
274 
276  bool
277  IsFarther(ParameterType & pointA,
278  ParameterType & pointB,
279  MeasurementVectorType & lowerBound,
280  MeasurementVectorType & upperBound);
281 
284  void
285  Filter(KdTreeNodeType * node,
286  std::vector<int> validIndexes,
287  MeasurementVectorType & lowerBound,
288  MeasurementVectorType & upperBound);
289 
291  void
292  CopyParameters(InternalParametersType & source, InternalParametersType & target);
293 
295  void
296  CopyParameters(ParametersType & source, InternalParametersType & target);
297 
299  void
300  CopyParameters(InternalParametersType & source, ParametersType & target);
301 
303  void
304  GetPoint(ParameterType & point, MeasurementVectorType measurements);
305 
306  void
307  PrintPoint(ParameterType & point);
308 
309 private:
311  int m_CurrentIteration{ 0 };
312 
314  int m_MaximumIteration{ 100 };
315 
317  double m_CentroidPositionChanges{ 0.0 };
318 
321  double m_CentroidPositionChangesThreshold{ 0.0 };
322 
325 
328 
331 
333 
335 
336  bool m_UseClusterLabels{ false };
337  bool m_GenerateClusterLabels{ false };
339  MeasurementVectorSizeType m_MeasurementVectorSize{ 0 };
341 }; // end of class
342 } // end of namespace Statistics
343 } // end of namespace itk
344 
345 #ifndef ITK_MANUAL_INSTANTIATION
346 # include "itkKdTreeBasedKmeansEstimator.hxx"
347 #endif
348 
349 #endif
itk::Statistics::DistanceToCentroidMembershipFunction
DistanceToCentroidMembershipFunction models class membership using a distance metric.
Definition: itkDistanceToCentroidMembershipFunction.h:45
Pointer
SmartPointer< Self > Pointer
Definition: itkAddImageFilter.h:92
itk::SimpleDataObjectDecorator
Decorates any "simple" data type (data types without smart pointers) with a DataObject API.
Definition: itkSimpleDataObjectDecorator.h:66
ConstPointer
SmartPointer< const Self > ConstPointer
Definition: itkAddImageFilter.h:93
itk::Statistics::KdTreeBasedKmeansEstimator::DistanceToCentroidMembershipFunctionPointer
typename DistanceToCentroidMembershipFunctionType::Pointer DistanceToCentroidMembershipFunctionPointer
Definition: itkKdTreeBasedKmeansEstimator.h:110
itk::Statistics::KdTreeBasedKmeansEstimator::m_TempVertex
ParameterType m_TempVertex
Definition: itkKdTreeBasedKmeansEstimator.h:334
itk::Statistics::KdTreeBasedKmeansEstimator::MembershipFunctionVectorObjectPointer
typename MembershipFunctionVectorObjectType::Pointer MembershipFunctionVectorObjectPointer
Definition: itkKdTreeBasedKmeansEstimator.h:116
itk::Size
Represent a n-dimensional size (bounds) of a n-dimensional image.
Definition: itkSize.h:71
itk::Statistics::KdTreeBasedKmeansEstimator::MeasurementVectorSizeType
unsigned int MeasurementVectorSizeType
Definition: itkKdTreeBasedKmeansEstimator.h:98
itkDistanceToCentroidMembershipFunction.h
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::Candidate::Centroid
CentroidType Centroid
Definition: itkKdTreeBasedKmeansEstimator.h:185
itk::NumericTraits::SetLength
static void SetLength(T &m, const unsigned int s)
Definition: itkNumericTraits.h:185
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::GetCentroids
void GetCentroids(InternalParametersType &centroids)
Definition: itkKdTreeBasedKmeansEstimator.h:220
itk::Statistics::KdTreeBasedKmeansEstimator::SampleType
typename TKdTree::SampleType SampleType
Definition: itkKdTreeBasedKmeansEstimator.h:94
itk::Statistics::MembershipFunctionBase
MembershipFunctionBase defines common interfaces for membership functions.
Definition: itkMembershipFunctionBase.h:58
itk::SmartPointer< Self >
itk::Statistics::KdTreeBasedKmeansEstimator::m_Parameters
ParametersType m_Parameters
Definition: itkKdTreeBasedKmeansEstimator.h:330
itk::Indent
Control indentation during Print() invocation.
Definition: itkIndent.h:49
itk::Statistics::KdTreeBasedKmeansEstimator::KdTreeNodeType
typename TKdTree::KdTreeNodeType KdTreeNodeType
Definition: itkKdTreeBasedKmeansEstimator.h:90
itk::Statistics::KdTreeBasedKmeansEstimator::m_KdTree
TKdTree::Pointer m_KdTree
Definition: itkKdTreeBasedKmeansEstimator.h:324
itk::Statistics::KdTreeBasedKmeansEstimator::CentroidType
typename KdTreeNodeType::CentroidType CentroidType
Definition: itkKdTreeBasedKmeansEstimator.h:95
itk::Statistics::KdTreeBasedKmeansEstimator::InstanceIdentifier
typename TKdTree::InstanceIdentifier InstanceIdentifier
Definition: itkKdTreeBasedKmeansEstimator.h:93
itk::Statistics::KdTreeBasedKmeansEstimator::ClusterLabelsType
std::unordered_map< InstanceIdentifier, unsigned int > ClusterLabelsType
Definition: itkKdTreeBasedKmeansEstimator.h:158
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::Candidate
Definition: itkKdTreeBasedKmeansEstimator.h:183
itk::LightObject
Light weight base class for most itk classes.
Definition: itkLightObject.h:55
itk::point
*par Constraints *The filter requires an image with at least two dimensions and a vector *length of at least The theory supports extension to scalar but *the implementation of the itk vector classes do not **The template parameter TRealType must be floating point(float or double) or *a user-defined "real" numerical type with arithmetic operations defined *sufficient to compute derivatives. **\par Performance *This filter will automatically multithread if run with *SetUsePrincipleComponents
itk::Statistics::KdTreeBasedKmeansEstimator
fast k-means algorithm implementation using k-d tree structure
Definition: itkKdTreeBasedKmeansEstimator.h:74
itkNumericTraitsArrayPixel.h
itk::Statistics::KdTreeBasedKmeansEstimator::MeasurementType
typename TKdTree::MeasurementType MeasurementType
Definition: itkKdTreeBasedKmeansEstimator.h:91
itkObject.h
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::Size
int Size() const
Definition: itkKdTreeBasedKmeansEstimator.h:194
itk
The "itk" namespace contains all Insight Segmentation and Registration Toolkit (ITK) classes....
Definition: itkAnnulusOperator.h:24
itk::NumericTraits::GetLength
static unsigned int GetLength()
Definition: itkNumericTraits.h:208
itk::Statistics::KdTreeBasedKmeansEstimator::MembershipFunctionPointer
typename MembershipFunctionType::ConstPointer MembershipFunctionPointer
Definition: itkKdTreeBasedKmeansEstimator.h:113
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector
Candidate Vector.
Definition: itkKdTreeBasedKmeansEstimator.h:178
itk::Array< double >
itk::Object
Base class for most ITK classes.
Definition: itkObject.h:61
itk::Statistics::KdTreeBasedKmeansEstimator::m_MembershipFunctionsObject
MembershipFunctionVectorObjectPointer m_MembershipFunctionsObject
Definition: itkKdTreeBasedKmeansEstimator.h:340
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::SetCentroids
void SetCentroids(InternalParametersType &centroids)
Definition: itkKdTreeBasedKmeansEstimator.h:202
itk::Statistics::KdTreeBasedKmeansEstimator::m_CandidateVector
CandidateVector m_CandidateVector
Definition: itkKdTreeBasedKmeansEstimator.h:332
itkSimpleDataObjectDecorator.h
itk::Statistics::KdTreeBasedKmeansEstimator::MeasurementVectorType
typename TKdTree::MeasurementVectorType MeasurementVectorType
Definition: itkKdTreeBasedKmeansEstimator.h:92
itk::Statistics::KdTreeBasedKmeansEstimator::m_ClusterLabels
ClusterLabelsType m_ClusterLabels
Definition: itkKdTreeBasedKmeansEstimator.h:338
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::Candidate::WeightedCentroid
CentroidType WeightedCentroid
Definition: itkKdTreeBasedKmeansEstimator.h:186
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::Candidate::Size
int Size
Definition: itkKdTreeBasedKmeansEstimator.h:187
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::operator[]
Candidate & operator[](int index)
Definition: itkKdTreeBasedKmeansEstimator.h:252
itkEuclideanDistanceMetric.h
itk::Statistics::KdTreeBasedKmeansEstimator::InternalParametersType
std::vector< ParameterType > InternalParametersType
Definition: itkKdTreeBasedKmeansEstimator.h:103
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::UpdateCentroids
void UpdateCentroids()
Definition: itkKdTreeBasedKmeansEstimator.h:234
itk::Statistics::KdTreeBasedKmeansEstimator::m_DistanceMetric
EuclideanDistanceMetric< ParameterType >::Pointer m_DistanceMetric
Definition: itkKdTreeBasedKmeansEstimator.h:327
itk::Statistics::KdTreeBasedKmeansEstimator::CandidateVector::m_Candidates
std::vector< Candidate > m_Candidates
Definition: itkKdTreeBasedKmeansEstimator.h:256
itk::Statistics::KdTreeBasedKmeansEstimator::MembershipFunctionVectorType
std::vector< MembershipFunctionPointer > MembershipFunctionVectorType
Definition: itkKdTreeBasedKmeansEstimator.h:114