IntersectionKernelFunction.tcc 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198
  1. /**
  2. * @file IntersectionKernelFunction.cpp
  3. * @brief The intersection kernel function as distance measure between two histograms interpreted as vectors (Implementation)
  4. * @author Alexander Freytag
  5. * @date 08-12-2011 (dd-mm-yyyy)
  6. */
  7. #include "IntersectionKernelFunction.h"
  8. #include <gp-hik-core/SortedVectorSparse.h>
  9. using namespace NICE;
  10. template <typename T>
  11. double IntersectionKernelFunction<T>::measureDistance ( const std::vector<T> & a, const std::vector<T> & b )
  12. {
  13. int size( (int) a.size());
  14. if ((int) b.size() < size)
  15. size = (int) b.size();
  16. double distance(0.0);
  17. for (int i = 0; i < size; i++)
  18. {
  19. if ( a[i] < b[i])
  20. distance += (double) a[i];
  21. else
  22. distance += (double) b[i];
  23. }
  24. return distance;
  25. }
  26. template <typename T>
  27. NICE::Matrix IntersectionKernelFunction<T>::computeKernelMatrix ( const std::vector<std::vector<T> > & X )
  28. {
  29. NICE::Matrix K;
  30. K.resize((int) X.size(), (int) X.size());
  31. double valTmp;
  32. for (int i = 0; i < (int) X.size(); i++)
  33. {
  34. for (int j = i; j < (int) X.size(); j++)
  35. {
  36. valTmp = measureDistance(X[i],X[j]);
  37. //Kernel matrix has to be symmetric
  38. K(i,j) = valTmp;
  39. //kernel-matrix has to be symmetric, but avoid adding twice the value to the main-diagonal
  40. if ( i != j)
  41. K(j,i) = valTmp;
  42. }
  43. }
  44. return K;
  45. }
  46. template <typename T>
  47. NICE::Matrix IntersectionKernelFunction<T>::computeKernelMatrix ( const std::vector<std::vector<T> > & X , const double & noise)
  48. {
  49. NICE::Matrix K(computeKernelMatrix(X));
  50. for (int i = 0; i < (int) X.size(); i++)
  51. K(i,i) += noise;
  52. return K;
  53. }
  54. template <typename T>
  55. NICE::Matrix IntersectionKernelFunction<T>::computeKernelMatrix ( const NICE::FeatureMatrixT<T> & X , const double & noise)
  56. {
  57. NICE::Matrix K;
  58. K.resize(X.get_n(), X.get_n());
  59. K.set(0.0);
  60. //run over every dimension and add the corresponding min-values to the entries in the kernel matrix
  61. for (int dim = 0; dim < X.get_d(); dim++)
  62. {
  63. const std::multimap< double, typename SortedVectorSparse<double>::dataelement> & nonzeroElements = X.getFeatureValues(dim).nonzeroElements();
  64. //compute the min-values (similarities) between every pair in this dimension, zero elements do not influence this
  65. SortedVectorSparse<double>::const_elementpointer it1 = nonzeroElements.begin();
  66. for (; it1 != nonzeroElements.end(); it1++)
  67. {
  68. int i(it1->second.first);
  69. SortedVectorSparse<double>::const_elementpointer it2 = it1;
  70. for (; it2 != nonzeroElements.end(); it2++)
  71. {
  72. int j(it2->second.first);
  73. double val(std::min(it1->second.second, it2->second.second));
  74. K(i,j) += val;
  75. //kernel-matrix has to be symmetric, but avoid adding twice the value to the main-diagonal
  76. if ( i != j)
  77. K(j,i) += val;
  78. } // for-j-loop
  79. } // for-i-loop
  80. }//dim-loop
  81. //add noise on the main diagonal
  82. for (int i = 0; i < (int) X.get_n(); i++)
  83. K(i,i) += noise;
  84. return K;
  85. }
  86. template <typename T>
  87. std::vector<double> IntersectionKernelFunction<T>::computeKernelVector ( const std::vector<std::vector<T> > & X , const std::vector<T> & xstar)
  88. {
  89. std::vector<double> kstar;
  90. kstar.resize((int) X.size());
  91. for (int i = 0; i < (int) X.size(); i++)
  92. {
  93. kstar[i] = measureDistance(X[i], xstar);
  94. }
  95. return kstar;
  96. }
  97. template <typename T>
  98. IntersectionKernelFunction<T>::IntersectionKernelFunction()
  99. {
  100. }
  101. template <typename T>
  102. IntersectionKernelFunction<T>::~IntersectionKernelFunction()
  103. {
  104. }
  105. template <typename T>
  106. double IntersectionKernelFunction<T>::measureDistance ( const NICE::SparseVector & a, const NICE::SparseVector & b )
  107. {
  108. double distance(0.0);
  109. for (NICE::SparseVector::const_iterator itA = a.begin(); itA != a.end(); itA++)
  110. {
  111. NICE::SparseVector::const_iterator itB = b.find(itA->first);
  112. if (itB != b.end())
  113. distance += std::min(itA->second , itB->second);
  114. }
  115. return distance;
  116. }
  117. template <typename T>
  118. NICE::Matrix IntersectionKernelFunction<T>::computeKernelMatrix ( const std::vector<NICE::SparseVector > & X , const double & noise)
  119. {
  120. std::cerr << "compute Kernel Matrix with vector of sparse vectors called " << std::endl;
  121. NICE::Matrix K;
  122. std::cerr << "NICE::Matrix initialized" << std::endl;
  123. std::cerr << "now perform the resize to: "<< X.size() << std::endl;
  124. K.resize(X.size(), X.size());
  125. std::cerr << "NICE::matrix set to size : " << X.size() << std::endl;
  126. K.set(0.0);
  127. std::cerr << "set entries to zero" << std::endl;
  128. std::cerr << "compute Kernel Matrix" << std::endl;
  129. for (int i = 0; i < X.size(); i++)
  130. {
  131. std::cerr << i << " / " << X.size() << std::endl;
  132. for (int j = i; j < X.size(); j++)
  133. {
  134. K(i,j) = measureDistance(X[i],X[j]);
  135. if (i!=j)
  136. K(j,i) = K(i,j);
  137. }
  138. }
  139. std::cerr << "compute kernel matrix done" << std::endl;
  140. //add noise on the main diagonal
  141. for (int i = 0; i < (int) X.size(); i++)
  142. K(i,i) += noise;
  143. return K;
  144. }
  145. template <typename T>
  146. NICE::Vector IntersectionKernelFunction<T>::computeKernelVector ( const std::vector<NICE::SparseVector> & X , const NICE::SparseVector & xstar)
  147. {
  148. NICE::Vector kstar;
  149. kstar.resize((int) X.size());
  150. if (X.size() > 0)
  151. {
  152. for (int i = 0; i < (int) X.size(); i++)
  153. {
  154. kstar[i] = measureDistance(X[i], xstar);
  155. }
  156. }
  157. return kstar;
  158. }
  159. template <typename T>
  160. void IntersectionKernelFunction<T>::sayYourName()
  161. {
  162. std::cerr << "I'm the Intersection Kernel." << std::endl;
  163. }