| 644 | } |
| 645 | |
| 646 | std::vector<float> ClusterAnalyzer::cohesion(const std::vector<std::vector<Size> > & clusters, const DistanceMatrix<float> & original) |
| 647 | { |
| 648 | if (clusters.empty() || clusters.size() > original.dimensionsize()) |
| 649 | { |
| 650 | throw Exception::InvalidParameter(__FILE__, __LINE__, OPENMS_PRETTY_FUNCTION, "invalid clustering"); |
| 651 | } |
| 652 | |
| 653 | float av_dist(0); // average of all pairwise distances |
| 654 | for (Size i = 0; i < original.dimensionsize(); ++i) |
| 655 | { |
| 656 | for (Size j = i + 1; j < original.dimensionsize(); ++j) |
| 657 | { |
| 658 | av_dist += original.getValue(i, j); |
| 659 | } |
| 660 | } |
| 661 | av_dist /= (((float)original.dimensionsize() * (float)(original.dimensionsize() - 1.0)) / 2.0f); |
| 662 | |
| 663 | std::vector<float> cohesions; |
| 664 | cohesions.reserve(clusters.size()); |
| 665 | for (Size i = 0; i < clusters.size(); ++i) |
| 666 | { |
| 667 | float av_c_dist(0); // all pairwise distances in cluster i |
| 668 | for (Size j = 0; j < clusters[i].size(); ++j) |
| 669 | { |
| 670 | for (Size k = 0; k < j; ++k) |
| 671 | { |
| 672 | av_c_dist += original.getValue(clusters[i][j], clusters[i][k]); |
| 673 | } |
| 674 | } |
| 675 | |
| 676 | av_c_dist /= (((float)clusters[i].size() * (float)(clusters[i].size() - 1.0)) / 2.0f); //now av. intra cluster distance |
| 677 | if (clusters[i].size() == 1) |
| 678 | { |
| 679 | av_c_dist = av_dist; |
| 680 | } |
| 681 | //~ std::cout << " av clu i " << av_c_dist << std::endl; |
| 682 | cohesions.push_back(av_c_dist); |
| 683 | } |
| 684 | return cohesions; |
| 685 | } |
| 686 | |
| 687 | String ClusterAnalyzer::newickTree(const std::vector<BinaryTreeNode> & tree, const bool include_distance) |
| 688 | { |
no test coverage detected