Advertisement
Guest User

Untitled

a guest
Nov 13th, 2019
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.02 KB | None | 0 0
  1. void Pca()
  2. {
  3. FILE* fp;
  4. fp = fopen("pca2d.txt", "r");
  5. int n, d;
  6. fscanf(fp, "%d %d", &n, &d);
  7. printf("%d %d\n", n, d);
  8. Mat X(n, d, CV_64FC1);
  9. float c[7];
  10.  
  11. for (int i = 0; i < n; i++)
  12. {
  13. fscanf(fp, "%f %f %f %f %f %f %f", &c[0], &c[1], &c[2], &c[3], &c[4], &c[5], &c[6]);
  14. for (int j = 0; j < d; j++)
  15. {
  16. X.at<double>(i, j) = c[j];
  17. }
  18. }
  19. double medie[7] = { 0 };
  20. for (int i = 0; i < d; i++)
  21. {
  22. for (int j = 0; j < n; j++)
  23. {
  24. medie[i] += X.at<double>(j, i);
  25. }
  26. medie[i] /= n;
  27. }
  28.  
  29.  
  30. for (int i = 0; i < d; i++)
  31. {
  32. for (int j = 0; j < n; j++)
  33. {
  34. X.at<double>(j,i) -= medie[i];
  35. }
  36. }
  37. //std::cout << X;
  38. printf("\n");
  39.  
  40. fclose(fp);
  41.  
  42. //calc matrice covarianta
  43. Mat C = X.t()*X / (n - 1);
  44.  
  45. //descompunere in val propri
  46. Mat Lambda, Q;
  47. eigen(C, Lambda, Q);
  48. Q = Q.t();
  49.  
  50. std::cout << "Lamba" << Lambda;
  51.  
  52. //coef PCA
  53. Mat Coef = X*Q;
  54.  
  55. int k= 1;
  56. Mat Coefk(n, k, CV_64FC1);
  57. Mat Qk(d, k, CV_64FC1);
  58.  
  59. //aprox Xk
  60. for (int i = 0; i < d; i++)
  61. {
  62. for (int j = 0; j < k; j++)
  63. {
  64. Coefk.at<double>(i, j) = Coef.at<double>(i, j);
  65. }
  66. }
  67.  
  68. for (int i = 0; i < d; i++)
  69. {
  70. for (int j = 0; j < k; j++)
  71. {
  72. Qk.at<double>(i, j) = Q.at<double>(i, j);
  73. }
  74. }
  75.  
  76. //Qk trans
  77. Mat Qk_t = Qk.t();
  78. Mat XaproxK = X*Qk*Qk_t;
  79. //std::cout << XaproxK;
  80.  
  81.  
  82. double mediaDifAbs = 0;
  83.  
  84. for (int i = 0; i < n; i++) {
  85. for (int j = 0; j < d; j++) {
  86. mediaDifAbs += abs(X.at<double>(i, j) - XaproxK.at<double>(i, j));
  87. }
  88. }
  89. mediaDifAbs /= n*d;
  90. printf("\nMedia dif Abs: %f", mediaDifAbs);
  91.  
  92. //min si max
  93. double minCol, maxCol;
  94. for (int i = 0; i < d; i++)
  95. {
  96. minCol = Coef.at<double>(0,i);
  97. maxCol = Coef.at<double>(0, i);
  98. for (int j = 1; j < n; j++)
  99. {
  100. if (minCol > Coef.at<double>(j,i))
  101. {
  102. minCol = Coef.at<double>(j, i);
  103. }
  104. if (maxCol < Coef.at<double>(j, i))
  105. {
  106. maxCol = Coef.at<double>(j, i);
  107. }
  108. }
  109. }
  110.  
  111. std::cout << "\nMinCol: "<< minCol;
  112. std::cout << "\nMaxCol: "<< maxCol;
  113.  
  114. waitKey(0);
  115.  
  116.  
  117. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement