C ++ PCA — Расчет ковариации MATRIX

Я пытаюсь вычислить ковариацию (матрицу) вектора в C ++ …

Я выполнил следующее:

std::vector<std::vector<double> > data = { {2.5, 2.4}, {0.5, 0.7} };

Затем я вычислил и вычел среднее значение, что дало следующий результат:

data = { {0.05, -0.05}, {-0.1, 0.1} }

Насколько я знаю, следующий шаг — это транспонировать матрицу, умножить начало координат, взять сумму и, наконец, разделить на измерения X — 1 ..

Я написал следующее:

void cover(std::vector<std::vector<double> > &d)
{
double cov = 0.0;

for(unsigned i=0; (i < d.size()); i++)
{
for(unsigned j=0; (j < d[i].size()); j++)
{
cov += d[i][j] * d[j][i] / (d[i].size() - 1);
std::cout << cov << " ";
}
std::cout << std::endl;
}
}

куда d вектор после вычитания среднего значения из каждой точки
Что дает мне результат:

0.0025, 0.0075
0.0125, 0.0225

Где по сравнению с Matlab:

2.0000    1.7000
1.7000    1.4450

У кого-нибудь есть идеи, куда я иду не так?

Спасибо

1

Решение

Это утверждение:

Насколько я знаю, следующий шаг — это транспонировать матрицу, умножить начало координат, взять сумму и, наконец, разделить на измерения X — 1 ..

И эта реализация:

cov += d[i][j] * d[j][i] / (d[i].size() - 1);

Не говорите то же самое. На основании определения Вот:

void outer_product(vector<double> row, vector<double> col, vector<vector<double>>& dst) {
for(unsigned i = 0; i < row.size(); i++) {
for(unsigned j = 0; j < col.size(); i++) {
dst[i][j] = row[i] * col[j];
}
}
}

//computes row[i] - val for all i;
void subtract(vector<double> row, double val, vector<double>& dst) {
for(unsigned i = 0; i < row.size(); i++) {
dst[i] = row[i] - val;
}
}

//computes m[i][j] + m2[i][j]
void add(vector<vector<double>> m, vector<vector<double>> m2, vector<vector<double>>& dst) {
for(unsigned i = 0; i < m.size(); i++) {
for(unsigned j = 0; j < m[i].size(); j++) {
dst[i][j] = m[i][j] + m2[i][j];
}
}
}

double mean(std::vector<double> &data) {
double mean = 0.0;

for(unsigned i=0; (i < data.size());i++) {
mean += data[i];
}

mean /= data.size();
return mean;
}

void scale(vector<vector<double>> & d, double alpha) {
for(unsigned i = 0; i < d.size(); i++) {
for(unsigned j = 0; j < d[i].size(); j++) {
d[i][j] *= alpha;
}
}
}

Итак, учитывая эти определения, мы можем вычислить значение для ковариационной матрицы.

void compute_covariance_matrix(vector<vector<double>> & d, vector<vector<double>> & dst) {
for(unsigned i = 0; i < d.size(); i++) {
double y_bar = mean(d[i]);
vector<double> d_d_bar(d[i].size());
subtract(d[i], y_bar, d_d_bar);
vector<vector<double>> t(d.size());
outer_product(d_d_bar, d_d_bar, t);
add(dst, t, dst);
}
scale(dst, 1/(d.size() - 1));
}
3

Другие решения

Я думаю, может быть, для цикла в outer_product это не правильно:

void outer_product(vector<double> row, vector<double> col, vector<vector<double>>& dst) {
for(unsigned i = 0; i < row.size(); i++) {
for(unsigned j = 0; j < col.size(); i++) {
dst[i][j] = row[i] * col[j];
}
}

я изменю я ++ -> j ++

0

По вопросам рекламы [email protected]