Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- void Pca()
- {
- FILE* fp;
- fp = fopen("pca2d.txt", "r");
- int n, d;
- fscanf(fp, "%d %d", &n, &d);
- printf("%d %d\n", n, d);
- Mat X(n, d, CV_64FC1);
- float c[7];
- for (int i = 0; i < n; i++)
- {
- fscanf(fp, "%f %f %f %f %f %f %f", &c[0], &c[1], &c[2], &c[3], &c[4], &c[5], &c[6]);
- for (int j = 0; j < d; j++)
- {
- X.at<double>(i, j) = c[j];
- }
- }
- double medie[7] = { 0 };
- for (int i = 0; i < d; i++)
- {
- for (int j = 0; j < n; j++)
- {
- medie[i] += X.at<double>(j, i);
- }
- medie[i] /= n;
- }
- for (int i = 0; i < d; i++)
- {
- for (int j = 0; j < n; j++)
- {
- X.at<double>(j,i) -= medie[i];
- }
- }
- //std::cout << X;
- printf("\n");
- fclose(fp);
- //calc matrice covarianta
- Mat C = X.t()*X / (n - 1);
- //descompunere in val propri
- Mat Lambda, Q;
- eigen(C, Lambda, Q);
- Q = Q.t();
- std::cout << "Lamba" << Lambda;
- //coef PCA
- Mat Coef = X*Q;
- int k= 1;
- Mat Coefk(n, k, CV_64FC1);
- Mat Qk(d, k, CV_64FC1);
- //aprox Xk
- for (int i = 0; i < d; i++)
- {
- for (int j = 0; j < k; j++)
- {
- Coefk.at<double>(i, j) = Coef.at<double>(i, j);
- }
- }
- for (int i = 0; i < d; i++)
- {
- for (int j = 0; j < k; j++)
- {
- Qk.at<double>(i, j) = Q.at<double>(i, j);
- }
- }
- //Qk trans
- Mat Qk_t = Qk.t();
- Mat XaproxK = X*Qk*Qk_t;
- //std::cout << XaproxK;
- double mediaDifAbs = 0;
- for (int i = 0; i < n; i++) {
- for (int j = 0; j < d; j++) {
- mediaDifAbs += abs(X.at<double>(i, j) - XaproxK.at<double>(i, j));
- }
- }
- mediaDifAbs /= n*d;
- printf("\nMedia dif Abs: %f", mediaDifAbs);
- //min si max
- double minCol, maxCol;
- for (int i = 0; i < d; i++)
- {
- minCol = Coef.at<double>(0,i);
- maxCol = Coef.at<double>(0, i);
- for (int j = 1; j < n; j++)
- {
- if (minCol > Coef.at<double>(j,i))
- {
- minCol = Coef.at<double>(j, i);
- }
- if (maxCol < Coef.at<double>(j, i))
- {
- maxCol = Coef.at<double>(j, i);
- }
- }
- }
- std::cout << "\nMinCol: "<< minCol;
- std::cout << "\nMaxCol: "<< maxCol;
- waitKey(0);
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement