X-Git-Url: https://git.donarmstrong.com/?a=blobdiff_plain;f=linearalgebra.cpp;h=39e0848003245351d86e9ed1fe1b1c238ff77213;hb=e6c4a7223199d800d496356604eb34dfe273673d;hp=6b56597f10501b4720d77b28ca08961d2c35554e;hpb=41f654a317afba7f4dba3fcd0a6557773528845a;p=mothur.git diff --git a/linearalgebra.cpp b/linearalgebra.cpp index 6b56597..39e0848 100644 --- a/linearalgebra.cpp +++ b/linearalgebra.cpp @@ -329,45 +329,79 @@ vector< vector > LinearAlgebra::calculateEuclidianDistance(vector< vecto double LinearAlgebra::calcPearson(vector< vector >& euclidDists, vector< vector >& userDists){ try { + /* euclidDists.clear(); + userDists.clear(); + + euclidDists.resize(1); + userDists.resize(1); + + userDists[0].push_back(0.3070833); + userDists[0].push_back(0.3244475); + userDists[0].push_back(0.6055993); + userDists[0].push_back(0.3372481); + userDists[0].push_back(0.9151715); + userDists[0].push_back(0.6182255); + userDists[0].push_back(0.7748142); + userDists[0].push_back(0.08554735); + userDists[0].push_back(0.6343481); + userDists[0].push_back(0.4049274); + + euclidDists[0].push_back(0.3342815); + euclidDists[0].push_back(0.3173829); + euclidDists[0].push_back(0.6852404); + euclidDists[0].push_back(0.7819186); + euclidDists[0].push_back(0.5705242); + euclidDists[0].push_back(0.8007263); + euclidDists[0].push_back(0.8561724); + euclidDists[0].push_back(0.4901089); + euclidDists[0].push_back(0.7027247); + euclidDists[0].push_back(0.7669696);*/ + + //find average for - X + int count = 0; vector averageEuclid; averageEuclid.resize(euclidDists.size(), 0.0); for (int i = 0; i < euclidDists.size(); i++) { for (int j = 0; j < euclidDists[i].size(); j++) { averageEuclid[i] += euclidDists[i][j]; + count++; } } - for (int i = 0; i < averageEuclid.size(); i++) { averageEuclid[i] = averageEuclid[i] / (float) euclidDists.size(); } - + for (int i = 0; i < averageEuclid.size(); i++) { averageEuclid[i] = averageEuclid[i] / (float) count; } + //find average for - Y + count = 0; vector averageUser; averageUser.resize(userDists.size(), 0.0); for (int i = 0; i < userDists.size(); i++) { for (int j = 0; j < userDists[i].size(); j++) { - averageUser[i] += userDists[i][j]; + averageUser[i] += userDists[i][j]; + count++; } } - for (int i = 0; i < averageUser.size(); i++) { averageUser[i] = averageUser[i] / (float) userDists.size(); } - + for (int i = 0; i < averageUser.size(); i++) { averageUser[i] = averageUser[i] / (float) count; } + double numerator = 0.0; double denomTerm1 = 0.0; double denomTerm2 = 0.0; for (int i = 0; i < euclidDists.size(); i++) { - for (int k = 0; k < i; k++) { + for (int k = 0; k < euclidDists[i].size(); k++) { float Yi = userDists[i][k]; float Xi = euclidDists[i][k]; - numerator += ((Xi - averageEuclid[k]) * (Yi - averageUser[k])); - denomTerm1 += ((Xi - averageEuclid[k]) * (Xi - averageEuclid[k])); - denomTerm2 += ((Yi - averageUser[k]) * (Yi - averageUser[k])); + numerator += ((Xi - averageEuclid[i]) * (Yi - averageUser[i])); + denomTerm1 += ((Xi - averageEuclid[i]) * (Xi - averageEuclid[i])); + denomTerm2 += ((Yi - averageUser[i]) * (Yi - averageUser[i])); } } double denom = (sqrt(denomTerm1) * sqrt(denomTerm2)); double r = numerator / denom; - + return r; + } catch(exception& e) { m->errorOut(e, "LinearAlgebra", "calculateEuclidianDistance");