The Spring Festival Implementation of apcluster will try to submit it to opencv ml together with RBM when it is available recently. This is a prototype code that lacks many error control procedures, but supports cvsparsemat.
Mlapcluster. h
# Ifndef guard_mlapcluster_h <br/> # define guard_mlapcluster_h <br/> # include <ml. h> <br/> # define cv_type_name_ml_apcluster "opencv-ml-affinity-propagation-cluster" <br/> struct cv_exports cvapcparams <br/>{< br/> int maxiteration; <br/> int stopcriterion; <br/> double Lambda; <br/> cvapcparams () <br/>: maxiteration (2000), <br/> stopcriterion (200 ), <br/> Lambda (0.9) <br/>{}< br/> cvapcparams (INT _ maxiterati On, int _ stopcriterion, double _ lambda) <br/>: maxiteration (_ maxiteration), <br/> stopcriterion (_ stopcriterion), <br/> Lambda (_ lambda) <br/>{}< br/>}; <br/> class cv_exports cvapcluster: Public cvstatmodel <br/>{< br/> PRIVATE: <br/> cvapcparams * Params; <br/> Public: <br/> cvapcluster (cvapcparams * _ Params) <br/>: Params (_ Params) <br/>{}< br/> virtual ~ Cvapcluster () <br/>{< br/> clear (); <br/>}< br/> virtual bool train (const cvmat * _ train_data, const cvmat * _ response); <br/> virtual bool train (const cvsparsemat * _ train_data, const cvmat * _ response); <br/> virtual void clear (); <br/> virtual void write (cvfilestorage * FS, const char * Name); <br/> virtual void read (cvfilestorage * FS, cvfilenode * root_node ); <br/>}; <br/> # endif
Mlapcluster. cpp
# Include "mlapcluster. H "<br/> # include <limits> <br/> bool cvapcluster: train (const cvmat * similarity, <br/> const cvmat * labels) <br/>{< br/> int stop = 0; <br/> cv_funcname ("cvapcluster: Train"); <br/>__ begin __; <br/> cvmat * RSP; <br/> cvmat * aVL; <br/> int * rspmaxidx; <br/> double * rspmaxval; <br/> double * rspmaxval2; <br/> double * diagrsp; <br/> double & Lam = Params-> Lambda; <br/> double _ Lam = 1. -Lam; <Br/> int num; <br/> If (! Cv_is_mat (similarity) | similarity-> rows! = Similarity-> Cols | cv_mat_type (similarity-> type )! = Cv_64fc1) <br/> cv_error (cv_stsbadarg, <br/> "similarity matrix is a double-point matrix with equal rows and Cols "); </P> <p> num = similarity-> rows; <br/> If (! Cv_is_mat (labels) | labels-> Cols! = Num | cv_mat_type (labels-> type )! = Cv_32sc1) <br/> cv_error (cv_stsbadarg, <br/> "labels array (when passed) must be a valid 1D integer vector of <sample_count> elements "); <br/> RSp = cvcreatemat (Num, num, cv_64fc1); <br/> AVL = cvcreatemat (Num, num, cv_64fc1); <br/> cvzero (RSP ); <br/> cvzero (AVL); </P> <p> rspmaxidx = (int *) cvalloc (Num * sizeof (rspmaxidx [0]); <br/> rspmaxval = (double *) cvalloc (Num * sizeof (rspmaxval [0]); <br/> Rspmaxval2 = (double *) cvalloc (Num * sizeof (rspmaxval2 [0]); <br/> diagrsp = (double *) cvalloc (Num * sizeof (diagrsp [0]); <br/> for (int K = 0; k <Params-> maxiteration; k ++) <br/>{< br/> double * rsp_vec = RSP-> data. DB; <br/> double * avl_vec = AVL-> data. DB; <br/> double * sim_vec = similarity-> data. DB; <br/> double * sim_vec2 = sim_vec; <br/> for (INT I = 0; I <num; I ++) <br/>{< br/> int yk =-1; <br/> do Uble y =-STD: numeric_limits <double >:: max (), y2 =-STD: numeric_limits <double >:: max (); <br/> for (Int J = 0; j <num; j ++) <br/>{< br/> double T = * sim_vec2 + * avl_vec; <br/> If (T> Y) <br/>{< br/> Y = T; <br/> yk = J; <br/>} else if (T> Y2) <br/> Y2 = T; <br/> sim_vec2 ++; <br/> avl_vec ++; <br/>}< br/> for (Int J = 0; j <num; j ++) <br/>{< br/> If (J! = Yk) <br/> * rsp_vec = * rsp_vec * Lam + (* sim_vec-y) * _ Lam; <br/> else <br/> * rsp_vec = * rsp_vec * Lam + (* sim_vec-y2) * _ Lam; <br/> rsp_vec ++; <br/> sim_vec ++; <br/>}< br/> int * rspmaxidx_vec = rspmaxidx; <br/> double * rspmaxval_vec = rspmaxval; <br/> double * rspmaxval2_vec = rspmaxval2; <br/> for (INT I = 0; I <num; I ++, rspmaxidx_vec ++, rspmaxval_vec ++, rspmaxval2_vec ++) <br/>{< br/> * rspmaxidx_vec =-1; <Br/> * rspmaxval_vec = 0; <br/> * rspmaxval2_vec = 0; <br/>}< br/> rsp_vec = RSP-> data. DB; <br/> double * diagrsp_vec = diagrsp; <br/> for (INT I = 0; I <num; I ++, diagrsp_vec ++) <br/>{< br/> rspmaxidx_vec = rspmaxidx; <br/> rspmaxval_vec = rspmaxval; <br/> rspmaxval2_vec = rspmaxval2; <br/> for (Int J = 0; j <num; j ++, rspmaxidx_vec ++, rspmaxval_vec ++, rspmaxval2_vec ++) <br/>{< br/> if (I! = J) <br/>{< br/> If (* rsp_vec> * rspmaxval_vec) <br/>{< br/> * rspmaxidx_vec = I; <br/> * rspmaxval_vec = * rsp_vec; <br/>} else if (* rsp_vec> * rspmaxval2_vec) <br/> * rspmaxval2_vec = * rsp_vec; <br/>} else <br/> * diagrsp_vec = * rsp_vec; <br/> rsp_vec ++; <br/>}< br/> avl_vec = AVL-> data. DB; <br/> diagrsp_vec = diagrsp; <br/> for (INT I = 0; I <num; I ++, diagrsp_vec ++) <br/>{< br/> rspmaxidx_vec = Rspmaxidx; <br/> rspmaxval_vec = rspmaxval; <br/> rspmaxval2_vec = rspmaxval2; <br/> for (Int J = 0; j <num; j ++, rspmaxidx_vec ++, rspmaxval_vec ++, rspmaxval2_vec ++) <br/>{< br/> double TMP; <br/> if (I! = J) <br/>{< br/> if (I! = * Rspmaxidx_vec) <br/> TMP = * diagrsp_vec + * rspmaxval_vec; <br/> else <br/> TMP = * diagrsp_vec + * rspmaxval2_vec; <br/> If (TMP> 0) <br/> TMP = 0; <br/>} else <br/> TMP = * rspmaxval_vec; <br/> * avl_vec = * avl_vec * Lam + TMP * _ Lam; <br/> avl_vec ++; <br/>}< br/> stop ++; <br/> int * cls_vec = labels-> data. i; <br/> rsp_vec = RSP-> data. DB; <br/> avl_vec = AVL-> data. DB; <br/> for (INT I = 0; I <num; I ++, Cl S_vec ++) <br/>{< br/> int maxidx = I; <br/> double maxval =-STD: numeric_limits <double >:: max (); <br/> for (Int J = 0; j <num; j ++) <br/>{< br/> double T = * rsp_vec + * avl_vec; <br/> If (T> maxval) <br/>{< br/> maxval = T; <br/> maxidx = J; <br/>}< br/> rsp_vec ++; <br/> avl_vec ++; <br/>}< br/> If (* cls_vec! = Maxidx) <br/> stop = 0; <br/> * cls_vec = maxidx; <br/>}< br/> If (stop> Params-> stopcriterion) <br/> break; <br/>}< br/> cvfree (& diagrsp); <br/> cvfree (& rspmaxval2 ); <br/> cvfree (& rspmaxval); <br/> cvfree (& rspmaxidx); <br/> cvreleasemat (& AVL); <br/> cvreleasemat (& RSP ); <br/>__ end __; <br/> return stop> Params-> stopcriterion; <br/>}< br/> struct cvsparsenode2d <br/>{< br/> int I; <br/> int K; <br /> Double val; <br/>}; <br/> bool <br/> cvapcluster: train (const cvsparsemat * similarity, <br/> const cvmat * labels) <br/>{< br/> int stop = 0; <br/> cv_funcname ("cvapcluster: Train"); <br/>__ begin __; <br/> int * psize; <br/> int * psize_vec; <br/> int num; <br/> double * RSP; <br/> double * aVL; <br/> double * rsp_vec; <br/> double * avl_vec; <br/> cvsparsenode2d * nodes; <br/> cvsparsenode2d ** node_entries; <br /> Int * rspmaxidx; <br/> double * rspmaxval; <br/> double * rspmaxval2; <br/> double * diagrsp; <br/> int Total = 0; <br/> double & Lam = Params-> Lambda; <br/> double _ Lam = 1. -lam; <br/> If (! Cv_is_sparse_mat (similarity) | similarity-> dims! = 2 | similarity-> size [0]! = Similarity-> size [1] | cv_mat_type (similarity-> type )! = Cv_64fc1) <br/> cv_error (cv_stsbadarg, <br/> "similarity matrix is a double-point sparse matrix with equal rows and Cols "); <br/> num = similarity-> size [0]; <br/> If (! Cv_is_mat (labels) | labels-> Cols! = Num | cv_mat_type (labels-> type )! = Cv_32sc1) <br/> cv_error (cv_stsbadarg, <br/> "labels array (when passed) must be a valid 1D integer vector of <sample_count> elements "); <br/> psize = (int *) cvalloc (Num * sizeof (psize [0]); <br/> psize_vec = psize; <br/> for (INT I = 0; I <num; I ++, psize_vec ++) <br/> * psize_vec = 0; <br/> cvsparsematiterator mat_iterator; <br/> cvsparsenode * node; <br/> node = cvinitsparsematiterator (similarity ,& Mat_iterator); <br/> for (; node! = 0; node = cvgetnextsparsenode (& mat_iterator) <br/>{< br/> const int * idx = cv_node_idx (similarity, node ); <br/> psize [idx [0] ++; <br/> total ++; <br/>}< br/> RSp = (double *) cvalloc (total * sizeof (RSP [0]); <br/> AVL = (double *) cvalloc (total * sizeof (AVL [0]); <br/> rsp_vec = RSP; <br/> avl_vec = aVL; <br/> nodes = (cvsparsenode2d *) cvalloc (total * sizeof (nodes [0]); <br/> node_entries = (cvsparsenode2 D **) cvalloc (Num * sizeof (node_entries [0]); <br/> psize_vec = psize; <br/> node_entries [0] = nodes; <br/> for (INT I = 1; I <num; I ++, psize_vec ++) <br/> node_entries [I] = node_entries [I-1] + * psize_vec; <br/> node = cvinitsparsematiterator (similarity, & mat_iterator); <br/> for (; node! = 0; node = cvgetnextsparsenode (& mat_iterator), rsp_vec ++, avl_vec ++) <br/>{< br/> * rsp_vec = * avl_vec = 0; <br/> const int * idx = cv_node_idx (similarity, node); <br/> cvsparsenode2d * & node_entry = node_entries [idx [0]; <br/> node_entry-> I = idx [0]; <br/> node_entry-> K = idx [1]; <br/> node_entry-> val = * (double *) cv_node_val (similarity, node); <br/> node_entry ++; <br/>}< br/> cvfree (& node_entries ); <Br/> rspmaxidx = (int *) cvalloc (Num * sizeof (rspmaxidx [0]); <br/> rspmaxval = (double *) cvalloc (Num * sizeof (rspmaxval [0]); <br/> rspmaxval2 = (double *) cvalloc (Num * sizeof (rspmaxval2 [0]); <br/> diagrsp = (double *) cvalloc (Num * sizeof (diagrsp [0]); <br/> for (int K = 0; k <Params-> maxiteration; k ++) <br/>{< br/> cvsparsenode2d * nodes_vec = nodes; <br/> psize_vec = psize; <br/> cvsparsenode2d * nodes _ Vec2 = nodes; <br/> avl_vec = aVL; <br/> rsp_vec = RSP; <br/> for (INT I = 0; I <num; I ++, psize_vec ++) <br/>{< br/> int yk =-1; <br/> double y =-STD: numeric_limits <double >:: max (), y2 =-STD: numeric_limits <double >:: max (); <br/> for (Int J = 0; j <* psize_vec; j ++) <br/>{< br/> double T = nodes_vec2-> Val + * avl_vec; <br/> If (T> Y) <br/>{< br/> Y = T; <br/> yk = nodes_vec2-> K; <br/>} else if (T> Y2) <br/> Y2 = T; <br/> nodes_vec2 ++; <br/> avl_vec ++; <br/>}< br/> for (Int J = 0; j <* psize_vec; j ++) <br/>{< br/> If (nodes_vec-> K! = Yk) <br/> * rsp_vec = * rsp_vec * Lam + (nodes_vec-> Val-y) * _ Lam; <br/> else <br/> * rsp_vec = * rsp_vec * Lam + (nodes_vec-> val-y2) * _ Lam; <br/> nodes_vec ++; <br/> rsp_vec ++; <br/>}< br/> int * rspmaxidx_vec = rspmaxidx; <br/> double * rspmaxval_vec = rspmaxval; <br/> double * rspmaxval2_vec = rspmaxval2; <br/> for (INT I = 0; I <num; I ++, rspmaxidx_vec ++, rspmaxval_vec ++, rspmaxval2_vec ++) <br/>{< br/> * rspmax Idx_vec =-1; <br/> * rspmaxval_vec = 0; <br/> * rspmaxval2_vec = 0; <br/>}< br/> rsp_vec = RSP; <br/> psize_vec = psize; <br/> nodes_vec = nodes; <br/> double * diagrsp_vec = diagrsp; <br/> for (INT I = 0; I <num; I ++, psize_vec ++, diagrsp_vec ++) <br/> for (Int J = 0; j <* psize_vec; j ++) <br/>{< br/> if (I! = Nodes_vec-> K) <br/> {<br/> If (* rsp_vec> rspmaxval [nodes_vec-> K]) <br/>{< br/> rspmaxidx [nodes_vec-> K] = I; <br/> rspmaxval [nodes_vec-> K] = * rsp_vec; <br/>} else if (* rsp_vec> rspmaxval2 [nodes_vec-> K]) <br/> rspmaxval2 [nodes_vec-> K] = * rsp_vec; <br/>} else <br/> * diagrsp_vec = * rsp_vec; <br/> nodes_vec ++; <br/> rsp_vec ++; <br/>}< br/> avl_vec = aVL; <br/> diagrsp_vec = diagrsp; <br/> psize_vec = PSI Ze; <br/> nodes_vec = nodes; <br/> for (INT I = 0; I <num; I ++, psize_vec ++, diagrsp_vec ++) <br/> for (Int J = 0; j <* psize_vec; j ++) <br/>{< br/> double TMP; <br/> if (I! = Nodes_vec-> K) <br/>{< br/> if (I! = Rspmaxidx [nodes_vec-> K]) <br/> TMP = * diagrsp_vec + rspmaxval [nodes_vec-> K]; <br/> else <br/> TMP = * diagrsp_vec + rspmaxval2 [nodes_vec-> K]; <br/> If (TMP> 0) <br/> TMP = 0; <br/>} else <br/> TMP = rspmaxval [nodes_vec-> K]; <br/> * avl_vec = * avl_vec * Lam + TMP * _ Lam; <br/> nodes_vec ++; <br/> avl_vec ++; <br/>}< br/> stop ++; <br/> int * cls_vec = labels-> data. i; <br/> rsp_vec = RSP; <br/> avl_vec = aVL; <br/> psiz E_vec = psize; <br/> nodes_vec = nodes; <br/> for (INT I = 0; I <num; I ++, psize_vec ++, cls_vec ++) <br/>{< br/> int maxidx = I; <br/> double maxval =-STD: numeric_limits <double >:: max (); <br/> for (Int J = 0; j <* psize_vec; j ++) <br/> {<br/> double T = * rsp_vec + * avl_vec; <br/> If (T> maxval) <br/>{< br/> maxval = T; <br/> maxidx = nodes_vec-> K; <br/>}< br/> nodes_vec ++; <br/> rsp_vec ++; <br/> avl_v EC ++; <br/>}< br/> If (* cls_vec! = Maxidx) <br/> stop = 0; <br/> * cls_vec = maxidx; <br/>}< br/> If (stop> Params-> stopcriterion) <br/> break; <br/>}< br/> cvfree (& diagrsp); <br/> cvfree (& rspmaxval2 ); <br/> cvfree (& rspmaxval); <br/> cvfree (& rspmaxidx); </P> <p> cvfree (& RSP ); <br/> cvfree (& AVL); <br/> cvfree (& psize); <br/> cvfree (& nodes); <br/>__ end __; <br/> return stop> Params-> stopcriterion; <br/>}< br/> void <br/> cvapcluster: clear () <br/>{< br/>}< br/> void <br/> cvapcluster: Write (cvfilestorage * FS, <br/> const char * name) <br/>{< br/>}< br/> void <br/> cvapcluster: Read (cvfilestorage * FS, <br/> cvfilenode * root_node) <br/>{< br/>}
Test example
# Include "mlapcluster. H "<br/> # include <iostream> <br/> int main () <br/> {<br/> cvapcparams * Params = new cvapcparams (2000,200, 0.5 ); <br/> cvapcluster * apcluster = new cvapcluster (Params); <br/> // cvmat * Dist = cvcreatemat (25, 25, cv_64fc1 ); <br/> int sizes [] = {25, 25}; <br/> cvsparsemat * Dist = cvcreatesparsemat (2, sizes, cv_64fc1 ); <br/> cvzero (DIST); <br/> freopen ("toyproblemsimilarities.txt", "r", stdin); <br/> double Total = 0; <br/> for (int K = 0; k <25*24; k ++) <br/> {<br/> int I, J; <br/> double D; <br/> STD: CIN> I> j> D; <br/> cvsetreal2d (Dist, I-1, J-1, d ); <br/> total + = D; <br/>}< br/> total =-15.561256; <br/> // Total = total/(25*24 ); <br/> printf ("Preference: % F/N", total); <br/> for (int K = 0; k <25; k ++) <br/> cvsetreal2d (Dist, K, K, total); <br/> cvmat * response = cvcreatemat (1, 25, cv_32sc1); <br/> long T; <br/> T = cvgettickcount (); <br/> apcluster-> train (Dist, response); <br/> T = cvgettickcount ()-T; <br/> printf ("apcluster trained in % LLD Ms. /n ", T/1000000); <br/> for (INT I = 0; I <25; I ++) <br/> printf (" % d ", response-> data. I [I]); <br/> printf ("/N"); <br/> return 0; <br/>}