template class mrpt::graphs::CGraphPartitioner
Finds the min-normalized-cut of a weighted undirected graph.
Two methods are provided:
SpectralBisection() : Bisection.
RecursiveSpectralPartition() : Iterative N-parts partition.
This is an implementation of the Shi-Malik method proposed in:
Shi and J. Malik, “Normalized Cuts and Image Segmentation”, IEEE Transactions on Pattern Analysis and Machine Intelligence, vol.22, no.8, pp. 888-905, Aug. 2000.
Parameters:
GRAPH_MATRIX |
The type of square matrices used to represent the connectivity in a graph. Supported types are: mrpt::math::CMatrixDouble, mrpt::math::CMatrixD, mrpt::math::CMatrixFloat, mrpt::math::CMatrixF |
num_t |
The type of matrix elements, thresholds, etc. (double or float). Defaults to the type of matrix elements. |
#include <mrpt/graphs/CGraphPartitioner.h> template <class GRAPH_MATRIX, typename num_t = typename GRAPH_MATRIX::Scalar> class CGraphPartitioner { public: // methods static void RecursiveSpectralPartition( GRAPH_MATRIX& in_A, std::vector<std::vector<uint32_t>>& out_parts, num_t threshold_Ncut = 1, bool forceSimetry = true, bool useSpectralBisection = true, bool recursive = true, unsigned minSizeClusters = 1, const bool verbose = false ); static void SpectralBisection( GRAPH_MATRIX& in_A, std::vector<uint32_t>& out_part1, std::vector<uint32_t>& out_part2, num_t& out_cut_value, bool forceSimetry = true ); static void exactBisection( GRAPH_MATRIX& in_A, std::vector<uint32_t>& out_part1, std::vector<uint32_t>& out_part2, num_t& out_cut_value, bool forceSimetry = true ); static num_t nCut( const GRAPH_MATRIX& in_A, const std::vector<uint32_t>& in_part1, const std::vector<uint32_t>& in_part2 ); };
Methods
static void RecursiveSpectralPartition( GRAPH_MATRIX& in_A, std::vector<std::vector<uint32_t>>& out_parts, num_t threshold_Ncut = 1, bool forceSimetry = true, bool useSpectralBisection = true, bool recursive = true, unsigned minSizeClusters = 1, const bool verbose = false )
Performs the spectral recursive partition into K-parts for a given graph.
The default threshold for the N-cut is 1, which correspond to a cut equal of the geometric mean of self-associations of each pair of groups.
Parameters:
in_A |
[IN] The weights matrix for the graph. It must be a square matrix, where element W ij is the “likelihood” between nodes “i” and “j”, and typically W ii = 1. |
out_parts |
[OUT] An array of partitions, where each partition is represented as a vector of indexs for nodes. |
threshold_Ncut |
[IN] If it is desired to use other than the default threshold, it can be passed here. |
forceSimetry |
[IN] If set to true (default) the elements W ij and W ji are replaced by 0.5*(W ij +W ji). Set to false if matrix is known to be simetric. |
useSpectralBisection |
[IN] If set to true (default) a quick spectral bisection will be used. If set to false, a brute force, exact finding of the min-cut is performed. |
recursive |
[IN] Default=true, recursive algorithm for finding N partitions. Set to false to force 1 bisection as maximum. |
minSizeClusters |
[IN] Default=1, Minimum size of partitions to be accepted. |
Throws |
a std::logic_error if an invalid matrix is passed. |
See also:
static void SpectralBisection( GRAPH_MATRIX& in_A, std::vector<uint32_t>& out_part1, std::vector<uint32_t>& out_part2, num_t& out_cut_value, bool forceSimetry = true )
Performs the spectral bisection of a graph.
This method always perform the bisection, and a measure of the goodness for this cut is returned.
Parameters:
in_A |
[IN] The weights matrix for the graph. It must be a square matrix, where element W ij is the “likelihood” between nodes “i” and “j”, and typically W ii = 1. |
out_part1 |
[OUT] The indexs of the nodes that fall into the first group. |
out_part2 |
[OUT] The indexs of the nodes that fall into the second group. |
out_cut_value |
[OUT] The N-cut value for the proposed cut, in the range [0-2]. |
forceSimetry |
[IN] If set to true (default) the elements W ij and W ji are replaced by 0.5*(W ij +W ji). Set to false if matrix is known to be simetric. |
Throws |
a std::logic_error if an invalid matrix is passed. |
See also:
mrpt::math::CMatrixF, RecursiveSpectralPartition
static void exactBisection( GRAPH_MATRIX& in_A, std::vector<uint32_t>& out_part1, std::vector<uint32_t>& out_part2, num_t& out_cut_value, bool forceSimetry = true )
Performs an EXACT minimum n-Cut graph bisection, (Use CGraphPartitioner::SpectralBisection for a faster algorithm)
Parameters:
in_A |
[IN] The weights matrix for the graph. It must be a square matrix, where element W ij is the “likelihood” between nodes “i” and “j”, and typically W ii = 1. |
out_part1 |
[OUT] The indexs of the nodes that fall into the first group. |
out_part2 |
[OUT] The indexs of the nodes that fall into the second group. |
out_cut_value |
[OUT] The N-cut value for the proposed cut, in the range [0-2]. |
forceSimetry |
[IN] If set to true (default) the elements W ij and W ji are replaced by 0.5*(W ij +W ji). Set to false if matrix is known to be simetric. |
Throws |
a std::logic_error if an invalid matrix is passed. |
See also:
mrpt::math::CMatrixF, RecursiveSpectralPartition
static num_t nCut( const GRAPH_MATRIX& in_A, const std::vector<uint32_t>& in_part1, const std::vector<uint32_t>& in_part2 )
Returns the normaliced cut of a graph, given its adjacency matrix A and a bisection: