Tôi có 65 mẫu dữ liệu 21 chiều (được dán ở đây ) và tôi đang xây dựng ma trận hiệp phương sai từ nó. Khi được tính trong C ++, tôi nhận được ma trận hiệp phương sai được dán ở đây . Và khi được tính toán trong MATLAB từ dữ liệu (như được hiển thị bên dưới), tôi nhận được ma trận hiệp phương sai được dán ở đây
Mã Matlab để tính toán cov từ dữ liệu:
data = csvread('path/to/data');
matlab_cov = cov(data);
Như bạn có thể thấy sự khác biệt trong ma trận hiệp phương sai là phút (~ e-07), điều này có thể là do các vấn đề về số trong trình biên dịch sử dụng số học dấu phẩy động.
Tuy nhiên, khi tôi tính ma trận hiệp phương sai giả từ ma trận hiệp phương sai được tạo bởi matlab và ma trận được tạo bởi mã C ++ của tôi, tôi nhận được kết quả rất khác nhau. Tôi đang tính toán chúng theo cùng một cách tức là:
data = csvread('path/to/data');
matlab_cov = cov(data);
my_cov = csvread('path/to/cov_file');
matlab_inv = pinv(matlab_cov);
my_inv = pinv(my_cov);
Sự khác biệt là rất lớn đến nỗi khi tôi tính toán khoảng cách mahalanobis từ một mẫu (dán ở đây ) đến phân phối của 65 mẫu bằng cách:
sử dụng các ma trận hiệp phương sai khác nhau ( ) Tôi nhận được các kết quả khác nhau rộng rãi, ví dụ:
(65/(64^2))*((sample-sample_mean)*my_inv*(sample-sample_mean)')
ans =
1.0167e+05
(65/(64^2))*((sample-sample_mean)*matlab_inv*(sample-sample_mean)')
ans =
109.9612
Có phải bình thường đối với sự khác biệt nhỏ (e-7) trong ma trận hiệp phương sai có ảnh hưởng như vậy đến việc tính toán ma trận nghịch đảo giả? Và nếu vậy, tôi có thể làm gì để giảm thiểu hiệu ứng này?
Không thực hiện được điều này, có bất kỳ số liệu khoảng cách nào khác mà tôi có thể sử dụng không liên quan đến hiệp phương sai không? Tôi sử dụng khoảng cách Mahalanobis như chúng ta biết đối với n mẫu nó tuân theo phân phối beta, mà tôi sử dụng để kiểm tra giả thuyết
Rất cám ơn trước
EDIT: Thêm mã C ++ để tính ma trận hiệp phương sai bên dưới:
Biểu vector<vector<double> >
diễn tập hợp các hàng từ tệp được dán.
Mat covariance_matrix = Mat(21, 21, CV_32FC1, cv::Scalar(0));
for(int j = 0; j < 21; j++){
for(int k = 0; k < 21; k++){
for(std::vector<vector<double> >::iterator it = data.begin(); it!= data.end(); it++){
covariance_matrix.at<float>(j,k) += (it->at(j) - mean.at(j)) * (it->at(k) - mean[k]);
}
covariance_matrix.at<float>(j,k) /= 64;
}
}