//Standard void plotNodesAsSpheres(const Eigen::MatrixXf centers, const Eigen::MatrixXf colors, const Eigen::VectorXf& pVis, const Eigen::MatrixXf& stdev, PlotSpheres::Ptr spheres) { int K = centers.rows(); assert(centers.cols() == 3); assert(colors.rows() == K); assert(colors.cols() == 3); assert(pVis.size() == K); assert(stdev.rows() == K); MatrixXf rgba(colors.rows(), 4); rgba << colors.rowwise().reverse(), pVis; VectorXf sizes = stdev.rowwise().mean()/4.0; spheres->plot(util::toVec3Array(centers), util::toVec4Array(rgba), toVec(sizes)); }
int run() { // store cooccurrence in Eigen sparse matrix object REDSVD::SMatrixXf A; const int ncontext = read_cooccurrence(c_cooc_file_name, A, verbose); // read U matrix from file Eigen::MatrixXf V; read_eigen_truncated_matrix(c_input_file_V_name, V, dim); // read S matrix from file Eigen::VectorXf S; read_eigen_vector(c_input_file_S_name, S, dim, 1.0-eig); // checking the dimensions if (V.rows() != ncontext){ throw std::runtime_error("size mismatch between projection V matrix and the number of context words!!"); } // starting projection if (verbose) fprintf(stderr, "Running the projection..."); const double start = REDSVD::Util::getSec(); Eigen::MatrixXf embeddings = A * V * S.asDiagonal().inverse(); if (norm) embeddings.rowwise().normalize(); if (verbose) fprintf(stderr, "done in %.2f.\n",REDSVD::Util::getSec() - start); // write out embeddings const char *c_output_name = get_full_path(c_cooc_dir_name, c_output_file_name); if (verbose) fprintf(stderr, "writing infered word embeddings in %s\n", c_output_name); write_eigen_matrix(c_output_name, embeddings); free((char*)c_output_name); return 0; }
/* return word nearest neighbors in the embedding space */ void getnn(FILE* fout, Eigen::MatrixXf m, const int idx){ // find nearest neighbour Eigen::VectorXf dist = (m.rowwise() - m.row(idx)).rowwise().squaredNorm(); std::vector<int> sortidx = REDSVD::Util::ascending_order(dist); for (int i=1;i<top;i++){ fprintf(fout, "%s, ", tokename[sortidx[i]]); } fprintf(fout, "%s\n", tokename[sortidx[top]]); }
float computeHistogramIntersection (const Eigen::VectorXf &histA, const Eigen::VectorXf &histB) { Eigen::MatrixXf histAB (histA.rows(), 2); histAB.col(0) = histA; histAB.col(1) = histB; Eigen::VectorXf minv = histAB.rowwise().minCoeff(); return minv.sum(); }
void calcMeanAndCovarWeighedVectorized(const Eigen::MatrixXf &input, const Eigen::VectorXd &inputWeights, Eigen::MatrixXf &out_covMat, Eigen::VectorXf &out_mean,Eigen::MatrixXf &temp) { out_mean=input.col(0); //to resize out_mean.setZero(); double wSumInv=1.0/inputWeights.sum(); for (int k=0;k<inputWeights.size();k++){ double w=inputWeights[k]; out_mean+=input.col(k)*(float)(w*wSumInv); } out_mean = input.rowwise().mean(); temp = (input.colwise() - out_mean); for (int k=0;k<inputWeights.size();k++){ temp.col(k) *= (float)(sqrt(inputWeights(k)*wSumInv)); //using square roots, as we only want the normalized weights to be included once for each result element in the multiplication below } out_covMat = temp*temp.transpose(); }
int TestCovariate(Matrix& Xnull, Matrix& Y, Matrix& Xcol, const EigenMatrix& kinshipU, const EigenMatrix& kinshipS){ Eigen::MatrixXf g; G_to_Eigen(Xcol, &g); // store U'*G for computing AF later. const Eigen::MatrixXf& U = kinshipU.mat; this->ug = U.transpose() * g; Eigen::RowVectorXf g_mean = g.colwise().mean(); g = g.rowwise() - g_mean; double gTg = g.array().square().sum(); double t_new = (g.array() * this->transformedY.array()).sum(); t_new = t_new * t_new / gTg; double t_score = t_new / this->gamma; this->betaG = (g.transpose() * this->transformedY).sum() / gTg / this->gamma; this->betaGVar = this->ySigmaY / gTg / this->gamma; this->pvalue = gsl_cdf_chisq_Q(t_score, 1.0); return 0; }
Eigen::MatrixXf centerMatrix(const Eigen::MatrixXf& x) { return x.rowwise() - x.colwise().mean(); }